长构造函数初始化列表

时间:2010-07-03 12:51:58

标签: c++ initialization whitespace

你如何处理它们?我有一些类(通常是持有统计数据的类等),有20多个变量成员,初始化列表最终会很长,如果我不手动环绕,则会超出页面宽度。你是试着打破这些课程还是以其他方式解决这个问题?

它看起来不是很整洁,但有时我会将列表中的变量写在彼此之上,如下所示:

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

3 个答案:

答案 0 :(得分:7)

  

如果我不手动环绕

,初始化列表会很长,超出页面宽度

一种方法是重构:例如,不要传入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)
    {
    }
};

答案 1 :(得分:5)

  

超出页面宽度

嗯,首先,您应该决定页面宽度并坚持下去。如果需要,可以使用编辑器中的自动换行。读取大于窗口大小的代码确实很困难,尤其是对于使用终端的vi或emacs的同事而言。选择页面宽度并坚持下去 - 这意味着将这些初始化程序列表包装到多个(可能很多)行上。

  

你试着分解这些课吗?

20是很多参数,它可能值得分解。 “上课”通常是代码气味,表明重构是必要的。

它并不自动意味着你应该解决问题,指南总是有例外。但是,绝对认为它是一种选择。

当你在头文件中声明它们时,你(或者你可以)用评论对它们进行分组吗?例如:// These next few parameters are for file IO// These next parameters are for the widget,它将为您提供一个好的模板,以便为哪些对象提取抽象。

总的来说,非常大的类表示很多复杂的状态,复杂的状态往往会导致错误。你应该像功能一样,更喜欢让它们保持小巧和专注。

  

{您的示例代码}

我认为它具有很强的可读性和“整洁性”,尽管它可能很长。正如我所提到的,为了解决这个问题,我会考虑将其分解为更小的类。

答案 2 :(得分:2)

任何具有二十个构造函数参数的类都可能需要重构。我会考虑使用composition,将大班分成更小的独立作品。考虑哪些构造函数参数紧密相关,并将这些变量分组到它们自己的类中。然后,您可以将新类的实例传递给需要访问数据的类。