Задача: спроектировать архитектуру классов для работы с иерархической сущностью Configuration. Формат может быть JSON или XML. Хранилищем может быть файловая система или СУБД.
Шаг 1: попробуем обобщить работу с хранилищем.
Примечание: т.к. решения пока нет, то я не буду рисовать детальных диаграмм классов. В процессе поиска решения будут только общие наброски. Для рисования диаграмм я использую инструмент draw.io Pro (доступен в виде приложения для Google Drive).
Примечание: т.к. решения пока нет, то я не буду рисовать детальных диаграмм классов. В процессе поиска решения будут только общие наброски. Для рисования диаграмм я использую инструмент draw.io Pro (доступен в виде приложения для Google Drive).
В данной архитектуре плохо то, что JSONFileConfiguration и JSONDBConfiguration дублирует в себе код для работы с JSON. Аналогично дублируют код для работы с XML классы XMLFileConfiguration и XMLDBConfiguration.
Шаг 2: попробуем обобщить работу с форматом.
Теперь обратная ситуация. Классы FileJSONConfiguration и FileXMLConfiguration дублируют в себе код для работы с файлами. А классы DBJSONConfiguration и DBXMLConfiguration дублируют в себе код для работы с базой данных.
Шаг 3: множественное наследование позволило бы решить проблему шагов 1-2.
Но не все языки поддерживают множественное наследование.
В список языков, поддерживающих множественное наследование, входят: Eiffel, C++, Dylan, Python, Javascript (например dojo.declare), Perl, Curl, Common Lisp (благодаря CLOS), OCaml, Tcl (благодаря Incremental Tcl), а также Object REXX и Ruby (за счёт использования классов-примесей).
Шаг 4: обойти поддержку множественного наследования можно с помощью композиции (короткий пример композиции на языке Objective-C).
Пока остановлюсь на этом шаге...
Шаг 3: множественное наследование позволило бы решить проблему шагов 1-2.
Но не все языки поддерживают множественное наследование.
В список языков, поддерживающих множественное наследование, входят: Eiffel, C++, Dylan, Python, Javascript (например dojo.declare), Perl, Curl, Common Lisp (благодаря CLOS), OCaml, Tcl (благодаря Incremental Tcl), а также Object REXX и Ruby (за счёт использования классов-примесей).
Шаг 4: обойти поддержку множественного наследования можно с помощью композиции (короткий пример композиции на языке Objective-C).
Пока остановлюсь на этом шаге...