什么时候使用公共字段有意义?

2022-09-01 20:39:54

这是我一段时间以来一直有的问题:

什么时候公开一个领域是有意义的?

public class SomeClass()
{
   public int backing;
}

这样做的缺点(除了激怒OOP精英之外)是,如果您需要在此数据之上添加任何逻辑,则必须对API进行重大更改。我想这就是精英主义者所讨论的。

Java 和 C# 中的最佳实践长期以来一直是使用 getters/setter 或属性来访问字段。

public class SomeClass()
{
   private int backing;

   public int getBacking()
   {
      return backing;
   }

   public void setBacking(int v)
   {
      backing = v;
   }
}

C#已经将其演变为具有自动属性的非常简单的语法:

public class SomeClass()
{
   public int Backing { get; set; }
}

懒惰的我仍然觉得这太长了,尽管这是我发现自己做了很多事情。更重要的是,我不确定我是否知道公共领域在哪里更有意义。

为什么不将公开声明的字段视为幕后的属性(或方法)呢?这样就不可能愤怒地解耦神灵,并且少打字一点。

public class SomeClass()
{
   public int backing;   // The same as public int backing { get; set; }
}

对于只包装基础字段的属性,我很确定JIT优化了方法调用,因此性能可能不是问题。有什么想法吗?(字段名称的正确大小写约定除外)

编辑:感谢您的所有回复。我觉得也许不是每个人都理解我的问题。什么时候公共领域比房产更好?为什么这是一个更好的选择?如果唯一的原因是方便(更少的键入和混乱),那么每当遇到公共字段时,让编译器生成一个“底层”属性的缺点是什么。基本上,不可能创建一个真正的公共字段(因为它们都是属性)。那会有什么问题呢?谢谢。


答案 1

在我看来,当你设计一个类的结构时,你应该更加关注未来的变化,并且应该始终对他们友好。如果将来的需求要求您在返回值之前执行一些逻辑,而不仅仅是返回字段的值,则必须更改类的接口,并且库的所有用户都必须更改。这通常会成为一场灾难。

请记住,开放/关闭原则


答案 2

什么时候公开一个领域是有意义的?

在其他地方,私人课程如下。

public class MyOuterClass
{
      private class MyInnerClass
      {
            public int val ; // why bother w/boiler plate
      }
}