公共变量糟糕的做法与Getters和Setters功能相比?

Pri*_*ock 11 c++

我在他的小溪中偶然发现了这一点,这就像一个痛苦的拇指一样向我伸出.我想也许如果我保存视频并在将来回到它时我会更加熟练,我会理解它,但它只是一直困扰着它.这是视频......

它会自动从1:13:00开始.

https://youtu.be/uHSLHvWFkto?t=4380

作为C/C++的新程序员,在听到这个之后,它完全扭曲了我的思维方式.由于他是一名专业人士而且我应该接受建议,但我需要一些清晰度.从网站,视频到书籍,我已经读过使用公共变量是一种不好的做法,但是从我从这个视频中得到的结果却不然.在视频中,他使用的结构默认情况下具有"公共"的访问修饰符与默认访问"私有"的类.有没有我在这里无法理解的东西.

我不知道该怎么办.如果我公开我的变量,我不会冒险模糊吗?他说他会自动解雇某人以格式编码的方式对我来说哈哈!我应该真正使用哪一个?何时以及为何?

Max*_*kin 15

根据我的经验,人们没有充分的理由过度使用getter/setter.

人们可以想到两种主要的类:将相关数据组合在一起的类和其他提供行为的类.

必须使用没有公共数据成员的行为类进行封装.

数据类通常应该将数据成员公开且没有行为.

这两者之间的灰色区域是可变数据类,成员之间具有不变量或依赖关系,例如,如果member a为1,则member b必须在范围内[1-10].对于这种情况,使用getter/setter可能是合理的.对于不可变数据类,构造函数必须建立不变量.

  • "根据我的经验,人们过度使用吸气剂/安装者是没有充分理由的." 但愿如此.民间常常这样做而没有意识到它绕过了封装. (4认同)

344*_*442 10

首先,a struct完全等同于a class,但默认成员访问权限public而不是private.

现在,在面向对象编程(OOP)中,拥有数据成员(变量)并不是一种好习惯public,因为这使得所有代码都依赖于内部class,从而打破了OOP的原始原则,即... .

神圣和神圣的封装

封装是一种编码理念,它表明类应该兼顾数据和在单个紧密实体中管理它的代码.也就是说,你不访问数据directy,而是你使用的方法class操纵这些数据.这有几个设计优势,例如您可以知道除了类中的代码之外的任何代码都可能包含有关此类信息操作的错误.

现在,get()ers和set()ers,也称为访问者,是一个完整的谎言!有了访问器,当你破坏它时,你会欺骗自己以为你尊重封装!它增加了膨胀,不必要的冗长,错误,以及除了封装之外的一切.取代具有的同和,它有一个一个或无论你想将它命名.class Personunsigned getAge()void setAge(unsigned)unsigned getAge() void incrementAge()

现在,问题的核心......

"平原旧"结构

封装并不总是需要的.虽然你应该(通常)没有做这个头文件(再次,至少一些封装位),您可以创建静态普通的老式structS中的专用于单个翻译单元.我的建议是让它们比现在更"老",即..

  • 所有数据成员都是public.
  • 没办法.
  • 没有构造函数(隐式的除外).
  • 继承总是公开的,只允许来自其他普通的旧struct的.
  • 我再说一遍,不要把它们放在头文件上!

现在,普通旧structs的另一个用途是(具有讽刺意味的)元constexpr数据导出数据和类型,也称为现代 - 硬核 - 模板 - 元编程 - 无需任何类型 - public例如......

template<bool B, typename T>
struct EnableIf {};

template<typename T>
struct EnableIf<true, T> {
    typedef T type;
};

template<bool B, typename T>
using SFINAE = typename EnableIf<B, T>::Type;
Run Code Online (Sandbox Code Playgroud)


Bat*_*eba 5

如果将数据成员公开,则很难控制对象的内部一致性.

运行良好的是使用构造函数来设置对象的状态,然后使用公共函数来检索成员变量的值,但仅在需要时才使用.如果您需要在构造后改变对象,那么为此提供非常具体的方法.

但是,如果您的对象不过是聚合正交数据类型的对象,那么对所有成员使用公共访问:a struct适用于此.

请注意,a 和a 之间的唯一区别在于,前者是默认访问,而后者是.structclasspublicprivate