Я совершенно новичок в принципах дизайна SOLID . Я понимаю их причину и преимущества, но все же мне не удается применить их к небольшому проекту, который я хочу реорганизовать в качестве практического упражнения для использования принципов SOLID. Я знаю, что нет необходимости менять приложение, которое работает идеально, но я все равно хочу его реорганизовать, чтобы получить опыт проектирования для будущих проектов.
Приложение имеет следующую задачу (на самом деле намного больше, чем это, но давайте будем проще): оно должно прочитать XML-файл, который содержит определения таблицы базы данных / столбца / представления и т. Д., И создать файл SQL, который можно использовать для создания схема базы данных ORACLE.
(Примечание: пожалуйста, воздержитесь от обсуждения, зачем мне это нужно или почему я не использую XSLT и т. Д., Есть причины, но они не по теме.)
Для начала я выбрал только Таблицы и Ограничения. Если вы игнорируете столбцы, вы можете указать это следующим образом:
Ограничение является частью таблицы (или, точнее, частью инструкции CREATE TABLE), и ограничение также может ссылаться на другую таблицу.
Сначала я объясню, как приложение выглядит прямо сейчас (без применения SOLID):
В настоящий момент в приложении имеется класс «Таблица», который содержит список указателей на ограничения, принадлежащие таблице, и список указателей на ограничения, ссылающиеся на эту таблицу. Всякий раз, когда соединение устанавливается, обратное соединение также будет установлено. В таблице есть метод createStatement (), который в свою очередь вызывает функцию createStatement () каждого ограничения. Указанный метод сам будет использовать соединения с таблицей владельца и ссылочной таблицей для получения их имен.
Очевидно, это не относится к SOLID вообще. Например, существуют циклические зависимости, которые раздувают код с точки зрения требуемых методов «добавления» / «удаления» и некоторых деструкторов больших объектов.
Итак, есть пара вопросов:
- Должен ли я разрешить циклические зависимости с помощью внедрения зависимостей? Если это так, я полагаю, что ограничение должно получить таблицу владельца (и, возможно, ссылку) в своем конструкторе. Но как я мог тогда запустить список ограничений для одной таблицы?
- Если класс Table хранит свое собственное состояние (например, имя таблицы, комментарий к таблице и т. Д.) И ссылки на ограничения, являются ли это одной или двумя «обязанностями», имея в виду принцип единой ответственности?
- В случае 2. правильно, я должен просто создать новый класс в логическом бизнес-уровне, который управляет ссылками? Если это так, 1. очевидно больше не будет актуальным.
- Должны ли методы «createStatement» быть частью классов Table / Constraint или я должен также удалить их? Если да, то где? Один класс Manager для каждого класса хранения данных (т. Е. Table, Constraint, ...)? Или, скорее, создать класс менеджера по ссылке (аналогично 3.)?
Всякий раз, когда я пытаюсь ответить на один из этих вопросов, я где-то бегаю кругами.
Очевидно, что проблема становится намного более сложной, если вы включите столбцы, индексы и т. Д., Но если вы, ребята, поможете мне с простой вещью Table / Constraint, я могу решить все остальное самостоятельно.