Я изучаю динамику многотельных систем и пытаюсь применить ОО-методы к моей работе по моделированию различных механических систем. Одна вещь, с которой я сталкиваюсь в своей работе, состоит в том, что имеет смысл создать несколько классов строительных блоков, которые используются в качестве частных переменных-членов в классах более высокого уровня, которые представляют более сложные системы.
С чем я борюсь, так это то, что общая задача численного анализа - это анализ параметров - по сути, анализ того, как меняется поведение системы при изменении ее параметров. С иерархической вложенностью, навязанной композицией, каков наилучший способ обеспечить точный контроль параметров в переменных частного члена, которые составляют более сложный объект? Возвращение ссылки, которую я знаю, нахмурилось, но единственная другая альтернатива, которую я вижу, - это либо многократно восстанавливать высокоуровневые объекты, либо предоставлять множество установщиков / аксессоров обертки, которые устанавливают / получают данные закрытого члена (и, возможно, имеют некоторую логику для обеспечения данных целостность).
Вот типичный пример:
template <typename T>
class fooA {
public:
/* setters, getters, etc... */
private:
T w,x,y,z;
};
template <typename T>
class fooB {
public:
/* setters, getters, etc... and maybe ways to set/get private members of type class A */
private:
T d, e, f, g, h;
fooA<T> i, j, k;
};
Каков наилучший (или предпочтительный) способ настройки w, x, y, z, данных приватных i, j, k членов класса fooB? Написать сеттеры / геттеры в классе fooB, или вернуть ссылку, или что-то еще? Обычный вариант использования в моем приложении - это создание параметра для величин w, x, y, z члена i экземпляра fooB.
EDIT:
Объект, который я моделирую, представляет собой велосипед, который я описываю в общей сложности с 31 параметром. 30 из этих параметров имеют передний и задний аналог, поэтому я решил создать класс для представления этих 15 параметров, а затем в классе велосипеда есть два из них как частные переменные-члены. 11 из этих 15 параметров могут быть сгруппированы в набор параметров, которые могут иметь смысл в свой собственный класс, поэтому я снова группирую их в класс и делаю его частным членом класса с 15 параметрами. И в пределах этого класса 6 из этих 11 параметров могут быть далее объединены в их собственный класс. Итак, у меня по сути четыре уровня вложенности. Итак, если клиент велосипедного класса самого высокого уровня хочет настроить один из параметров на самом низком уровне (что типично для моего приложения), он может:
- создать совершенно новый объект, передав новый параметр в конструкторе
- Я могу предоставить сеттеры / геттеры на некотором уровне детализации, возможно, вплоть до самого низкого уровня. Если я предоставляю сеттеры с наименьшим уровнем детализации, мой класс высокого уровня становится немного беспорядочным, и, как упоминалось во многих публикациях, это, вероятно, не очень хороший дизайн. Но я не уверен, как иначе разрешить доступ.
Возможно, мне следует сгладить иерархию и превратить все различные классы, которые я упомянул, в переменные-члены класса велосипедов верхнего уровня, а не вкладывать их так много? Это привело бы к большему количеству переменных-членов класса велосипеда, но меньше вложенности, и сделало бы написание метода установки / получения для класса велосипеда более простым. Мысли?