Длинные списки инициализации конструктора

Как Вы имеете дело с ними? У меня есть некоторые классы (обычно классы, которые содержат статистику и т.д.) приблизительно с 20 + переменные участники, и списки инициализации заканчиваются очень долго, расширяясь вне страницы width, если я вручную не повторяюсь. Вы пытаетесь сломать такие классы или заключить Вас сделка с этим некоторым другим способом?

Это не выглядит очень опрятным, но иногда я пишу переменные в списке друг на друге как так:

myConstructor(var1, var2, var3, ..., varN) :
 member1(var1),
 member2(var2),
 member3(var3),
 ...
 memberN(varN)
11
задан James Webster 30 August 2013 в 14:33
поделиться

3 ответа

выходят за пределы ширины страницы

Ну, во-первых, вам, вероятно, следует выбрать ширину страницы и придерживаться ее. Если хотите, используйте автоматический перенос строк из вашего редактора. Чтение кода, размер которого превышает размер вашего окна, действительно сложно, особенно для ваших коллег, использующих vi или emacs с терминалов. Выберите ширину страницы и придерживайтесь ее - это означает перенос этих списков инициализаторов на несколько (возможно, много) строк.

Вы пытаетесь разбить такие классы?

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

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

Когда вы объявляете их в заголовочном файле, вы (или можете ли вы) группируете их с комментариями? Например: // Следующие несколько параметров относятся к файлу IO и // Следующие параметры относятся к виджету , который предоставит вам хороший шаблон для того, какие объекты выглядят отвлеченный.

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

{Ваш пример кода}

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

5
ответ дан 3 December 2019 в 08:28
поделиться

списки инициализации оказываются очень длинными, выходя за пределы ширины страницы, если я не оборачиваю вручную

Один из способов - провести рефакторинг: например, вместо передачи 4 примитивных переменных («верх», «влево», «ширина» и «высота») просто передайте одну составную переменную («прямоугольник»).

В качестве альтернативы, просто для макета исходного кода:

class Foo
{
    int m_a;
    int m_b;
    int m_c;
public:
    Foo(
        int a,
        int b,
        int c
        )
        : m_a(a)
        , m_b(b)
        , m_c(c)
    {
    }
};
7
ответ дан 3 December 2019 в 08:28
поделиться

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

2
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: