Category Archives: Patterns & Practices

O signaturách metod a DTO a jak je psát [Lukáš Michl, Vzdělávací okénko, 4.12.2025]

Záznam ze Vzdělávacího okénka HAVIT, kde Lukáš Michl povídal o tom, jak psát signatury metod a DTO tak, aby byl kód srozumitelný bez nutnosti číst implementaci. Přednáška pokrývá antipattern primitive type obsession, strong type values, knihovnu Vogen a best practices pro DTO.

Proč záleží na čitelných signaturách

Dobrá signatura metody prozradí, co metoda dělá, aniž by bylo nutné číst její tělo. To je klíčové pro udržovatelnost – kód se k němu vrací za dny, týdny i roky, a čím méně překvapení signatura skrývá, tím méně chyb při refaktorování vzniká. Lukáš ukazuje sérii příkladů z reálných projektů, kde nejasné signatury vedly k neočekávanému chování.

Primitive type obsession antipattern

Používání primitivních typů (string, int) všude, kde by měl být byznysový typ, vede k nejasnostem: co přesně parametr string name očekává? Je to jméno ve formátu AD, nebo zobrazované jméno? Může být null? Může být prázdný? Tyto otázky se násobí pro každé volání metody. Podobný problém nastává u ID entit – pokud jsou UserID, LoginID i EntityID reprezentovány jako int, záměna při refaktorování neprojde kompilátorem a může tiše způsobit datovou chybu.

Nullable reference types

Zapnutí nullable reference types (#nullable enable) je prvním krokem ke čitelnějším signaturám – kompilátor okamžitě sdělí, zda parametr nebo návratová hodnota může být null. Samo o sobě to ale nestačí, pokud jsou parametry stále primitivní typy bez byznysového kontextu.

Strong type values a value objects

Řešením primitive type obsession jsou strong type values – vlastní typy obalující primitivní hodnotu a nesoucí byznysový kontext i validaci. Implementují se jako C# record struct, čímž se předchází dvojité alokaci na heapu. Validace v konstruktoru zajistí, že nevalidní hodnota vůbec nevznikne – testy kontraktu pak stačí napsat jednou u definice typu, ne u každého volání metody.

Knihovna Vogen

Vogen je source-generátorová knihovna, která automaticky generuje plnohodnotné strong-typed hodnoty – včetně serializace JSON, podpory Entity Framework a možnosti přidávat validace. Bez ní by bylo ruční psaní pro stovky byznysových typů v projektu neúnosné; s Vogen stačí jedna řádka atributu nad definicí.

Strong Typed ID

Specifickým případem jsou ID entit. Knihovna StronglyTypedId řeší záměnu identifikátorů různých entit na úrovni typového systému – kompilátor odmítne předat UserId tam, kde se očekává OrderId.

DTO best practices

Suffix DTO v názvu třídy je kontrakt: objekt by měl být immutable a sloužit výhradně k přenosu dat. Lukáš doporučuje vlastnosti deklarovat s required init – přidání nové vlastnosti pak okamžitě způsobí chybu kompilace u všech míst, kde se DTO inicializuje, a zabrání tiché inicializaci výchozími hodnotami. Kombinace s konstruktorovým zápisem navíc zajistí, že kolega přistupující ke kódu poprvé okamžitě vidí, co všechno DTO nese.

Web Accessibility a EAA [Michal Melena, Vzdělávací okénko, 15.5.2025]

Záznam Vzdělávacího okénka HAVIT z 15. května 2025, kdy nám Michal Melena povídal o Accessibility a aktuálních povinnostech webových aplikací v této oblasti.

Exception types – kdy který použít [Vzdělávací okénko, 10.4.2025]

  • NotImplementedException – výhradně během vývoje jako TODO
  • NullReferenceException – nikdy nevyhrazujeme explicitně, výhradně vyhazováno runtimem
  • NotSupportedException – explicitně indikujeme, že o use-case víme, ale není řešen
  • InvalidOperationException – „nemělo by v produkci nastat“, chyba vývoje (nesprávné volání , switch nad nečekanou hodnotou enum, …)
  • ArgumentNullException, ArgumentOutOfRangeException – výhradně přímé argumenty (ne arg1.Property != null)
  • ArgumentException – obecný problém s argumentem/-y (bližší specifikace v Message)
  • ContractFailedException – default pro Contract.Requires(cond), Contract.Assert(cond), …
  • Exception – nedoporučuje se vyhazovat, mělo být spíše abstract, použijte potomky
  • OperationFailedException – indikace chyby do UI (specficiké pro Havit.Blazor stack)
  • ApplicationException – deprecated

Záznam ze Vzdělávacího okénka HAVIT z 10. dubna 2025.

Azure App Configuration a Azure KeyVault – záznam [Ondřej Václavek, Global Azure Prague 2024]

Záznam z přednášky pro konferenci Global Azure Prague 2024, kde Ondřej Václavek ukazoval možnosti služeb pro konfiguraci aplikací.

C# & Code Conventions [Jiří Kanda, Vzdělávací okénko, 20.9.2023]

Záznam ze Vzdělávacího okénka HAVIT, kde Jirka Kanda ukazoval, jaké v HAVITu máme coding-standardy a konvence v C# kódu.

Novinky v C# 11, [ASP].NET 7 a Blazor – záznam, slides a dema [Robert Haken, FreshIT Praha 2023]

Záznam z přednášky pro konferenci FreshIT Praha z 30. března 2023, kde jsem povídal o novinkách v platformě .NET v poslední verzi 7.

Dema

Slides

Havit.Blazor – založení projektu z šablony [Robert Haken, Vzdělávací okénko, 22.3.2023]

Záznam ze Vzdělávacího okénka HAVIT z 22.3.2023.
Povídal jsem o založení nového projektu (solution) z šablony https://github.com/havit/NewProjectTemplate-Blazor.

Podrobnosti o Havit.Blazor stacku viz záznam přednášky pro WUG Zlín.

Havit.Blazor stack podrobněji – záznam z WUG Zlín [Robert Haken, 28.2.2023]

Záznam z přednášky pro komunitní setkání WUG Zlín z 28. února 2023. Povídal jsem o uspořádání Havit.Blazor stacku (šablona https://github.com/havit/NewProjectTemplate-Blazor) a proč je uspořádaný, tak jak je.

Slides (PDF):

Havit.Blazor stack – záznam z WUG Days 2023.1

Záznam z přednášky pro konferenci WUG Days 2023.1 v Brně z 30. ledna 2023. Povídal jsem o uspořádání Havit.Blazor stacku (šablona https://github.com/havit/NewProjectTemplate-Blazor) a proč je uspořádaný, tak jak je.

Slides (PDF):

Unit testing v .NET od A do Z – záznam, slides a dema [TechEd Praha 2021]

Záznam z přednášky pro konferenci TechEd DevCon Praha ze 19. května 2021, kde jsem povídal o Unit testingu:

  • Unit-testing
  • Proč unit-testing?
  • Good unit-test
  • Best-practices
  • Dependencies
  • Mocking
  • Test smell
  • Techniques & Tips
  • Test-Driven-Development [TDD]

Konference probíhala on-line.

Dema: https://github.com/hakenr/UnitTestingDemo

Slides