В моем коде следующий шаблон повторяется:
class Assembler {/*...*/}; //does something, in this case assembles a matrix
class AssemblerParam {/*...*/}; //contains the parameters needed to create
//an object of the Assembler class
class AssemblerReader {/*...*/}; //reads a file and creates an
//object of AssemblerParam
Я понял, что это можно организовать намного лучше, вставив AssemblerParam и AssemblerReader внутри Assembler (плюс некоторые преимущества для общего программирования)
class Assembler {
public:
class Param { /*...*/ };
class Reader{ /*...*/ };
private:
Param parameters;
};
Однако теперь реализация методов Ассемблера намного менее читаема для таких вещей
void Assembler::method() {
parameters.mesh.method(parameters.member.method());
//the code now is cluttered with the word "parameters"
}
Вместо этого я хотел бы, чтобы мой код читал:
void Assembler::method() {
mesh.method(member.method()); //a lot more readable
}
Любое решение?
Замечание 1 Используя наследование, подобное этому
class AssemblerParam{/*...*/};
class Assembler : public AssemblerParam { /*...*/ };
поможет справиться с удобочитаемостью, но загрязнит мое пространство имен классами SomethingParam.
Не может быть чистого общего решения этой проблемы; вы должны решить, как инкапсулировать вещи таким образом, который имеет смысл в контексте вашего проекта.
Если mesh
используется для вещей, отличных от построения Assembler
, она должна, вероятно, быть членом Assembler
. Если для построения Assembler
требуется так много параметров, что конструктор нечитабелен, то создание AssemblerParam
будет таким же сложным, поэтому AssemblerParam
не решит эту проблему. Могут быть подмножества набора параметров, которые могут быть объединены в простые контейнеры без сложных методов, но это зависит от особенностей вашего дела.
AssemblerReader
создавать Assembler
напрямую? (Я не уверен, что означает «заполнить код AssemblerParam» .)