Бих казал, че ако имате кодова база, с която искате да направите това, това не е най-добре проектираната кодова база. Обикновено това е знак за клас в едно ниво на иерархията, който се нуждае от определен публичен подпис, докато друг клас, получен от този клас, не се нуждае от него.
Една предстояща парадигма на кодиране се нарича „композиция над наследяване“. Това играе директно на принципите на обектно-ориентираното развитие (особено принципа на единичната отговорност и принципа отворено/затворено).
За съжаление, начинът, по който много от нас, разработчиците, бяха научени на обектна ориентация, сме създали навика веднага да мислим за наследяване вместо за композиция. Склонни сме да имаме по-големи класове, които имат много различни отговорности, просто защото могат да се съдържат в един и същ обект от „Реалния свят“. Това може да доведе до класови йерархии, които са дълбоки 5+ нива.
Неприятен страничен ефект, за който разработчиците обикновено не се замислят, когато се занимават с наследяване, е, че наследяването формира една от най-силните форми на зависимости, които някога можете да въведете във вашия код. Вашият производен клас вече е силно зависим от класа, от който е наследен. Това може да направи кода ви по-крехък в дългосрочен план и да доведе до объркващи проблеми, при които промяната на определено поведение в базов клас прекъсва производните класове по неясни начини.
Един от начините да разбиете кода си е чрез интерфейси, както е споменато в друг отговор. Това все пак е умно нещо, тъй като искате външните зависимости на класа да се свързват с абстракции, а не с конкретни/производни типове. Това ви позволява да променяте имплементацията, без да променяте интерфейса, без да засягате ред код във вашия зависим клас.
Предпочитам да поддържам система със стотици/хиляди/дори повече класове, всичките малки и слабо свързани, отколкото да се занимавам със система, която използва силно полиморфизъм/наследяване и има по-малко класове, които са по-тясно свързани.
Може би най-добрият ресурс за обектно-ориентирана разработка е книгата на Robert C. Martin, Гъвкаво разработване на софтуер, принципи, модели и практики.
person
Jason Olson
schedule
20.09.2008