Недостаток большого списка инициализации?

У моего работодателя принято использовать списки инициализации в конструкторе, потому что это более эффективно.

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

Помимо удобочитаемости, в чем недостаток большого списка инициализации?


person Community    schedule 09.02.2012    source источник
comment
Кроме читабельности? Я ничего не могу придумать, кроме вероятности ошибки.   -  person Mooing Duck    schedule 09.02.2012
comment
Подсказка: если у вас 45 атрибутов участников, возможно, вы неправильно распределяете обязанности.   -  person David Rodríguez - dribeas    schedule 09.02.2012


Ответы (4)


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

Более серьезная проблема, очевидно, заключается в том, что у вас есть классы с 45 элементами данных. Ничто не сделает работу с такими классами особенно легкой.


AClass::AClass( type1 val1
              , type2 val2
              // ...
              , type45 val45 )
: mem1( val1 )
, mem2( val2 )
// ...
, mem45( val45 )
{
}

Я утверждаю, что это не менее читабельно, чем:

AClass::AClass( type1 val1
              , type2 val2
              // ...
              , type45 val45 )
{
    mem1 = val1;
    mem2 = val2;
     // ...
    mem45 = val45;
}
person CB Bailey    schedule 09.02.2012

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

Похоже, вам может понадобиться разбить свой класс на отдельные функциональные части и делегировать класс «контроллер» на подклассы. Это значительно уменьшит сложность вашего кода.

person Nick Haddad    schedule 09.02.2012

Похоже на хорошо известный антипаттерн God object. Цитата из вики:

В объектно-ориентированном программировании объект-бог — это объект, который слишком много знает или слишком много делает.

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

Таким образом, ответом на вопрос "каковы недостатки большого списка инициализации? (по сравнению с маленьким списком)" может быть "Он большой, поэтому, возможно, это плохой стиль".

Ответом на вопрос "в чем недостаток большого списка инициализации? (по сравнению с большим телом конструктора)" может быть "нет", потому что инициализацию лучше выполнять в списке, а не в корпус, но читаемость и стоимость обслуживания те же (как по мне).

person Tim Kachko    schedule 09.02.2012
comment
Что из этого отвечает на вопрос о недостатках больших списков инициализации? - person Rob Kennedy; 09.02.2012
comment
Часть, в которой говорится, что если у вас большие списки инициализации, то это является проблемой. - person Nicol Bolas; 10.02.2012

Некоторые оптимизации не пройдут, подозреваю, что инлайнинг такого конструктора не сработает.

В любом случае: 45 элементов данных звучат много. Можете ли вы сгруппировать их таким образом, агрегированные объекты?

person Jörg Beyer    schedule 09.02.2012
comment
почему они потерпят неудачу со списком инициализаторов, а не без списка инициализаторов (где вы скопируете эти инициализации в тело)? - person KillianDS; 09.02.2012