Domain Driven Design Notlarım — Domain Model ve Knowledge Crunching

Mert Türkman
4 min readAug 8, 2022

--

Selam arkadaşlar, bu yazımda domain driven design için yapı taşı olan domain model ve knowledge crunchinge dair bildiklerimi almış olduğum notların düzenlenmiş hali üzerinden değineceğim. Faydalı olmasını dilerim. Haydi başlayalım. :)

Niye Domain Modele İhtiyacımız Var ?

Her uygulamanın, belirli bir soruna çözüm getirmek veya mevcut bir sistemi iyileştirmek için kullanılması amacı olması gerekmektedir ve bununla beraber amacı doğrultusunda en az bir domaine (ilgi alanına) sahiptir. Bu amaçları gerçekleştirirken geliştirdiğimiz uygulamalar muhasebe, bankacılık ve finans gibi soyut kavramlar olabilirken ulaşım ve savunma sanayi gibi somut kavramların olduğu farklı sektörlerden olabilir ve farklı domain bilgileri gerektirebilir.

Örneğin finans sektörü ile ilgili bir uygulama geliştirmek istediğimizi düşünelim, bu uygulamayı ortaya çıkarmak için kullanılan süreçler ve kavramlar hakkında bilgimiz olması gerekli ama benimde daha önceden tecrübe ettiğim gibi finans sektöründe kompleks süreçler ve anlaşılması çok zor kavramlar olabiliyor. Bu kavramları ve süreçleri anlamak için uygulamanın deadline zamanına kadar bir finans uzmanı olabiliceğimize pek ihtimal vermiyorum. :) Peki finans bilgimiz olmadığı halde bu uygulamayı nasıl geliştirebiliriz, farklı bir çözüm bulmamız gerekli işte burda bir domain modele ihtiyaç duyuyoruz.

Peki Bu Domain Model Nedir? Ne İşe Yarar ?

Domain model, süreçleri ve kavramları anlamamız için bilginin seçilmiş, soyutlanmış ve düzenlenmiş şeklidir. Bir domain model kesinlikle sadece bir diyagramdan ibaret değildir, bu diyagram üzerinden anlaşılması istenen bilgidir. Aynı zamanda bu bilgiler titizlikle seçilmiş, soyutlanarak basitleştirilmiş ve anlaşılması daha kolay hale getirilmiş olmalıdır.

Domain modelleme yapılırken dikkat edilmesi gereken başka bir noktada mümkün olduğunca “gerçekçi” bir model yapılmaya çalışılmamasıdır. Domain modelimiz gerçekliği gevşek bir şekilde temsil etmelidir. Her noktayı bire bir anlattığımız bir model çok karmaşık ve kompleks olucağı için anlaşılabilir olmayacaktır, o zamanda modelimizin hiçbir önemi kalmaz.

Domain model geliştikçe, proje boyunca akmaya devam eden bilgileri düzenlemek için bir araç haline gelir. Model, gereksinim analizine odaklanır. Yazılım ve tasarım ile yakın etkileşim içindedir. Bu modeller asla mükemmel değildir, sürekli evrim geçirirler. Domain anlamlandırmada pratik ve kullanışlı olmalıdır.

Burda bir biyografi anlatımı olarak Stephen Hawking’in hayatını yansıtan “Her Şeyin Teorisi” filmini örnek olarak inceleyebiliriz. Filmin üç ana konusu vardır; arkadaşları, ailesi ile olan ilişkisi ve astrofizik bilimi üzerine yapmış olduğu araştırmaları. Senaryonun hazırlanma aşamasını düşünelim senaristin amacı her şeyi olduğu gibi yansıtmak değil hayatının önemli olduğunu düşündüğü kısımları seçerek karmaşık olan yaşamını basitleştirmek ve seyirciye uygun bir şekilde düzenlemektir. Değinmiş olduğumuz modelleme sürecine ne kadarda benziyor değil mi :)

