Проектирование архитектуры классов для работы с иерархической сущностью

Задача: спроектировать архитектуру классов для работы с иерархической сущностью Configuration. Формат может быть JSON или XML. Хранилищем может быть файловая система или СУБД.


Шаг 1: попробуем обобщить работу с хранилищем.

Примечание: т.к. решения пока нет, то я не буду рисовать детальных диаграмм классов. В процессе поиска решения будут только общие наброски. Для рисования диаграмм я использую инструмент 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).


Пока остановлюсь на этом шаге...