Clean Architecture Kitabından Notlar – Entity, Business Rule, Use Case, Policy ve Level Kavramları

ENTITY, BUSINESS RULE ve USE CASE

BUSINESS RULE

Business rule denen kavram kısaca şirkete para kazandıran ve uygulama bağımsız, hatta platform bağımsız kurallardır. Bu kurallar bir uygulama üzerinde de, kağıt kalem kullanarak da işletilse de aynı olan kurallardır. Örneğin, bir banka belli bir paraya %N  faiz uyguluyorsa bu web uygulamasında da bu kural aynıdır. Banka şubesine gitseniz de bu kural aynıdır. Bu kurallara kritik business rule olarak adlandırırız. Çünkü bu rulelar business için oldukça kritiktir ve manuel versiyonda bile mevcuttur.

Business rulelar çalışmak için dataya ihtiyaç duyarlar. Örneğin faiz için load, balance, interest rate, payment schedule. Bu datayı da  business data olarak adlandırırız. Bu business rule ve kritik business datalar ayrılamaz ve bir obje içinde bir aradadırlar. Buna da Entity deriz.

ENTITIY

Entity yukarıda da bahsettiğimiz gibi, kritik business rule ile business datayı bir arada encapsulate eden yapıdır. Bir entity için business dataya ulaşmak oldukça kolaydır.

Bu konseptte bir entity yarattığımız zaman business rule ile datayı bir araya toplayıp bunu automated diğer tüm concernler’den ayırıyoruz. Entityler gerçek business’ın bir sunumu gibidir. Databaselerden, ve her türlü third parti entegrasyondan ayrılmışlardır. Bunu hangi sisteme koyarsanız koyun entegre olup çalışabilmelidir.

Entity is pure object and nothing else. All that is requeired is that you bind the critical business data and the critical business rule together in a single and seperate software module.

USE CASE

Tüm business rulelar Entitylerin içerdiği rulelar kadar pure değildir. Bu rule’lar entity rule’ları gibi manuel operate edilemezler. çünkü sadece automated bir sistemin parçası olarak anlamlıdır. Use case automated sistemin nasıl kullanıldığının bir descriptionudur. Kullanıcıdan sağlanacak inputu, dönülecek outputu ve işletilecek stepleri belirler. Use case, entity’nin aksine application specific business ruleları belirler.

Use case entity’nin ne zaman ve nasıl çağırılacağını belirle yani bir nevi entity’leri orchestrate eder diyebiliriz. Ancak yine use caselerin implemente edildiği noktada, uygulamanın web mi console uygulaması mı vs oldugunu tahmin edecek kod olmamalıdır. Bu önemli bir detaydır. Use case uygulamanın kullanıcıya nasıl sunulduğuyla ilgilenmez. Aksine kullanıcı ve entity arasındaki etkileşimi yöneten application specific business ruleları tanımlar.

Entityler use caseler hakkında bilgi sahibi değildir. Bu da bağımlılıkların yönünü belirleyen dependency inversion principle’ın bir örneğidir. Entityler gibi high level conseptler use case gibi low level conceptler hakkında bilgi sahibi değildir. Bunun yerine lower level use caseler entitiyleri bilir.

Peki neden entityler high use caseler low leverdir. Use caseler uygulama specifictir ve inputla ve outputlara daha yakındır. Entityler genelleştirilmiştir ve tüm uygulamada kullanılabilirler ve input ve outputlardan uzaklardır. 

POLICY

Yazılım sistemleri aslında policy statementlarından ibarettir. Yazılım geliştirme sanatının önemli bir parçası da policyleri birbirinden ayırmak ve gruplamak üzerine kuruludur. Aynı sebepten aynı zamanda değişen policyler aynı levelde, farklı sebeplerden farklı zamanlarda değişen policyler farkı levellerdedir. Mimari sanatı da gruplanmış componentleri directed cyclic graph’a çevirme sanatıdır. Graphtaki nodelar aynı levedeki policyler, directed edgeler ise bu componentler arasındaki dependencylerdir.

İyi bir mimaride bu componentlerin  bağımlılıklarının yönü component levellerine göre şekillenir. Her durumda, low level componentler high level componentlere bağlı olacak şekilde şekillenmelidir. 

LEVEL

Yazılım componentleri açısından level kavramının tanımı, input ve outputtan olan uzaklık olarak tanımlanabilir. Bir policy input ve outputtan ne kadar uzaksa daha high leveldir.  Input ve outputları yönetiyorsa low leveldir diyebiliriz.

Yukarıdaki örnekte inputtan karakter okuyan daha sonrasında bunu translate edip tekrar yazdıran bir figure verilmiştir. Burada input ve outputa daha yakın olan read ve write char low level iken inputtan uzak olan translate high bir bileşendir.

function encrypt() {
  while(true)

    writeChar(translate(readChar()));
}

yukarıdaki kod bloğu ise yanlış bir yaklaşımdır. Çünkü high level encrpy fonskyionu low level olan readChar ve writeChar fonksiyonlarına bağlıdır.

Daha iyi bir mimari ise yukarıdaki gibi olacaktır. Burada Encrypte classını, charwriteri ve charreaderi surround eden çizgilere dikkat edelim. Tüm bağımlılıklar in-warddır. Bu birim bir sistemdeki highest level birimdir. ConsoleReader and consolewriter burada classlar olarak gösterilirler. Low levellardır çünkü input ve outpulara yakınlardır. Bu da encryption policysini farklı yerlerde kullanılabilir hale getirir. Input ve outputlar değiştiği zaman, bu değişiklikler encryiption polictysini etkilemez.

Toparlasak, policyler nasıl değişeceklerine bağlı olarak componentlere gruplanır. Aynı sebep için aynı anda değişecek polictyler SRP ve CCO tarafından gruplanır. Input ve outputtan uzak olan high level policyler daha az sıklıkla değişmeye meyillidir. Lower-level policyler ki bunlar input ve outputlara daha yakındır, değişmeye daha meyillidir.

SONUÇ OLARAK

Business rulelar core functionalitiylerdir. Parayı kazandıran fonksiyonaliteler de diyebillriz.  Kullanılan database ya da user interface gibi concernler tarafından bozulmamış etkilenmemiştir. Ideal olarak bu rullearı barındıran codelar sistemin kalbidir ki daha fazla pluginden bağımsızdır.Business rule, sistemdeki en bağımsız ve tekrar kullanılabilir kod olmalıdır.

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir