Решил сперва строить объектную модель конфига, чтобы проще было его модифицировать (ибо задачи не совсем тривиальные, в частности, "склейка" конфига из разных "кусочков" с разрешением конфликтов и т.д.). Для чего организовал иерархическую (древовидную) коллекцию с итераторами.
Так вот, столкнулся с тем, что класс коллекции изрядно "разбух", что не очень способствует понятности кода.
Методы по назначению можно поделить на несколько групп:
- Навигация по коллекции (перемещение внутреннего указателя тудым-сюдым, вверх-вниз и т.д.)
- Работа с общими свойствами элемента, касающимися структуры (getIndex, getPath, getLevel, getParent, size и т.д.)
- получение ссылок на элементы коллекции (next, prev, current, getChildByIndex и т.п.)
- операции над элементами коллекции (appendElement, prependElement, pushChild и т.д.)
- поиск по коллекции
- разрешение конфликтов (убираем конфликтующие директивы и т.п.)
- операции над коллекцией (collectionClone, collectionUnset...)
Как бы эту задачку обобщения решить покрасивше?
Последовательно наследовать классы, потихоньку добавляя функционал, на мой взгляд, как-то архитектурно ущербно. Множественного наследования нету. Само собой напрашивается использование типажей (traits), но это привяжет к версии 5.4 (сам сейчас пользуюсь 5.3 и переустанавливать пока желанием не горю). Вроде бы, самый удачный вариант - использовать композицию (особенно в сочетании с сокрытием делегирования). Но тогда в самой коллекции опять таки будет куча делегирующих методов.
На ум напрашивается механизм перегрузки методов. Что, если использовать его для "совсем скрытого делегирования"? Т.е. делегирующие методы не объявлены, а их вызовы обрабатывать при помощи магического метода __call()? А если вызываемого метода нету, то бросать исключение?
Или можно как-то элегантнее проблему решить? Посоветуйте, пожалуйста!
Благодарю!
_____________