Доброго времени суток.
Никто не в курсе, существует ли в Эрланге готовый шаблон проектирования для ситуации, когда есть несколько в значительной степени пересекающихся наборов данных и вещей, которых можно с этими данными делать?
В ОО-языке я бы, понятно, создавал иерархию классов, запихивая общие поля и методы в базовый класс, а специфичные для конкретных случаев --- в классы-наследники.
Насколько я понимаю, в Эрланге на смену объекту ОО-языка приходит функция с хвостовой рекурсией, разбирающая сообщения с помощью конструкции receive и вызывающая сама себя с состоянием процесса в качестве аргумента. А существует ли при этом аналог наследования или способ обходиться без него?
На ум приходит несколько решений, и каждое из них чем-нибудь да кажется уродливым:
-в функции, запускающей процесс "потомка" (модуля, работающего со специфичными для конкретного случая данными), spawn-ить процесс "родителя" (модуля, работающего с общими данными), запоминать его PID и передавать ему все сообщения, которые "потомок" не смог распарсить сам;
-для хранения состояния процесса определять структуру (в смысле запись, record) с общими данными, для полей и методов "потомка" выделить 2 списка или ETS и в "конструкторе" (т.е. функции, вызываемой при старте процесса) заполнять этот список кортежами вида {имя_поля, значение} и {имя_метода, метод}; при разборе сообщений каждый раз искать поля и методы в этой структуре;
-состояние процесса (аргумент рекурсивной функции, содержащей конструкцию receive) сделать замыканием (closure), возвращающим функцию-диспетчер, возвращающую, в свою очередь, поля и методы "объекта"; в функциях-диспетчерах "потомков" предусмотреть обращение к функции-диспетчеру "предка".
(Если получилось мутно, могу проиллюстрировать каждую из идей небольшим примером.)
Подозреваю, что правильное решение вообще не предполагает рукосуйной имитации ООП --- но мой искалеченный C++ мозг его не находит. =)
