Час, коли вам потрібно розглянути клас, який планується продовжити, - це коли ви робите реальне планування на майбутнє. Дозвольте навести приклад із реального життя з моєї роботи.
Я багато часу витрачаю на написання інструментів інтерфейсу між нашим основним продуктом та зовнішніми системами. Коли ми робимо новий розпродаж, одна велика складова - це набір експортерів, призначених для роботи через регулярні інтервали, які генерують файли даних із деталізацією подій, що відбулися в той день. Потім ці файли даних споживаються системою замовника.
Це відмінна можливість для продовження занять.
У мене клас експорту, який є базовим класом кожного експортера. Він знає, як підключитися до бази даних, дізнатися, де він потрапив востаннє, і створити архіви файлів даних, які він створює. Він також забезпечує управління файлами властивостей, ведення журналів та деякі прості обробці винятків.
Крім цього, у мене є інший експортер для роботи з кожним типом даних, можливо, є діяльність користувача, транзакційні дані, дані управління готівкою тощо.
Поверх цього стеку я розміщую специфічний для клієнта шар, який реалізує структуру файлу даних, яка потребує замовник.
Таким чином, база експортера дуже рідко змінюється. Експортери основних даних іноді змінюються, але рідко, і, як правило, лише для обробки змін схеми бази даних, які в будь-якому разі повинні бути розповсюджені для всіх клієнтів. Єдина робота, яку мені доводиться робити кожному клієнту, - це та частина коду, яка є специфічною для цього замовника. Ідеальний світ!
Так структура виглядає так:
Base
Function1
Customer1
Customer2
Function2
...
Моя основна думка полягає в тому, що, архітуючи код таким чином, я можу використовувати спадщину насамперед для повторного використання коду.
Треба сказати, що я не можу придумати жодної причини, щоб пройти три шари.
Я багато разів використовував два шари, наприклад, щоб мати загальний Table
клас, який реалізує запити таблиці баз даних, тоді як підкласи Table
реалізують конкретні деталі кожної таблиці, використовуючи enum
для визначення полів. Дозвіл enum
реалізації інтерфейсу, визначеного в Table
класі, має всілякий сенс.
Open/Closed principle
, а неClosed Principle.