İçeriğe atla

Alan odaklı tasarım

Vikipedi, özgür ansiklopedi

Alan Odaklı Tasarım (DDD), yazılımı iş alanına uygun modellemeye odaklanan başlıca bir yazılım tasarımı yaklaşımıdır.[1] Bu yaklaşım, iş alanındaki uzmanların katkılarına göre bir alan oluşturmayı hedefler.[2] DDD, tek bir birleşik model fikrine karşıdır; bunun yerine büyük bir sistemi, her biri kendi modeline sahip olan sınırlı bağlamlara ayırır.[3][4]

Domain-driven design'da, yazılım kodunun yapısı ve dili (sınıf isimleri, sınıf metotları, sınıf değişkenleri) iş alanına uygun olmalıdır. Örneğin, yazılım kredi başvurularını işliyorsa, "kredi başvurusu", "müşteriler" gibi sınıflara ve "teklif kabul et" ve "geri çek" gibi metodlara sahip olabilir.

Alan Odaklı Tasarım, şu hedeflere dayanır:

Projenin birincil odağını çekirdek alan ve alan mantığı katmanına yerleştirmek; karmaşık tasarımları iş alanının bir modeline dayandırmak; teknik ve alan uzmanları arasında yaratıcı bir işbirliği başlatarak belirli alan problemlerini ele alan kavramsal bir modeli iteratif olarak geliştirmek. Domain-driven design eleştirmenleri, geliştiricilerin modeli saf ve yararlı bir yapıda tutmak için genellikle çok fazla izolasyon ve kapsülleme uygulamaları gerektiğini savunur. Domain-driven design, sürdürülebilirlik gibi faydalar sağlarken, Microsoft bu modeli yalnızca modelin iş alanının ortak anlayışını net bir şekilde sağladığı karmaşık alanlar için önerir.[5]

Bu terim, Eric Evans tarafından 2003 yılında yayımlanan aynı isimli kitabında ortaya atılmıştır.[6]

Alan Odaklı Tasarım, çeşitli üst düzey kavramları ve uygulamaları tanımlar.[6]

En önemli kavramlardan biri, yazılımın domainidir; yani kullanıcının bir programı uyguladığı konu alanı. Yazılım geliştiricileri, bu domain'in seçilmiş yönlerini tanımlayan ve o domain ile ilgili sorunları çözmek için kullanılabilecek bir domain modeli oluşturur.

Alan Odaklı Tasarımın bu yönleri, domain uzmanları, kullanıcılar ve geliştiriciler arasında paylaşılan yaygın bir dil oluşturmayı amaçlar—bu dile ubiquitous language denir. Ubiquitous language, domain modelinde ve sistem gereksinimlerini tanımlamak için kullanılır.

Ubiquitous language, DDD'nin stratejik tasarım ve taktiksel tasarım ile birlikte temel dayanaklarından biridir.

Alan Odaklı Tasarımda, domain katmanı, nesne yönelimli bir çok katmanlı mimarideki ortak katmanlardan biridir.

Şablon:Kaynaks needed Alan Odaklı Tasarım, çeşitli model türlerini tanır. Örneğin, bir entity, özellikleri ile değil, kimliği ile tanımlanan bir nesnedir. Örneğin, çoğu havayolu, her uçuşta koltuklara benzersiz bir numara atar: bu, koltuğun kimliğidir. Buna karşılık, bir değer nesnesi ise özellikler içeren ancak kavramsal bir kimliği olmayan bir değişmez nesnedir. Örneğin, insanlar kartvizit değiş tokuş ettiğinde, her benzersiz kartı ayırt etmeye çalışmaktan ziyade sadece kart üzerindeki bilgilere (özelliklerine) önem verirler.

Modeller ayrıca olaylar (geçmişte olmuş bir şey) tanımlayabilir. Bir domain olayı, domain uzmanlarının ilgilendiği bir olaydır. Modeller, bir kök entity ile bağlanarak aggregate haline gelebilir. Aggregate dışındaki nesneler, köke referans tutabilir ancak aggregate içindeki diğer nesnelere referans tutamaz. Aggregate kökü, aggregate içindeki değişikliklerin tutarlılığını denetler. Örneğin, sürücüler bir arabayı her bir tekerleği ayrı ayrı kontrol etmek zorunda değildir; sadece arabayı sürerler. Bu bağlamda araba, diğer birçok nesnenin (motor, frenler, farlar vb.) bir aggregate'idir.

Modellerle Çalışma

[değiştir | kaynağı değiştir]

Alan Odaklı Tasarımda, bir nesnenin oluşturulması genellikle o nesnenin kendisinden ayrıdır.

Örneğin, bir repository, bir veri deposundan (ör. bir veritabanı) domain nesnelerini almak için metodlara sahip bir nesnedir. Benzer şekilde, bir factory, doğrudan domain nesneleri oluşturmak için metodlara sahip bir nesnedir.

Bir programın işlevselliğinin bir parçası kavramsal olarak hiçbir nesneye ait değilse, genellikle bir servis olarak ifade edilir.

Diğer Fikirlerle İlişki

[değiştir | kaynağı değiştir]

Bir bounded context, bir mikroservise benzer.[7]

Alan Odaklı Tasarım, doğrudan nesne yönelimli yaklaşımlarla ilişkili olmamasına rağmen, pratikte bu tekniklerin avantajlarını kullanır. Bunlar arasında, komutları/metod çağrılarını alan entity/aggregate kökleri, en başta aggregate kökleri içinde durumun kapsüllenmesi ve daha yüksek mimari seviyelerde bounded context'ler bulunur.

