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.