“Özellik kıskançlığı” kodu nedir ve neden kod kokusu olarak kabul edilir?


52

SO hakkındaki bu soru , OP düşüncesinin kıskançlık kodunun ne olduğunu düzeltme konusunda konuşuyor . Bu şık ifadenin alıntılandığını gördüğüm bir başka örnek , programcılarda son zamanlarda verilen cevapta . Bir damla Her ne kadar Yorumlarınız bilgiler soran o cevaba ben terim ne anlama geldiğini anlamak için Q & A aşağıdaki programcılar için genel yardım düşündüm özellik kıskançlık . Lütfen uygun olduğunu düşünüyorsanız ek etiketleri düzenlemekten çekinmeyin.


Yanıtlar:


87

Özellik kıskançlığı , bir nesnenin başka bir nesnenin alanlarına girdiği bir durumu tanımlamak için kullanılan bir terimdir.

Önemsiz bir örnek olarak, dikdörtgeni temsil eden bir sınıf düşünün. Dikdörtgenin kullanıcısının bölgesini bilmesi gerekebilir. Programcı ortaya çıkarabilir widthve heightalanları açıp Rectanglesınıf dışında hesaplamayı yapabilir . Alternatif olarak ve alanları gizli Rectangletutabilir ve bir yöntem sağlayabilir . Bu tartışmalı daha iyi bir yaklaşım.widthheightgetArea

İlk durumla ilgili sorun ve kod kokusu olarak kabul edilmesinin nedeni, kapsüllemeyi bozmasıdır.

Genel bir kural olarak, ne zaman bir tür mantık veya hesaplama yapmak için kendinizi başka bir sınıftan alanlardan yararlanırken bulursanız, bu mantığı sınıfın kendisinde bir yönteme taşımayı düşünün.


7
+1, örneğiniz gerçekçi olmasa da, kullanışlı bir Rectangle sınıfı genellikle genişlik ve yükseklik alanlarını da gösterir.
Doktor Brown

2
Kapsülleme kırılma olsa Ve edebilir bir çoğu gerçek dünya örneklerde, "Özellik envirism" ile birlikte ortaya Şimdiye kadar muhtemelen böyle değildi gördük. Durumlarda daha fazla olur "hey, sadece o nesneyi kullanan koddaki bazı şeyleri hesaplamam gerekiyor ve o nesnenin uygulanmasına dokunup dokunamadığımdan emin değilim / nesneye bu hesaplama için sorumluluk vermemiz gerekip gerekmediğinden emin değilim". Ve sonra kişi zaten hesaplanmış olan alanları kullanarak hesaplamayı uygular (yine de nesnenin içinde daha temiz bir uygulama mümkün olabilirdi).
Doc Brown

2
@DocBrown Bir torus, koni veya kürenin yüzeyinde çizilen bir dikdörtgen düşünün. Şekil çizme kütüphanem, bu tür bağlamlarda doğru sonuçları üretebilecek nesneler üretiyorsa, herhangi bir bağlamda kendi alanlarını hesaplamak için onları terk etmemeniz gerekir.
saat

1
@OskarN .: Tanım gereği , ihtiyaç duyulan fonksiyonlardan bahsediyoruz . Diğer sınıflar tekrar tekrar uygularsa, açık bir şekilde ihtiyaç duyulur.
Aaron,

1
@OskarN .: bağlıdır; Bazen karar açık, bazen bu bir zevk meselesidir ve çoğu zaman da bir deneyim meselesidir. Senin yazıda, Scott Meyers yazıyor neden iyi nedenler vardır " bazen o zaman anlamak yılını aldı ve bu less is more" değil "fa üye işlevini yapmak, karar vermek için algoritma" onun uygulamak.
Doc Brown

1

Başka bir sınıf / struct yöntemini kapsamlı bir şekilde kullanmanın uygun olduğu durumlarda olası bir durum vardır - sınıfınız / yapı sisteminiz veri için bir konteyner olduğunda. Genelde bu verilerle dış bağlam olmadan yapabileceğiniz çok az şey vardır.

Bu sınıflar hala bazı iç mantıkları tutabilirler, ancak daha sıklıkla kapsayıcı olarak kullanılırlar:

class YourUid {
 public:
  YourUid(int id_in_workplace_, int id_in_living_place_, DB* FBI_database, int id_in_FBI_database);
  bool IsInvalidWorker() const { return id_in_workplace == consts::invalid_id_in_workplace; }
  bool CanMessWith() const { return !FBI_database_.is_cool(id_in_FBI_database_); }
  int id_in_workplace;
  int id_in_living_place;
 private:
  int id_in_FBI_database_;
  const DB* FBI_database_;
};

Cevabındaki @jhewlett, diğer sınıf üyelerini yoğun bir şekilde kullanmamanız gerektiğini kanıtlamak için bu makaleye atıfta bulunuyor, ancak burada başka bir kod var.

Uzun Parametre Listesi Belirli bir yöntemde ihtiyacınız olan parametre sayısını sınırlayın veya parametreleri birleştirmek için bir nesne kullanın.


1
Bu soruyu soruyu nasıl cevaplıyor?
gnat

@gnat Q neden "kod kokusu" olarak kabul edilir. jhewlett, yorumlarda sorgulanan bazı genel varsayımlara sahip bir A verir. Cevabım "kod kokusunu" normal uygulamadan ayırt etmek için 2 sent.
Riga,
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.