Взаимная дружба и указатели: что это за паттерн или анти-паттерн? - PullRequest
3 голосов
/ 04 декабря 2010

Изучая исходный текст массивного приложения на C ++, я нахожу этот шаблон (синтаксис для примера может быть отрывочным, но есть важные детали):

class A  :  X
   friend B;
   B *parent;
   ...stuff...

class B  : Y
   friend A;
   A *myhelper;
   ...stuff...

Возможно, имеет смысл, что класс B действительно называется AHelper, но мне более любопытно это довольно симметричное отношение между двумя классами. Является ли это частью одного из стандартных шаблонов GoF или установленного анти-шаблона? Есть ли какая-то концепция или способ понимания этого, кроме деталей, в целом больше, чем частей?

Имеет ли смысл объединять А и В в один класс? Дело в том, что каждый класс наследуется от других классов X, Y. Я хочу реорганизовать этот код, чтобы сделать его более удобным для обслуживания и меньшим.

Ответы [ 2 ]

4 голосов
/ 04 декабря 2010

Зависит от того, что делают классы. Если это что-то вроде шаблона итератора (то есть std::vector<t> и std::vector<t>::iterator), то его можно использовать для чего-то хорошего.

С другой стороны, если классы делают принципиально разные вещи, вероятно, будет лучше, если они будут открыты друг другу только через свои открытые интерфейсы.

Другими словами, я не думаю, что это шаблон или анти-шаблон - он полностью зависит от использования соответствующих классов.

0 голосов
/ 08 декабря 2010

A и B тесно связаны, но их время жизни может быть разным. Возможно, стоит сделать из одного класса, если:

  • A и B имеют одинаковое время жизни, поэтому одно всегда существует вместе с другим.
  • Всегда есть один экземпляр A для каждого экземпляра B и наоборот.

Однако может быть, что это не так.

Учитывая, что A происходит от X, а B - от Y, когда у меня есть совместно связанные классы, обычно это базовые классы, которые связаны, и каждый класс не взаимодействует с фактическим конкретным классом другого.

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

Я не знаю, есть ли у шаблона имя. Я никогда не был в восторге от имен шаблонов дизайна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...