İç içe girmiş Veraset - Kötü ya da iyi Pratik?

5 Cevap java

Ben bir PHP web uygulaması yapma sürecinde duyuyorum. I I believe iç içe miras için iyi bir zaman teşvik olacağı bir durum var. Her neyse, burada benim durum:

public class RecurringWeeklyEvent extends RecurringEvent { }

public class RecurringEvent extends Event { }

Bu kötü bir tasarım uygulama olacağını bana görünmüyor; Ancak, ben hiçbir şekilde gelişmiş bir Nesne Tabanlı programcı değilim. Bunu dedi benim uygulamada kod bu tür kullanarak kapalı girişim önce, ben bu daha nitelikli / deneyimli programcılar gelen iyi ya da kötü bir uygulama olup olmadığını bilmek istiyorum.

NOT: Ben yanlış terimini kullanarak düzeltildikten sonra iç içe miras birden miras başlığı değiştirdi.

Teşekkürler

Steve

5 Cevap

Alıntı için David West:

Miras tanımı daha sonra, "alt (çocuk) superordinate (ana) aynı davranışları (sorumlulukları) artı ek en az birine sahip olan sınıflar arasındaki superordinate-ast ilişkisi" olur.

Peki ne yapıyoruz çok uzun türetilmiş sınıfları (yani miras ekstra üyeleri eklemek için bir araç değildir), ve (tercihen) tanımlı değiştirerek değil behaviour ekliyorsanız, iyi görünüyor bazlar sınıfların davranış.

Elaboration

Ne duffymo doğru olduğunu söylüyor. Ben David West adlı kitabında ne diyor benim yorumlanması benim 2p eklemek istiyorum.

Yöntemleri geçersiz kılmak mümkün kaçınılmalıdır. Bir çocuk sınıfta bir yöntemin davranışını değiştirme uygulayıcılar için karışıklığa neden olabilir.

(Ben hala OOP ve Nesne Düşünce başımı alıyorum.)

En iyi yolu, RecurringEvent sahip olacaktır, ve her nesne, nükseder zaman bilgi var, muhtemelen her n gün (hatta saat, dakika).

Bu iki satır, ben size bir takvim yapıyoruz tahmin ediyorum? Muhtemelen standart olmayan yollarla (haftanın örneğin, üçüncü Pazartesi, Ekim ayında ilk Pazartesi ve benzeri) nüks olaylar için farklı bir sınıf (yinelenen olay alt sınıfı) yapmak isteyeceksiniz.

Ve bil ki, bu tek bir sınıfın birden fazla doğrudan üst sınıfa sahip olduğunda çoklu miras, çoklu kalıtım değildir. Bu durumda, olay RecurringWeeklyEvent uzanır RecurringEvent uzanır. Çoklu kalıtım ile, RecurrungWeeklyEvent RecurringEvent ve Olay (ben sözdizimi php veya java bunu emin değilim) uzanır olacaktır.

çoklu kalıtım aslında biraz farklı bir şeydir. Sınıf multiple arayüzleri / süper sınıf devralır nerede Çoklu miras. Ne var ben gayet inanıyorum düzenli bir run-onlar-değirmen sınıf hiyerarşisi. Ben bazen bir aşırı karmaşık nesne hiyerarşileri oluşturma ile coşma, böylece sadece farkında olmak bulabilirsiniz. Sizin tasarım olsa benim için kabul edilebilir görünüyor.

Ben sadece 'Derin miras ağacı', iç içe miras demezdim.

Ben bir WeeklyRecurringEvent oluşturmak olmaz sizin örnekte bakıyor. Eğer daha fazla zaman adımları kargaşa alır, (daha sonra MonthlyRecurringEvent, sınıfları TwoWeeklyRecurringEvent yaratacak) ve özel sınıfların bir çok ile sona eklerseniz uzatılması için esnek değildir. Bunun için ben devralma ve daha sakin bir yaklaşım atlamak:

PHP bir süre önce yazdı son kez, ben sadece Java fikir sunmak, fikrini almak için yeterli olmalıdır:


class RecurringEvent extends Event{
   RecurringStep step;

   RecurringEvent(RecurringStep step){
     this.step=step;
   }
}

enum RecurringStep{
  MONTHLY,WEEKLY,DAILY,YEARLY;
}

Daha kolay kod içinde yinelenen olaylar oluşturmak için yapmak için belki de fabrika yöntemleri sunacak:


class RecurringEventFactory{
...
  static createDailyEvent(){
     return new RecurringEvent(DAILY);
  }
...
}

Tabii ki RecurringEvent sınıfa doğrudan fabrika yöntemlerinizi çevreliyor olabilir.

Belki iç içe miras çağırır. Her iki şekilde de burada bir sorun bulmak için çalışmayın. Sadece artık onunla rahat hissetmiyorum zaman miras yuvalama durdurun.