Yüksek uyumun anlamı nedir?


28

Son zamanlarda bir yazılım geliştirme şirketine stajyer olarak katılan bir öğrenciyim. Üniversitede, profesörlerden biri "Düşük kavrama ve yüksek uyum" elde etmek için çaba göstermemiz gerektiğini söylerdi.

Düşük eşleşmenin anlamını anlıyorum. Ayrı bileşenlerin kodunu ayrı olarak tutmak anlamına gelir, böylece bir yerdeki bir değişiklik kodu bir başkasında kırmaz.

Fakat yüksek uyumla kastedilen şey. Aynı bileşenin çeşitli parçalarını birbirleriyle iyi bir şekilde bütünleştirmek anlamına gelirse, bunun nasıl avantajlı hale geldiğini anlamıyorum.

Yüksek uyumla ne kastedilmektedir? Faydalarını anlamak için bir örnek açıklanabilir mi?



1
Wikipedia makalesi sorunuzu yeterince cevaplamıyor mu? en.wikipedia.org/wiki/Cohesion_(computer_science)
Eoin Carroll


1
@EoinCarroll: Maalesef şu anda wikipedia makalesi yeni programcıların çalışabileceği herhangi bir iyi somut örnek sunmuyor . Teori iyi ve her şeydir, ancak düşük uyumu çevreleyen hataları yapana kadar yapışmaz. Yüksek uyum, neden önemli olduğunu ve onu nasıl elde edeceğimi tam olarak anlamam için yıllarca programlamamı sağlayan konulardan biri .
Spoike

Temiz Kod okuyana kadar Asla Uyum kavramını anlamadım. Sen de yapmalısın.
Sebastian Redl

Yanıtlar:


25

OO açısından uyumu araştırmanın bir yolu, sınıftaki yöntemlerin herhangi bir özel özelliği kullanmasıdır. Bu cevapta gnat ile belirtildiği gibi LCOM4 (Yapışkan Yöntemlerin Eksikliği) gibi metrikleri kullanarak , yeniden yapılandırılabilecek sınıfları tanımlayabilirsiniz. Yeniden sınıflandırma yöntemlerini veya sınıflarını daha uyumlu olmasının nedeni , kod tasarımını başkalarının kullanması için daha basit hale getirmesidir . Güven Bana; çoğu teknik müşteri adayı ve bakım programcısı bu sorunları çözdüğünüzde sizi sevecektir.

Kod tabanındaki düşük uyumu belirlemek için oluşturma işleminizde Sonar gibi araçları kullanabilirsiniz . "Uyumluluk" konusunda metotların düşük olduğunu düşünebileceğim çok yaygın birkaç vaka var :

Durum 1: Yöntem hiçbir şekilde sınıfla ilgili değil.

Aşağıdaki örneği düşünün:

public class Food {
   private int _foodValue = 10;

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

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

   public void Discharge() {
     Console.WriteLine("Nnngghhh!");
   }
}

Yöntemlerden Discharge()biri, sınıfın özel üyelerinden hiçbirine dokunmadığından uyumdan yoksun. Bu durumda sadece bir özel üye vardır: _foodValue. Sınıf içindekilerle hiçbir şey yapmazsa, gerçekten oraya ait mi? Yöntem, örneğin adlandırılabilecek başka bir sınıfa taşınmış olabilir FoodDischarger.

// Non-cohesive function extracted to another class, which can
// be potentially reused in other contexts
public FoodDischarger {
  public void Discharge() {
    Console.WriteLine("Nnngghhh!");
  }
}

Javascript'te yaptığınız gibi, işlevler birinci sınıf nesneler olduğu için deşarj serbest bir işlev olabilir:

function Food() {
    this._foodValue = 10;
}
Food.prototype.eat = function() {
    this._foodValue -= 1;
};
Food.prototype.replenish = function() {
    this._foodValue += 1;
};

// This
Food.prototype.discharge = function() {
    console.log('Nnngghhh!');
};
// can easily be refactored to:
var discharge = function() {
    console.log('Nnngghhh!');
};
// making it easily reusable without creating a class

Durum 2: Hizmet Programı

Bu aslında uyumu bozan yaygın bir durumdur. Herkes fayda sınıflarını sever , ancak bunlar genellikle tasarım kusurlarını gösterir ve çoğu zaman kod tabanının sürdürülmesini zorlaştırır (fayda sınıflarıyla ilgili yüksek bağımlılık nedeniyle). Aşağıdaki sınıfları göz önünde bulundurun:

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;
    }

}

