5

我不太清楚如何用一句话来表达这个问题,所以我很难搜索以前的帖子。这对我来说经常出现,我想就如何处理它达成共识。

假设您有两个班级,ExampleClass并且ExampleClassManager. ExampleClass有一个Update(Data data)从 调用的方法ExampleClassManager。但是,ExampleClass可以处于两种状态之一,在Enabled它想要处理data传递给它的状态下Update,在禁用状态下它根本不做任何事情data

如果它被禁用,我应该检查状态ExampleClassManager并且根本不通过,还是应该通过不管并在其中忽略它?datadataExampleClass

这是一个代码示例,以防我没有清楚地表达它。

public class ExampleClass {
    public bool Enabled {
        get;
        set;
    }

    public void Update(Data data) {
        if(Enabled) {
            //do stuff with data
        }
    }
}

public class ExampleClassManager {
    private List<ExampleClass> exampleClassList=new List<ExampleClass>();

    public void UpdateList() {
        foreach(ExampleClass exampleClass in exampleClassList) {
            exampleClass.Update(data);
        }
    }
}

或者

public class ExampleClass {
    public bool Enabled {
        get;
        set;
    }

    public void Update(Data data) {
        //do stuff with data
    }
}

public class ExampleClassManager {
    private List<ExampleClass> exampleClassList=new List<ExampleClass>();

    public void UpdateList() {
        foreach(ExampleClass exampleClass in exampleClassList) {
            if(exampleClass.Enabled) {
                exampleClass.Update(data);
            }
        }
    }
}
4

4 回答 4

3

鉴于它取决于 的属性ExampleClass,我会选择选项 1 并在ExampleClass.Update. 否则,任何可以访问对象的ExampleClass对象都可以调用Update 而不管状态如何。通过在Update方法内进行检查,您可以确保仅在启用对象时才会继续。这里的问题是谁能改变对象的状态?

参见得墨忒耳法则

每个单元应该只对其他单元有有限的了解:只有与当前单元“密切”相关的单元。

于 2013-04-01T19:39:30.913 回答
0

“我的经理班应该做多少管理?” 您的选项 2 是“微观管理”方法 - 经理应该向 ExampleClass 规定每个小细节,说明它应该做什么以及如何做。

通常,这比面向对象的编程更基于结构的编程。我希望你的经理告诉你的对象“去做这个”,而不是担心细节。ExampleClass 应该在内部封装它的所有行为,而不是强迫管理器担心它。

我投票支持选项 1,但需要注意的是,这些是一般原则,您总能找到需要选项 2 的情况。

要问的一个问题 - 除了让经理检查之外,ExampleClass.Enabled.get 是公开的还有其他原因吗?如果这是它公开的唯一原因,那么它是内部实现,并且 gettor 应该是私有的。如果你有很多关于这个领域的事情,那可能意味着你的选项 2 工作流程对于这门课来说更自然。

于 2013-04-01T19:49:30.957 回答
0

我会选择选项 2,classManager 应该管理对象,他应该知道是否触发更新。单个对象的更新方法应该做它所说的(更新对象而不是什么都不做)。

@caerolus:我还不能发表评论......无论如何,给出的例子都没有违反 demeter 定律

无论如何,我认为这是一个有点个人选择的问题,也许它更适合堆栈交换?

于 2013-04-01T19:52:01.280 回答
0

假设您有两个对象,Company 和 Employee。你让公司检查员工什么时候饿了,或者你让员工检查他是否饿了?听起来你想让员工检查他是否饿了,对吧?但是如果公司要为所有员工订餐怎么办,那么公司需要检查员工是否饿了。

所以我的观点是,这取决于何时检查、谁在检查以及为什么检查的设计和上下文。在您的示例中,我会说这没关系,因为没有设置上下文。

于 2013-04-01T20:31:39.447 回答