22 Temmuz 2019 Pazartesi

Cohesion Nedir? - Odaklılık Diyebiliriz

Nesneye Yönelik Tasarım
Nesneye Yönelik Tasarımda High Cohesion, Low Coupling amacına ulaşılmaya çalışılır.

Cohesion Nedir?
Cohesion nasıl çevrilir bilmiyorum. Kohezyon kelimesini de kullanmak istemedim. Odaklılık daha uygun bir kelime gibi geliyor.

Odaklılık şöyle tarif edilir.
"Cohesion refers to the degree that elements of a module belong together. The more cohesive a module is, relative to other modules in the software, the more independently it can operate."
Odaklılık ve SOLID kurallarından olan Single Responsibility Principle bence birbirleri ile aynı kavramlar.

Odaklılık ile İlgili 3 Kavram Daha Var
Bunlar şöyle
REP: Reuse/Release Equivalence Principle
CCP: Common Closure Principle
CRP: Common Reuse Principle

REP
Bir bileşen varsa bile bunu da alt paketlere bölmek gerekir. Her şeyi aynı bileşen içindeler diye ortak alana koymak olmaz. Açıklaması şöyle
REP means that the classes and modules that are formed into a component must belong to a cohesive group. The component cannot simply consist of a random hodgepodge of classes and modules; instead there must be some overarching theme or purpose that those modules all share.
CCP
Alt paketlere bölerken aynı anda değişen sınıfları da ortak paketlere taşımak gerekir. Açıklaması şöyle
CCP means gathering into components those classes that change for the same reasons and at the same times. Separate into different components those classes that change at different times and for different reasons.
CRP
Açıklaması şöyle
CRP states “Don’t force users of a component to depend on things they don’t need”.
Micro service Mimarisinde Odaklılık
Açıklaması şöyle.
each service encapsulates all related behaviors and data together. If we need to build a new feature, all the changes should be localized to just one single service.
Eğer "high cohesion" olmazsa karma karışık bir şey olur.  Açıklaması şöyle.
Without high cohesion, we will end up with a distributed monolithic system — a messy set of services that have to be changed and deployed at the same time in order to build a single feature. A distributed monolithic system is often much worse than a centralized monolithic system because of the complexity and cost of coordination of multiple services, sometimes across multiple teams.
Cohesion Nasıl Ölçülür?
LCOM1'den LCOM4'e kadar ölçüm yöntemleri var. En kullanışlısı LCOM4 olarak görünüyor. LCOM4 ölçümünde cohesion 1'den başlar. Eğer sonuç daha yüksekse sınıf bölünmelidir.

Cohesion Nasıl Bozulur?
Cohesion'ın bir kaç şekilde bozulabilir.
1. Sınıf İçinde Cohesion'ı Bozan Metod
2. Domain Logic İçeren Utility Sınıfı

Sınıf İçinde Cohesion'ı Bozan Metodlar
Elimizde şöyle bir kod olsun. Bu kodda Discharge metodu odaklılık kuralını bozuyor.
public class Food {
  private int _foodValue = 10;

  public void Eat() {
    _foodValue -= 1;
  }

  public void Replenish() {
    _foodValue += 1;
  }

  public void Discharge() {
    Console.WriteLine("Nnngghhh!");
  }
}
Domain Logic İçeren Utility Sınıfı
Elimizde şöyle bir kod olsun. Logic Food sınıfında olmalıyken, FoodHelper sınıfında.
public class Food {
  public int FoodValue { get; set; }
}

public static class FoodHelper {

  public static void EatFood(Food food) {
    food.FoodValue -= 1;
  }

  public static void ReplenishFood(Food food) {
    food.FoodValue += 1;
  }
}



1 yorum: