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
}

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

4

4 回答 4

3

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

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

于 2013-07-23T11:53:36.580 回答
1

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

于 2013-07-23T11:55:50.280 回答
1

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

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

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

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

于 2013-07-23T12:06:58.163 回答
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的东西

于 2013-07-23T12:49:56.467 回答