【问题标题】:C++ operator setter ruby style [closed]C ++运算符设置器红宝石样式[关闭]
【发布时间】:2012-03-29 08:51:55
【问题描述】:

为什么人们不这样编码?红宝石风格!

#include <stdio.h>

class Name {
    public:
        void operator=(char *to) {
            name = to;
            printf("Change!\n");
        }
    private:
        char *name;
};

class Human {
    public:
        //char *name;
        Name name;
};

int main() {
    Human andreas = Human();
    andreas.name = "Andreas";
    printf("%s\n", andreas.name);
}

使用公共成员函数,直到您需要向 setter 添加一些内容。然后将其切换为带有 operator= 的类。

【问题讨论】:

  • 谁说没有?
  • 因为拥有公共数据成员违反了封装,例如。
  • @Andrew 这是在乞求问题。
  • @AndrewMarshall:像这样的绝对值的问题是总会有错误的实例。如果您有一个简单的数据类型,并且您知道永远不需要 getter/setter 将变量公开。在它周围添加“属性”只会给你的代码增加膨胀。
  • @Kaz 区别恰恰在于——语法!当然,您不能争辩说两者都具有同等的可读性……!他们绝对不是。举一个极端的例子,考虑任何 Java 代码(尤其是 GUI 脚手架),并将其与例如C#。如果您使用大量访问器进行编码,则具有更清晰的语法是决定性的优势。

标签: c++ ruby operators overloading setter


【解决方案1】:

使用公共成员函数,直到您需要向 setter 添加一些内容。然后将其切换为带有 operator= 的类。

因为如果当您需要更改它时,您的项目已经增长了数百倍,而现在您需要在很多不同的地方更改代码——甚至可能在其他项目中,如果您要发布一个库的话。

换句话说,你破坏了代码。 很多代码。

即使您现在不编写库,也总有机会在更通用的环境中重用某些代码。不要指望每段代码都会在本地使用。

除此之外,没有太大的动力为 setter 提供简单的语法,因为实际上很少需要 setter。现代 C++ 力求最小化对已创建对象的更改。这使得推理对象的状态以及一般的程序状态更容易。这反过来又降低了复杂性、错误和维护。

【讨论】:

    【解决方案2】:

    这样的开关会破坏界面,这是您通常想要避免的。

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      相关资源
      最近更新 更多