Я зовсім новачок принципів дизайну SOLID . Я розумію їхню причину та переваги, але все ж не можу застосувати їх до меншого проекту, який я хочу переробити як практичну вправу для використання принципів SOLID. Я знаю, що немає необхідності змінювати додаток, який працює ідеально, але я все одно хочу його переробити, щоб отримати досвід дизайну майбутніх проектів.
У додатку є таке завдання (насправді набагато більше, але давайте будемо простою): він повинен прочитати XML-файл, який містить визначення таблиць / стовпців / перегляду тощо та бази даних, і створити файл SQL, який можна використовувати для створення схема бази даних ORACLE.
(Примітка. Будь ласка, утримуйтесь від обговорення, чому мені це потрібно чи чому я не використовую XSLT тощо), є причини, але вони поза темою.)
Для початку я вирішив поглянути лише на таблиці та обмеження. Якщо ви ігноруєте стовпці, ви можете вказати це наступним чином:
Обмеження є частиною таблиці (а точніше, частиною оператора CREATE TABLE), а обмеження може також посилатися на іншу таблицю.
Спочатку я поясню, як зараз виглядає програма (не застосовуючи SOLID):
На даний момент у додатку є клас "Таблиця", який містить перелік покажчиків на обмеження, якими володіє таблиця, та список покажчиків на обмеження, на які посилається ця таблиця. Щоразу, коли з'єднання встановлюється, буде встановлено і зворотний зв'язок. У таблиці є метод createStatement (), який, в свою чергу, викликає функцію createStatement () кожного обмеження. Згаданий метод сам використовуватиме з'єднання з таблицею власників та згаданою таблицею, щоб отримати їх імена.
Очевидно, це взагалі не стосується SOLID. Наприклад, існують кругові залежності, які роздувають код з точки зору необхідних методів "додати" / "вилучити" та деяких великих деструкторів об'єктів.
Отже, є кілька питань:
- Чи слід вирішити кругові залежності за допомогою введення залежностей? Якщо так, я вважаю, що обмеження має отримати власнику (і необов'язково посилану) таблицю у своєму конструкторі. Але як я міг тоді перебігти список обмежень для однієї таблиці?
- Якщо клас "Таблиця" зберігає сам стан (наприклад, ім'я таблиці, коментар до таблиці тощо) та посилання на обмеження, чи є це одна чи дві "відповідальності", думаючи про єдиний принцип відповідальності?
- У випадку 2. правильно, я повинен просто створити новий клас на рівні логічного бізнесу, який керує посиланнями? Якщо так, 1. це, очевидно, більше не має значення.
- Чи повинні методи «createStatement» входити до класів «Таблиця / обмеження» чи я також повинен їх перемістити? Якщо так, то куди? Один клас менеджера для кожного класу зберігання даних (тобто таблиця, обмеження, ...)? А точніше створити клас менеджера за посиланням (подібний до 3.)?
Кожного разу, коли я намагаюся відповісти на одне з цих питань, я кудись бігаю по колах.
Проблема, очевидно, стає набагато складнішою, якщо ви включаєте стовпці, індекси тощо, але якщо ви, хлопці, допоможете мені вирішити просту річ «Таблиця / обмеження», я, можливо, я можу розробити решту самостійно.