繁体   English   中英

如何正确组织类代码?

[英]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()可能是该类内的一个小工具(也许可以对两个不同的字段data1data2进行相同的计算),则没有两个单独的方法,而是传递要修改的成员是有意义的作为争论。

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

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM