Прямой доступ к вложенным классам и структурам в C ++

0

В моем коде следующий шаблон повторяется:

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.

  • 7
    А вопрос такой?
  • 0
    Извините, я случайно нажал "Отправить", прежде чем закончить писать вопрос.
Показать ещё 1 комментарий
Теги:
design-patterns

1 ответ

0

Не может быть чистого общего решения этой проблемы; вы должны решить, как инкапсулировать вещи таким образом, который имеет смысл в контексте вашего проекта.

Если mesh используется для вещей, отличных от построения Assembler, она должна, вероятно, быть членом Assembler. Если для построения Assembler требуется так много параметров, что конструктор нечитабелен, то создание AssemblerParam будет таким же сложным, поэтому AssemblerParam не решит эту проблему. Могут быть подмножества набора параметров, которые могут быть объединены в простые контейнеры без сложных методов, но это зависит от особенностей вашего дела.

  • 0
    AssemblerReader строит AssemblerParam с указанием имени файла. Я также могу заполнить код AssemblerParam. То есть, AssemblerParam объединяет способ создания экземпляра Assembler.
  • 0
    @DanielAlvesPaladim: Тогда почему бы не заставить AssemblerReader создавать Assembler напрямую? (Я не уверен, что означает «заполнить код AssemblerParam» .)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню