【问题标题】:How to properly organize class code?如何正确组织类代码?
【发布时间】:2013-07-23 11:51:36
【问题描述】:

如果您需要通过私有方法修改数据,那么在类中组织代码的首选方法是什么?

例如,这样做是否更好:

private String data1;

callMethod(data1);

private void callMethod(String stuff) { 
    // Do stuff to data1
}

或者这个:

private String data1;

callMethod();

private void callMethod() { 
    // Do stuff to data1
}

我已经看到它以多种方式完成,并且我正在尝试了解什么是行业标准最佳实践,因为我是发展中国家的新手。

【问题讨论】:

  • 如果您在函数中更改它,第一个保留 data1 不变,第二个更改原始数据。所以这取决于你想要什么。
  • @Tdelang 如果你不重新分配data1,第二种方法不一定会改变data1
  • 对不起,我可能不清楚,“如果你在你的函数中改变它”我的意思是重新分配它。

标签: java code-organization


【解决方案1】:

如果数据是对象私有的,则该方法可以完全访问它。你不应该把它传递进去。

对象将状态和行为封装到单个软件模块中。操作应该操纵状态。

【讨论】:

  • 所以理论上,私有方法通常不带参数?
  • 我不确定这是否 100% 准确。如果我有一个有两个字段的类,比如说amount1amount2,并且需要对两者执行相同的操作,则可以使用带参数的私有方法。他说的是私有方法而不是公共方法
【解决方案2】:

如果你知道这个参数是类私有成员,我看不出用参数创建私有函数的意义。如果功能是特定的并且其结果取决于成员状态,那么我总是会选择第二个选项。

【讨论】:

    【解决方案3】:

    这真的取决于数据、方法和你想要做什么。换句话说,这是类设计的一部分。

    这个私有方法如何修改数据?如果它执行仅对data1 字段有意义的特定计算,那么您可以简单地使用callMethod()

    另一方面,如果您的 callMethod() 可能是类中的一个小实用程序(也许可以在两个不同的字段 data1data2 上执行相同的计算),那么没有两个单独的方法是有意义的但将要修改的成员作为参数传递。

    如果您有具体示例,我们可能会提供更多帮助

    【讨论】:

      【解决方案4】:

      如果方法已经知道它必须访问的成员,那么在内部传递引用是没有意义的。

      class FooHolder {
          private Foo foo;
      
          private void ensureInitialized() {
              if (foo == null)
                  foo = new Foo();
          }
      
          public Foo getFoo() {
              ensureInitialized();
              return foo;
          }
      }
      

      但是,如果您可以通过这种方式防止代码重复,那么这样做有时会很有用。这些内部实用方法有时可能是静态的,如下所示:

      class FooAndBar {
          private List<Foo> foos;
          private List<Bar> bars;
      
          public void addFoo(Foo foo) {
              foos = ensureList(foos);
              foos.add(foo);
          }
      
          public void addBar(Bar bar) {
              bars = ensureList(bars);
              bars.add(bar);
          }
      
          // assume this method is not generically useful and therefore not better off in a utility class
          private static <T> List<T> ensureList(List<T> list) {
              return list != null ? list : new ArrayList<T>();
          }
      }
      

      有时他们不能/不应该

      class FooFoos {
          private final Map<String, List<Foo>> fooMap = new HashMap<String, List<Foo>>();
          private List<Foo> getListForKey(String key) {
              List<Foo> list = fooMap.get(key);
              if (list == null) {
                  list = new ArrayList<Foo>();
                  fooMap.put(key, list);
              }
              return list;
          }
      
          public void addFoo(String key, Foo foo) {
              getListForKey(key).add(foo);
          }
          public List<Foo> getList(String key) {
              return getListForKey(key);
          }
      }
      

      请注意,getListForKey 未传递对 fooMap 的引用。没必要,因为那部分已经很清楚了,在每个方法中输入它只会使代码混乱。

      如果您可以通过这种方式减少代码重复和一些内部封装,请将引用传递给您的私有方法。但如果这会导致更多代码,请不要这样做,因为每个方法都必须再次指定引用。

      还要注意,通过方法对功能进行大量内部封装意味着您应该考虑将该功能重构到另一个类中。对于最后一个例子,考虑使用/创建类似MultiMap

      【讨论】:

      • 非常感谢您的回答!它让我明白了很多。
      猜你喜欢
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多