Нещодавно мене турбує використання абстрактних занять.
Іноді абстрактний клас створюється заздалегідь і працює як шаблон того, як працювали похідні класи. Це означає, більш-менш, що вони забезпечують функціональність високого рівня, але залишають певні деталі, які можна реалізувати у похідних класах. Абстрактний клас визначає потребу в цих деталях, застосовуючи деякі абстрактні методи. У таких випадках абстрактний клас працює як креслення, опис функціональності на високому рівні або все, що ви хочете назвати. Він не може використовуватися самостійно, але повинен бути спеціалізований для визначення деталей, що залишилися поза впровадженням на високому рівні.
В інший час трапляється, що абстрактний клас створюється після створення деяких "похідних" класів (оскільки батьківський / абстрактний клас не існує, вони ще не отримані, але ви знаєте, що я маю на увазі). У цих випадках абстрактний клас зазвичай використовується як місце, куди можна помістити будь-який загальний код, який містять поточні похідні класи.
Зробивши вищезазначені зауваження, мені цікаво, який із цих двох випадків має бути правилом. Чи повинні бути розміщені будь-які деталі до абстрактного класу лише тому, що вони в даний час є загальними для всіх похідних класів? Чи повинен бути загальний код, який не є частиною функціоналу високого рівня?
Чи повинен код, який не може мати значення для самого абстрактного класу, лише тому, що він є загальним для похідних класів?
Наведу приклад: абстрактний клас A має метод a () та абстрактний метод aq (). Метод aq () в обох похідних класах AB і AC використовує метод b (). Чи повинен b () перейти до A? Якщо так, то у випадку, якщо хтось дивиться лише на A (зробимо вигляд, що AB та AC там немає), існування b () не мало б сенсу! Це погано? Чи повинен хтось мати змогу заглянути в абстрактний клас і зрозуміти, що відбувається, не відвідуючи похідні класи?
Якщо чесно, в момент запитання про це я схиляюсь до того, що писати абстрактний клас, який має сенс, не шукаючи у похідних класах, це питання чистого коду та чистої архітектури. Не дуже подобається ідея абстрактного класу, який діє як дамп для будь-якого коду, звичайно, є загальним у всіх похідних класах.
Що ви думаєте / практикуєте?
Writing an abstract class that makes sense without having to look in the derived classes is a matter of clean code and clean architecture.
- Чому? Хіба не можливо, що під час проектування та розробки програми я виявляю, що декілька класів мають спільну функціональність, яка, природно, може бути перероблена на абстрактний клас? Чи повинен я бути ясновидцем, щоб завжди передбачати це перед тим, як писати будь-який код для похідних класів? Якщо я не буду такою проникливою, мені забороняється виконувати таке рефакторинг? Повинен я скинути свій код і почати спочатку?