2013-07-23 59 views
0

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

例如,是它更好地做到这一点:

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 
} 

我已经看到了它在各种不同的方式做,我想明白了什么自从我是新兴的发展中国家以来,这是行业标准的最佳实践。

+1

如果在函数中更改它,第一个数据会保持不变,第二个更改原始数据。所以这取决于你想要什么。 – Tdelang

+0

@Tdelang如果不重新分配'data1',则第二种方法不一定会更改'data1'。 – Thomas

+0

对不起,我可能不清楚,“如果你改变它在你的功能”我的意思是重新分配它。 – Tdelang

回答

3

如果数据对于对象是私有的,则该方法可以完全访问它。您不应该通过它。

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

+0

所以在理论上,私人方法通常不需要论证? –

+0

我不确定这是100%准确。如果我有一个有两个字段的类,让我们说'amount1'和'amount2',并且需要对两者执行相同的操作,可以使用具有参数的私有方法。他正在谈论的不是私人的方法 –

1

如果您知道这个参数是类私有成员,我没有看到使用参数创建私有函数的要点。如果函数是特定的,并且其结果取决于成员状态,那么我总是会选择第二个选项。

1

这实际上取决于数据,方法和你正在尝试做什么。换句话说,这是该课程设计的一部分。

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

如果在另一方面你callMethod()也许是类(也许可以在两个不同的领域data1data2进行同样的计算)内的小工具的话很有道理不具有两种不同的方法,但该成员传递给被修改为一个参数。

如果你有一个具体的例子,然后我们也许可以提供更多的帮助

1

这是没有意义的内部传递一个参考,如果该方法已经知道它必须访问的成员。

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

+0

非常感谢这个答案!它为我清理了很多。 –