Длинные списки инициализации конструктора - PullRequest
11 голосов
/ 03 июля 2010

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

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

myConstructor(var1, var2, var3, ..., varN) :
 member1(var1),
 member2(var2),
 member3(var3),
 ...
 memberN(varN)

Ответы [ 3 ]

7 голосов
/ 03 июля 2010

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

Один из способов заключается в рефакторинге: например, вместо передачи в 4Примитивные переменные ("top", "left", "width" и "height") просто передаются в одну составную переменную ("rectangle").

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

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)
    {
    }
};
5 голосов
/ 03 июля 2010

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

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

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

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

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

Когда вы объявляете их в заголовочном файле, вы (или не могли бы) сгруппировать их с комментариями?Например: // These next few parameters are for file IO и // These next parameters are for the widget, которые предоставят вам хороший шаблон, для которого объекты абстрагируются.

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

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

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

2 голосов
/ 03 июля 2010

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

...