Это определенно субъективно, но я хотел бы попытаться избежать этого становясь аргументированным. Я думаю, это может быть интересный вопрос, если люди относятся к нему надлежащим образом.
В моих нескольких недавних проектах я использовал для реализации архитектуры, где длинные цепочки делегирования - обычная вещь.
Две цепи делегирования встречаются очень часто:
bool Exists = Env->FileSystem->FileExists( "foo.txt" );
И тройное делегирование вообще не редко:
Env->Renderer->GetCanvas()->TextStr( ... );
Существуют цепочки делегирования более высокого порядка, но их действительно мало.
В вышеприведенных примерах не выполняются проверки времени выполнения NULL, так как используемые объекты всегда присутствуют и имеют жизненно важное значение для функционирования программы и явно созданная при запуске выполнения. В основном я использовал разделение цепочки делегирования в этих случаях:
1) Я повторно использую объект, полученный через цепочку делегирования:
{ // make C invisible to the parent scope
clCanvas* C = Env->Renderer->GetCanvas();
C->TextStr( ... );
C->TextStr( ... );
C->TextStr( ... );
}
2) Промежуточный объект где-то в середине цепочки делегирования должен быть проверен для NULL перед использованием. Например.
clCanvas* C = Env->Renderer->GetCanvas();
if ( C ) C->TextStr( ... );
Я использовал для борьбы с случаем (2) путем предоставления прокси-объектов, чтобы метод мог быть вызван для объекта, отличного от NULL, что приводит к результату empty
.
Мои вопросы:
- Является ли один из случаев (1) или (2) шаблоном или антипаттерном?
- Есть ли лучший способ справиться с длинными цепочками делегирования в С++?
Вот некоторые плюсы и минусы, которые я рассматривал при выборе:
Плюсы:
- это очень описательно: это понятно из 1 строки кода, где объект появился из
- длинные цепочки делегирования выглядят хорошо
Минусы:
- выполняется интерактивная отладка, так как трудно проверить более одного временного объекта в цепочке делегирования
Я хотел бы узнать другие плюсы и минусы длинных цепочек делегирования. Пожалуйста, представьте свои аргументы и голос, основываясь на том, насколько хорошо аргументировано мнение, а не насколько хорошо вы с ним согласны.