Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Class Diagram'dan Koda ve Koddan Diyagrama: Domain Model, Design Model ve puml-gen
Domain model iş dünyasının kavramlarını tipsiz ve operation'sız gösterir, design class diagram ise aynı vakanın C#'a yakın tasarım kararlarını; ilki elle çizilir, ikincisinin dilimleri koda dökülür ve puml-gen gibi araçlarla koddan üretilen diyagramlar yalnız gözlem ve drift kontrolü için kullanılır. Yazıda İK Portalı'nın izin modülü diyagramdan EF Core configuration'ına ve DDL'e, oradan da puml-gen ile tekrar PlantUML'e taşınıyor.
Class Diagram 2: Association, Aggregation, Composition, Generalization ve Dependency — C# Karşılıklarıyla
Association kalıcı bir bağdır ve C#'ta navigation property olur; composition'da parça tek sahibe aittir ve onunla silinir, EF Core'da owned/complex type ya da cascade delete'tir; aggregation'ın UML 2.5.1'de kesin bir anlamı yoktur. Altı ilişkinin notasyonu ve C# karşılığı, EF Core'un zorunlu ilişkilerdeki cascade varsayılanı, qualified association ve Approval'ın association class'tan ayrı bir class'a yükselmesi.
Class Diagram 1: Class, Attribute, Operation, Visibility, Multiplicity ve Stereotype'lar
Class diagram'daki her işaret kodda bir karardır: [0..1] nullable tip, [0..*] collection, eğik çizgi hesaplanan property, altı çizili satır static üye, {readOnly} hiç değişmeyen property demektir. Class kutusunun üç bölmesi, attribute ve operation söz dizimi, C# ile örtüşmeyen visibility köşeleri, interface, enumeration, data type ve stereotype'lar ile aynı diyagramın Mermaid hâli.
Use Case Diagram ve Use Case Spesifikasyonu: Actor, include, extend ve Cockburn Şablonu
Use case diagram sistemi dışarıdan gösterir: actor'lar rol, use case'ler hedeftir; include ok ile ana use case'ten zorunlu adıma, extend ok ile koşullu eklentiden ana use case'e gider. İK Portalı izin modülünün use case diagram'ı, Cockburn'ün fully dressed şablonuyla İzin Talep Et spesifikasyonu, use case'ten user story ve API endpoint'ine eşleme ve Mermaid ile aynı diyagram.
Requirement'tan Diyagrama: Hangi Soru Hangi Diyagramla Cevaplanır?
Her diyagram bir soruyu cevaplar: kim ne yapar sorusunu use case, hangi kavramlar sorusunu class, kim kimi çağırır sorusunu sequence, object hangi durumlardan geçer sorusunu state machine diagram'ı cevaplar. İK Portalı İzin Talebi modülünün requirement metni, isim, fiil ve koşullardan aday class, use case ve guard çıkarmak, hedef kitleye göre detay seviyesi ve serinin haritası.
UML Nedir? Kısa Tarih, UML 2.5.1'in 14 Diyagramı ve Gerçekte Hangilerini Kullanırsın
UML, kodun içine dağılmış modeli herkesin aynı okuduğu bir notasyonla ortaya koyan, OMG'nin standart modelleme dilidir; güncel sürümü 2017 tarihli UML 2.5.1'dir ve 7 structure, 7 behavior olmak üzere 14 diyagram tanımlar. Method savaşlarından bugüne kısa tarih, sahada gerçekten kullanılan diyagramlar, model ile diyagram farkı ve Fowler'ın sketch, blueprint, programming language modları.
GoF Dışında Bilmen Gereken Kod Seviyesi Pattern'ler: Null Object, Specification, Result ve Pipeline
GoF kataloğunda olmayan dört pattern günlük C# kodunda sürekli işe yarar: Null Object ve Special Case "yok" durumunu davranışı olan bir object'e çevirip null kontrollerini kaldırır, Specification iş kuralını EF Core'un SQL'e çevirebileceği birleştirilebilir bir Expression olarak taşır, Result adımları Then ile hata akışına bağlar, Pipeline da dönüşümleri sıralı filter'lara böler. Func ile yazılan kuralın bütün tabloyu çekmesi, ExpressionVisitor ile parametre birleştirme ve Options pattern.
Anti-Pattern'ler: God Object, Service Locator, Singleton Abuse, Anemic Domain Model ve Pattern Hastalığı
Anti-pattern, ilk bakışta makul görünen ama aynı sıkıntıyı tekrar tekrar üreten bir çözümdür ve tanımak, onu daha iyi bir yapıya taşıyan refactoring'i de bilmek demektir. Service Locator'ın ValidateOnBuild'den kaçırdığı bağımlılık, CA1506 ile ölçülen God Object, sıraya göre kırılan singleton test'leri, kuralı atlanan anemic model, Golden Hammer, Lava Flow, Poltergeist ve patternitis.
Visitor Pattern: Double Dispatch, ExpressionVisitor ve Pattern Matching ile Karşılaştırma
Visitor, C#'ın tek boyutlu virtual dispatch'ini Accept ve Visit çağrılarıyla ikiye katlayarak sabit bir tip hiyerarşisine element'lere dokunmadan yeni işlemler eklemeyi sağlar; bedeli, yeni bir tipin bütün visitor'ları kırmasıdır. Overload seçiminin static tip tuzağı, expression problem, ExpressionVisitor ve Roslyn CSharpSyntaxWalker, ve exhaustiveness kontrolü olmayan switch expression ile karşılaştırma.
Template Method Pattern: Algoritma İskeleti, Hook'lar ve Delegate'li Alternatifi
Template Method, algoritmanın iskeletini base class'taki override edilemeyen bir method'a sabitler ve değişen adımları abstract method'lara ya da boş hook'lara bırakır. Unutulan override'ın sessizce yutulan hook'u (CS0114), Stream.CopyTo ve .NET 10'da davranışı değişen BackgroundService.ExecuteAsync, constructor'dan virtual çağrı tuzağı (CA2214) ve aynı akışı delegate'lerle composition ile kurmak.
Strategy Pattern Derinlemesine: Keyed Services, IEnumerable<IStrategy> ve Func ile Runtime Seçim
Strategy'yi yazmak kolay, zor olan doğru strategy'yi runtime'da seçmek: keyed services tek bir key'le, IEnumerable<IStrategy> ve CanHandle object'in birden fazla özelliğine bakarak, Dictionary<string, Func<>> ise bağımlılığı olmayan formüllerde en az törenle seçer. Kayıt sırasının sessizce fiyat değiştirmesi, keyed kayıtların GetServices'te görünmemesi ve BCL'deki IComparer ile StringComparer örnekleri.
State Pattern: Sipariş Durumlarını switch Yerine State Object'leriyle Yönetmek
State pattern, durumla değişen davranışı her method'daki switch'ten alıp durum başına bir class'a taşır; base class'ın varsayılan cevabı "izin yok" olunca unutulan bir durum sessiz bir hata değil, gürültülü bir exception olur. Yeni eklenen OnHold durumunun kargoya izin verdiği naif koddan başlayıp state class'larını, derleyicinin async state machine'ini, tuple pattern'li switch expression alternatifini ve EF Core'da enum kolondan state object'ini yeniden kurmayı gerçek çıktılarla görüyoruz.