Предоставление интерфейса для объектов внутри объектов

Я создаю модель, как в 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);

Вопрос дампа, но должен ли он зависеть от того, сколько операций фактически поддерживают составляющие объекты? Кроме того, так как мы это, это также пример шаблона дизайна фасада?

Мои опасения:

  • Первый подход может вырастить основной объект до очень большого объекта. Мы действительно хотим такой большой объект с таким количеством методов?
  • Это звучит как модель пирамиды, где функции каскадно спускаются по цепочке. Это не рекомендуется? Кажется, я помню это, но я могу ошибаться.
  • Второй подход позволяет внешнему клиентскому модулю напрямую обращаться к его подкомпонентам, не уверен, что это совсем плохо?

Пожалуйста, учтите, что составляющие объекты намного больше, чем просто две руки робота выше, и у них больше методов.

0

Решение

Я думаю, что обычно лучше инкапсулировать данные и поведение и позволить каждому классу поддерживать их, чтобы вы не создавали прочных отношений между ними.
Поэтому лучше всего было бы, чтобы View вызывал Robot.MoveLeftArm и RobotMoveRightArm, а Robot — это тот, который отправлял бы сообщение в Arms, которое выполняло бы фактическое движение.
Таким образом, вызов и реализация перемещения руки инкапсулированы в руке, и это может измениться, не затрагивая вид.
Существуют также варианты, чтобы интерфейсы определяли поведение и позволяли классам фактически реализовывать это поведение, создавая, таким образом, контракт между ними.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector