Недостаток большого списка инициализации? - PullRequest
5 голосов
/ 09 февраля 2012

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

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

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

Ответы [ 4 ]

8 голосов
/ 09 февраля 2012

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

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

8 голосов
/ 09 февраля 2012

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

Большая проблема, очевидно, в том, что у вас есть классы с 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;
}
3 голосов
/ 09 февраля 2012

Это похоже на хорошо известный анти-паттерн Объект Бога .Цитата в вики:

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

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

Итак, ответ на вопрос «что может быть недостатком большого списка инициализации (по сравнению с небольшим)»может быть " Это большой, так что, возможно, это плохой стиль. "

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

0 голосов
/ 09 февраля 2012

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

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

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