[英]How to properly organize class code?
如果您需要通过私有方法修改数据,则在类中组织代码的首选方式是什么?
例如,这样做是否更好:
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
}
我已经看到它以多种方式完成,并且我试图了解什么是行业标准的最佳实践,因为我是发展中国家的新手。
如果数据是对象专有的,则该方法具有对其的完全访问权限。 您不必传递它。
对象将状态和行为封装到单个软件模块中。 操作应操纵状态。
如果您知道此参数是类private成员,那么我看不到使用参数来实现私有功能的意义。 如果功能是特定的,并且其结果取决于成员状态,那么我将始终选择第二个选项。
它实际上取决于数据,方法和您要执行的操作。 换句话说,这是该类设计的一部分。
此私有方法如何修改数据? 如果它执行仅对data1
字段有意义的特定计算,则可以简单地使用callMethod()
。
另一方面,如果您的callMethod()
可能是该类内的一个小工具(也许可以对两个不同的字段data1
和data2
进行相同的计算),则没有两个单独的方法,而是传递要修改的成员是有意义的作为争论。
如果您有一个具体的示例,那么我们可能会提供更多帮助
如果该方法已经知道它必须访问的成员,则在内部传递引用是没有意义的。
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的内容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.