Burada, yardımcı sınıfın sınıftaki bir özelliğe erişmesi gerektiğini görebiliriz Food. Bu durumda, hizmet sınıfındaki yöntemlerin hiçbir uyumu yoktur, çünkü çalışması için dış kaynaklara ihtiyacı vardır. Bu durumda, sınıfta kendileriyle birlikte çalıştıkları sınıfta olmak daha iyi olmaz mıydı (ilk durumda olduğu gibi)?

Durum 2b: Yardımcı Program Sınıflarında gizli nesneler

Gerçekleşmemiş etki alanı nesnelerinin olduğu bir başka yardımcı sınıf vakası vardır. Bir programcının karakter dizisi manipülasyonu programlarken yaptığı ilk diz tepkime reaksiyonu bunun için bir yardımcı sınıf yazmaktır. Birkaç ortak dize temsili onaylayan burada olduğu gibi:

public static class StringUtils {

  public static bool ValidateZipCode(string zipcode) {
    // validation logic
  }

  public static bool ValidatePhoneNumber(string phoneNumber) {
    // validation logic
  }

}

Burada en fazla farkına varılmayan şey, bir posta kodunun, telefon numarasının veya başka bir dize bildiriminin bir nesnenin kendisi olabileceğidir:

public class ZipCode {
    private string _zipCode;
    public bool Validates() {
      // validation logic for _zipCode
    }
}

public class PhoneNumber {
    private string _phoneNumber;
    public bool Validates() {
      // validation logic for _phoneNumber
    }
}

Dizeleri doğrudan "ele almamanız " fikri bu blog yayınında @codemonkeyism tarafından ayrıntılı olarak açıklanmıştır , ancak programcıların fayda sınıflarına mantık koyarak dizeleri kullanmaları nedeniyle uyum ile yakından ilgilidir.


Şimdi ORM'lerimizi özel ZipCode ve PhoneNumber sınıflarımıza uygun şekilde kullanabilseydik: |
Pete

+1 iyi örnekler. Son nokta için ayrıca bkz: sourcemaking.com/refactoring/primitive-obsession
AlexFoxGill

@Pete ORM'niz, dizgiden tanımladığınız tipe dönüştürme işleçleri sağladığınızda (ZipCode, PhoneNumber): msdn.microsoft.com/en-us/library/85w54y0a.aspx
Marcus

9

Yüksek uyum, benzer ve ilişkili şeyleri bir arada tutmak, içeriği, işlevselliği, nedeni veya hedefi paylaşan parçaları birleştirmek veya birleştirmek için kullanılır . Başka bir deyişle, düşük uyum örneğin " noktaya " olmak yerine çok amaçlı hizmet veren bir fonksiyon / sınıf / kod varlığı anlamına gelebilir . Taşıma fikirlerinden biri bir şeyi yapmak ve iyi yapmaktır . Diğerleri, benzer işlevleri birçok yerde çoğaltmamanın açık bir gerçeğini içerebilir. Bu aynı zamanda kod tabanının yerini de iyileştirir , etrafa dağılmak yerine belli türlerde belirli bir yerde bulunur (dosya, sınıf, işlevler kümesi ...).

Örnek olarak, iki veya üç amaca hizmet eden bir sınıfı düşünün: Kaynakları yükler / depolar (örneğin bir dosya) ve ardından içeriği analiz eder ve görüntüler. Böyle bir sınıf vardır düşük yönettiği çünkü uyumu en azından tüm (dosya I / O, analiz ve Görüntülü) de ilgili olmayan iki ayrı görevleri. Yüksek bir uyum tasarımı, kaynağı yüklemek ve depolamak, analiz etmek ve sonra görüntülemek için farklı sınıflar kullanabilir.

Öte yandan, düşük kavrama farklı şeyleri ayrı tutmayı amaçlar - böylece birbirleriyle olabildiğince az etkileşime girerler ve bu da karmaşıklığı azaltır ve tasarımı basitleştirir.


7

Bu, belirli bir nesnenin bölümlerinin, nesnenin işleviyle yakından ilişkili olduğu anlamına gelir. Bu, işlev veya sorumluluk açısından nesne içinde çok az atık olduğu veya hiç olmadığı anlamına gelir. Bu da, söz konusu nesnenin ne için kullanılması gerektiğini anlamayı geliştirebilir.


aynı zamanda sadece nesnelerden daha yüksek bir seviyeye uygulanmaz mı? örneğin, ad alanlarında bir görevle ilgili nesneleri / işlevleri gruplama?
stijn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.