Bu nedenle, Alan Odaklı Tasarım genellikle Plain Old Java Objects ve Plain Old CLR Objects ile ilişkilendirilir; bunlar sırasıyla Java ve .NET Framework'e özgü teknik uygulama detaylarıdır. Bu terimler, domain nesnelerinin daha spesifik bir teknoloji çerçevesi yerine, iş alanının davranışlarıyla tanımlanması gerektiğine yönelik bir görüşü yansıtır.

Benzer şekilde, naked objects deseni, kullanıcı arayüzünün yeterince iyi bir domain modelinin doğrudan bir yansıması olabileceğini savunur. Kullanıcı arayüzünün domain modelinin doğrudan bir yansıması olmasını zorunlu kılmak, daha iyi bir domain modelinin tasarımını teşvik edecektir.[8]

Alan Odaklı Tasarım, yazılım geliştirme için diğer yaklaşımları da etkilemiştir.

Örneğin, Alan'a özgü modelleme, alan'a özgü dillerle gerçekleştirilen Alan Odaklı Tasarım uygulamasıdır. Alan Odaklı Tasarım, özellikle bir alan'a özgü dil kullanımını gerektirmez; ancak, bir alan'a özgü dili tanımlamaya yardımcı olmak ve alan'a özgü multimodellemeyi desteklemek için kullanılabilir.

Ayrıca, aspect-oriented programming (AOP), teknik konuları (güvenlik, işlem yönetimi, günlükleme gibi) bir domain modelinden ayırmayı kolaylaştırarak, domain modelinin sadece iş mantığına odaklanmasını sağlar.

Model Tabanlı Mühendislik ve Mimari

[değiştir | kaynağı değiştir]

Alan Odaklı Tasarım, model tabanlı mühendislik ve model tabanlı mimari ile uyumlu olmakla birlikte,[9] iki kavramın amacı farklıdır. Model tabanlı mimari, daha iyi domain modelleri tanımlamaktan ziyade bir modeli farklı teknoloji platformlarına dönüştürmeye odaklanır.

Ancak, model tabanlı mühendislik tarafından sunulan teknikler (domain'leri modellemek, domain uzmanları ve geliştiriciler arasında iletişimi kolaylaştırmak için alan'a özgü diller oluşturmak gibi...) Alan Odaklı Tasarımı pratikte kolaylaştırır ve uygulayıcıların modellerinden daha fazla fayda sağlamalarına yardımcı olur. Model tabanlı mühendisliğin model dönüştürme ve kod oluşturma teknikleri sayesinde, domain modeli, onu yönetecek olan gerçek yazılım sistemini oluşturmak için kullanılabilir.[10]

Komut ve Sorgu Sorumluluğu Ayrımı

[değiştir | kaynağı değiştir]

Komut ve Sorgu Sorumluluğu Ayrımı (CQRS), veriyi okumayı (bir 'sorgu') veriye yazmaktan ayıran bir mimari desenidir. Uygulama içinde komutlar ve sorgular arasında net bir ayrım sağlar.[11]

  1. ^ Millet, Scott; Tune, Nick (2015). Patterns, Principles, and Practices of Domain-Driven Design. Indianapolis: Wrox. ISBN 978-1-118-71470-6. 
  2. ^ Vernon, Vaughn (2013). Implementing Domain-Driven Design. Upper Sadle River, NJ: Addison-Wesley. s. 3. ISBN 978-0-321-83457-7. 
  3. ^ Domain-Driven Design: Tackling Complexity in the Heart of Software. Addison-Wesley Professional. 2003. ISBN 978-0321125217. 
  4. ^ martinekuan. "Using tactical DDD to design microservices - Azure Architecture Center". learn.microsoft.com (İngilizce). 2 Ekim 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 7 Eylül 2024. 
  5. ^ Microsoft Application Architecture Guide, 2nd Edition. Retrieved from http://msdn.microsoft.com/en-us/library/ee658117.aspx#DomainModelStyle 30 Ocak 2019 tarihinde Wayback Machine sitesinde arşivlendi..
  6. ^ a b Evans, Eric (22 Ağustos 2003). Domain-Driven Design: Tackling Complexity in the Heart of Software. Boston: Addison-Wesley. ISBN 978-032-112521-7. 13 Mayıs 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 12 Ağustos 2012. 
  7. ^ Fundamentals of Software Architecture: An Engineering Approach. O'Reilly Media. 2020. ISBN 978-1492043454. 
  8. ^ Haywood, Dan (2009), Domain-Driven Design using Naked Objects, Pragmatic Programmers, 9 Eylül 2017 tarihinde kaynağından arşivlendi, erişim tarihi: 30 Ekim 2024 .
  9. ^ "MDE, MDA'nın bir üst kümesi olarak kabul edilebilir". 9 Ekim 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 30 Ekim 2024. 
  10. ^ Cabot, Jordi (11 Eylül 2017). "Domain-Driven Design ile Model-Driven Engineering Karşılaştırması". Modeling Languages. 16 Nisan 2018 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Ağustos 2021. 
  11. ^ Eldh, Edd (2021). Hands-On Domain-Driven Design with .NET Core. Packt Publishing Ltd. ISBN 978-1-83921-486-7 |isbn= değerini kontrol edin: checksum (yardım).