代码之家  ›  专栏  ›  技术社区  ›  Haoest

有时我不明白为什么我们要把每个字段都设置为私有,然后为它们创建受保护的或公共的getter[关闭]

oop
  •  0
  • Haoest  · 技术社区  · 14 年前

    我不认为我是一个彻头彻尾的笨蛋,但你有时觉得我们在私有化土地上做得有点过火了吗?你是否有一个很好的经验法则,当一个字段绝对必须是私有的,什么时候(也许)可以标记它受保护,或者是公共的?

    有时候很明显这件事让我感动。

    讨论

    2 回复  |  直到 11 年前
        1
  •  6
  •   cHao    11 年前

    简单规则:

    接口应该是公共的。实现应该是私有的。

    当您将字段公开(甚至受保护)时,实际上是将其声明为接口的一部分。问题是,它是一个实现细节——在几乎所有情况下,该字段对代码都有意义。任何想设置它的人都可以,但你必须仔细解释如何设置它,以防止整个东西崩溃和燃烧。您甚至不能在设置时验证它,所以您需要在使用它之前每隔…一次…验证它,这可能会破坏性能,具体取决于验证需要如何进行。(即使那样,也不能保证球场 停留 有效,因为你甚至不能强制同步访问它。)而且每个使用你的类的人都必须做同样的事情,因为$deity只知道其他代码在这个字段上乱搞了什么,可能会破坏它。

    最重要的是,一旦它是一个字段,人们就会编写期望使用该字段的代码。在以后您发现需要进行任何验证的情况下,您不能将字段转换为getter/setter而不破坏二进制兼容性(也就是说,任何使用您的代码的人都必须重新编译使用该字段的所有内容才能使其再次工作)。这样做太多次,人们会害怕使用您的API——请阅读:您将没有任何用户。

    getter和setter将实现与接口分离。它们允许呼叫者返回一些绝对有效的内容,并让您确保输入的内容绝对有效。这使得事情更容易预测,更稳定。所以,如果你写了代码,在你写了它之后会用到它, 非平凡 getter和setter(用于验证值,或者同步等)是一个好主意——即:不仅仅是盲目地获取和设置一个变量。

        2
  •  2
  •   Fosco    14 年前

    当其他人将要使用您的代码或类时,这是为了解决这个问题。您可以准确地公开和控制要连接的内容以及“内部”内容。

    如果你是唯一一个会使用你的代码的人,那么是的,这常常是“太过分了”。

    我甚至会因为建议而受到攻击,但不管怎样…