【问题标题】:Is it a good practice for a class to have only public (no private or protected) methods and variables? [closed]一个类只有公共(没有私有或受保护)方法和变量是一种好习惯吗? [关闭]
【发布时间】:2021-03-25 23:53:09
【问题描述】:

最近我正在为学校课程做一个项目。我总是在每个类 public 中声明所有变量和方法,因为它可以帮助我在开发时更轻松地访问这些变量,并减少 get();set(); 函数的编码。但是,我认为这是做 OOP 的错误方式。有什么想法吗?

【问题讨论】:

  • 了解封装。变量应该是私有的
  • 从长远来看,如果您将所有内容设为私有并且仅在需要时公开,将会更容易。但是,什么是开始然后重构的最佳方式是基于意见的。原则上没有错,只有公共成员的类
  • @BartekBanachewicz 这有点苛刻。
  • 向成员提供 get/set 被某些人视为反模式。

标签: c++ access-modifiers


【解决方案1】:

Getter/Setter 有时很有用,但聚合也很有用。

如果您有一个聚合,您应该愿意接受与您的数据字段类型匹配的任何数据。如果您想保持不变量(宽度>高度)并在代码的其他地方假设它,您将需要访问器。

但是不假定不变量的代码通常更容易使用,甚至更不容易出错;手动维护不变量可能会变得非常困难,因为即使一次搞砸或妥协也会使不变量为假。

老实说,getter/setter 的最大优势是模拟(制作测试工具)并在访问/修改处设置断点。代码量等方面的成本是真实的,并且让您编写的更多代码不是样板代码是有价值的。

那么非“实时”渲染的矩形上的宽度/高度字段?默认为公共数据。用于存储手写数据的缓冲区optional<T>?私有数据和访问者。

应该使用访问器来减少您自己(或代码阅读器)的认知负担。写有目的的代码,不要写没有目的的代码。

现在您仍然想知道如何编写 getter/setter,因此练习愚蠢的“矩形宽度/高度”案例是有价值的。并且学习 LSP 问题,虽然 ReadOnly 正方形是一种 ReadOnly rect,但 ReadWrite 正方形不是一种 ReadWrite 矩形可能最好通过经验来完成(或者可能不是,因为有很多人体验过但不学习课)。

【讨论】:

  • 不完全相同,但存在数据断点。模拟通常需要virtual,这也是有代价的。
【解决方案2】:

这与encapsulation 的原则有关,从相关类(“你”)的角度来看,暴露内部意味着:

  • 您无法控制写入这些字段的内容
  • 如果这些字段被访问,您不会收到通知
  • 如果这些字段发生更改,您不会收到通知
  • 您永远不能相信这些值是有效的
  • 您无法更改这些值的类型而不影响使用它们的任何代码

当你封装你控制对这些属性的访问意味着:

  • 您可以防止更改
  • 您可以在写入之前进行验证,并拒绝无效值
  • 只要 get/set 函数的行为方式仍然相同,您就可以更改内部表示而不会有任何后果
  • 您可以在写入值之前清理它们
  • 您确信这些值在任何时候都是有效的,因为您是看门人
  • 您可以在进行更改之前或之后添加其他行为,例如observer pattern

这并不是说你必须一直使用封装。在很多情况下,您想要没有任何花哨的“哑数据”,它只是一个传递东西的容器。

在 C++ 中,这经常导致使用 struct 作为“哑数据”,因为默认情况下所有字段都是公共的,而 class 作为“智能数据”,因为默认情况下字段是 private,即使分开从访问默认值来看,这两件事在很大程度上是可以互换的。

【讨论】:

    猜你喜欢
    • 2020-07-14
    • 2012-03-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2017-01-20
    • 2023-04-08
    • 1970-01-01
    • 2016-09-09
    相关资源
    最近更新 更多