Я создаю модель, как в MVC, которая состоит из других объектов. Мой единственный основной объект модели содержит составляющий объект. Мой вопрос заключается в том, должен ли я задавать объект главной модели для всех операций, которые фактически будут выполняться составным объектом, или мне следует запрашивать составные объекты и выполнять его операции? Я вижу, что в первом подходе основная модель должна будет учитывать все операции составляющих ее модулей и приведет к добавлению многих функций, которые будут просто делегировать составляющим объектам.
Позвольте мне объяснить на примере, который очень близок к тому, что я делаю. Этот код ниже на лету, поэтому, пожалуйста, игнорируйте синтаксические ошибки C ++, если таковые имеются.
class Arm
{
public:
Move(int x, int y);
}
class Robot
{
public:
Arm leftArm;
Arm rightArm;
// should this function be there?
MoveLeftArm(int x, int y)
{
leftArm.Move(x,y);
}
// and likewise this?
MoveRightArm(int x, int y)
{
rightArm.Move(x,y);
}
}
// in the view when I want to move robot arms, should I do this
robot->MoveLeftArm(x,y);
//or this
robot.leftArm.Move(x,y);
Вопрос дампа, но должен ли он зависеть от того, сколько операций фактически поддерживают составляющие объекты? Кроме того, так как мы это, это также пример шаблона дизайна фасада?
Мои опасения:
Пожалуйста, учтите, что составляющие объекты намного больше, чем просто две руки робота выше, и у них больше методов.
Я думаю, что обычно лучше инкапсулировать данные и поведение и позволить каждому классу поддерживать их, чтобы вы не создавали прочных отношений между ними.
Поэтому лучше всего было бы, чтобы View вызывал Robot.MoveLeftArm и RobotMoveRightArm, а Robot — это тот, который отправлял бы сообщение в Arms, которое выполняло бы фактическое движение.
Таким образом, вызов и реализация перемещения руки инкапсулированы в руке, и это может измениться, не затрагивая вид.
Существуют также варианты, чтобы интерфейсы определяли поведение и позволяли классам фактически реализовывать это поведение, создавая, таким образом, контракт между ними.