Domain Modelin Faydaları

  • Domain model, uygulama tasarımımızı şekillendirdiği için uygulamamız ile önemli bir bağ mevcuttur. Modelimizdeki her değişiklik de uygulamamızda değişikliğe sebep olup geliştirmektedir.
  • Domain model, daha sonra detaylı olarak değineceğimiz tüm ekip tarafından anlaşılıp kullanılmasını beklediğimiz “Ubiquitous Language” olarak adlandırılan ortak dilin bel kemiğini oluşturur. Geliştirilen ortak dil sayesinde domain expertler ile herhangi bir çevirmen olmadan rahat ve kolay bir şekilde herhangi bir yanlış anlaşılmaya uygun açık uç bırakmadan anlaşabilirler.
  • Domain model, seçilip soyutlanarak sadeleştirilmiş bilgileri içerir. Burdaki amaç ekibin uygulama hakkında bilgi edinmesini kolaylaştırmak ve önemli unsurları ayırt edebilmeyi sağlamak.

Knowledge Crunching Nedir ? Niye İhtiyacımız Var ?

Developerlar ve domain expertler bir işbirliği halinde, domain expertlerin bilgilerini tartışır ve bunların sadece ve sadece uygulama ile ilgili olanları seçilerek soyutlanır, basitleştirilmiş bilgilere dönüştürülür. Bu sürece knowledge crunching denir.

Amaç, uygulamanın ne yapması gerektiği, bunu nasıl yapması gerektiği ve teknik uygulamanın ne olması gerektiğine dair bir domain model elde etmektir.

Kullanılan eski waterfall yönteminde, uygulama hakkında analistler ile domain expertler birlikte konuşur ve analistler bilgiyi soyutlayıp düzenleyerek developerlara aktarır. Bu yaklaşımda feedback olmadığından kompleks ve karmaşık projelerde sürdürülebilir bir başarı elde etmek mümkün değildir. Analistler domain expertlerden elde ettikleri bilgilere dayanarak bir domain model oluşturmada tam yetkilidirler. Developerlar bir şey öğrenme ya da yazılımın ilk versiyonu ile deneyim kazanma şansına sahip değildir. Bilgi tek yönde akar ve buda ileride oluşabilicek bottlenecklere işaret etmektedir.

Yinelemeli yöntem ile, developerlar ve domain expertler iş birliği halinde olduğu için bilgi çok yönlü akar. Bu yöntemde başlangıç aşamasında uygulama için infrastructre veya UI ile ilgili geliştirme yapılmamalıdır. Başlangıç aşamasında önemli olan yazılımın davranışıdır. Süreç yinelemeli olduğu için çıkartılan protatip üzerinden tekrar knowledge crunching yapılır ve domain model yeniden düzenlenir. Tabiki uygulama, domain modele bağlı oldu için uygulama üzerinde değişiklikler yapılır. Bu döngü devamlı olarak böyle ilerler.

En önemli dikkat edilmesi gereken noktalardan bazılarıda, developerların domainle olan ilgisi, uygulamanın arkasındaki ilkelerin ve süreçlerin anlaşılmasıdır. Böyle yapmazsak domain modelleme işlemi tam anlamı ile başarılı olmıyacaktır ayrıca daha önce bahsettiğimiz bottleneckler oluşmasına sebep olucaktır.

Etkili modelleme aşağıdakilere dayanmaktadır;

  1. Model ve uygulama arasındaki bağ; Uygulama kesinlikle modele dayalı olmalıdır. Model her güncellendiğinde uygulamada güncellenmelidir.
  2. Modele dayalı bir dilin geliştirilmesi; Model, hem domain expertler hemde developerlar için ortak bir dilin temeli olan terimleri içermelidir.
  3. Bilgi açısından zengin bir model geliştirmek; Model veri yapılarının bir temsilinden daha fazlası olmalıdır. Veri yapıları, nesneler, davranışlar, zorunlu kurallar gibi her çeşit bilgiyi içermelidir.
  4. Modelin damıtılması; Önemli kavramlar model geliştikçe modele eklenir, ancak aynı derecede önemli olmayan kavramlar yararlı veya merkezi olmadıkları kanıtlandığında çıkarılmalıdır.
  5. Beyin fırtınası ve deneyler; Domain expertler ve developerlar arasında, yoğun deney ve tartışmaların gerçekleştiği beyin fırtınası ve deney toplantıları, damıtılmış bilgi açısından zengin bir model sağlar.

--

--