Насколько это может быть плохой практикой? [круговая зависимость]

(В первую очередь, извините за мой английский)

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

Исходная ситуация:

class B;

class A
{
B needed;
};

class B {};

Выход:

B has an incomplete type.

«Решение»:

template<typename T = class B>
class tricky_A
{
static_assert(is_same<T, B>::value, "Too tricky!!");

T needed;
};

class B {};

using A = tricky_A<>;

int main()
{
A a;  // At the instantiation point, B isn't an incomplete type.
}

Выход:

No problems.

Распространенным решением является использование указателей, но я вижу две проблемы, когда они вам действительно не нужны:

1) Если вы решили сохранить указатель на другие локальные объекты, вы должны быть уверены (или пользователь вашего класса должен быть уверен), что жизнь вашего объекта короче, чем жизнь «сохраненного» объекта.

2) Если вы решили работать с динамической памятью, вам следует потратить время на резервирование и разрушение памяти, и, кроме того, это заставляет вас заниматься обработкой исключений, чтобы сделать ваш код безопасным.

*) Более длинный код; меньшая читаемость; более жесткое обслуживание; и т.п.

Должен ли я использовать это «решение» или лучше искать другое?

РЕДАКТИРОВАТЬТы в порядке. Это не настоящая круговая зависимость, поэтому спрашивать нечего. Этот вопрос можно закрыть.

EDIT2: Лучший вопрос Вот.

-1

Решение

Я думаю, что использование указателей (и я согласен с @Andy Prowl RE: умные указатели) является предпочтительным решением. Что касается вашего мнения о более длинном коде, меньшей читаемости, более сложном обслуживании — ваше «хитрое» решение, хотя и умное, нарушает всех этих арендаторов — оно длиннее, труднее для чтения и сложнее в обслуживании. Разработчик C ++ среднего уровня должен знать, как обращаться с указателями и умными указателями, однако трудно ожидать, что они поймут предложенное вами шаблонное решение.

Я также не вижу круговой зависимости в вашем примере; Я предполагаю, что B также зависит от A, хоть.

Важные вещи, которые следует помнить при работе с таким дизайном:

  • Разделение заголовка и тела полезно
  • Предпочитаю делать #includes в следующем порядке: тело #includes, прямая ссылка #includesи, наконец (при необходимости), заголовок #includes
1

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

Предпосылка вашего дизайна неверна. Поскольку в вашем коде нет циклической зависимости, исправлять нечего (кроме определения B до A) и никакой дополнительной работы не требуется.

Если вы исправите свой тестовый пример, чтобы он содержал реальную циклическую зависимость, вы обнаружите, что ваш решение не решает это. Так что в основном у вас есть больше кода, который является более сложным и все та же проблема.

Также обратите внимание, что правильный способ справиться с круговой зависимостью — сломать ее. Как только круговая зависимость исчезла, необходимость в ее управлении также исчезла. Очень мало хороших дизайнов, которые содержат реальную циклическую зависимость.

1

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