2011-03-10 111 views
3

我总是有一个问题需要设计一个类,其中正确的方法调用对程序员来说是清楚的,并且在数据之前没有执行某种方法的危险,变量是通过其他方法设置的。所以我通常使用标志和if语句是安全的:如何确保方法按正确的顺序执行?

class foo { 
    boolean isInitialised = FALSE; 
    boolean isSthDone = FALSE; 
    float importantData; 

    public void initialise { 

     ... 

     isInitialised = TRUE; 
    } 

    public void doSth1 { 

     if (isInitialised) { 

     importantData = 2134234; 

     } ... 

      isSthDone = TRUE; 

    } 

    public void doSth2 { 

     if (isInitialised && isSthDone1) { 

      ... 

      } 
    } 
} 

这种设计不会给任何线索,怎么算法应该使用 - 这方法应该是先执行,没有任何设计模式的这种问题?

+0

这是在Java吗? C#? – Crisfole 2011-03-10 17:54:38

+1

它被称为“设计你的对象在施工后处于有效状态”模式。 – ChaosPandion 2011-03-10 17:55:52

+0

@featon - 这是什么混乱的代码?如果您希望任何人尊重您,至少让您的示例始终遵循相同的基本语法。另外它也不会伤害检查你的拼写。 – ChaosPandion 2011-03-10 18:00:15

回答

2

您应该考虑在这里使用。对我来说,代码如下:

  • “我的状态,让我只初始化我”,“我在初始化状态,所以我可以做必要的逻辑 - Sth1时
  • 最后:“我在过去的状态,所以我现在可以做Sth2时

http://sourcemaking.com/design_patterns/state

无论如何,像哟你之前被告知,最简单的选择是使这些方法保密,并用一种​​新的公共方法将它们全部按顺序调用。

+0

@Rob Hruska,谢谢:) – dantuch 2011-05-28 18:38:10

6

您应该在构造函数中进行所需的初始化 - 初始化正是构造函数的用途。根据您使用的语言,它可能如下所示:

Class foo{ 

    public: 
    foo(){ 
    a = 1; 
    b = "something"; 
    } 

    int a; 
    string b; 

} 
+0

有时不适合在构造函数中初始化。 – Crisfole 2011-03-10 17:53:41

+6

有些时候任何标准方法都不合适。在他的问题(也就是“几乎总是”)的背景下,构造函数就是他应该进行初始化的地方。 – David 2011-03-10 17:55:23

8

请思考一下,是否独立执行这些步骤是否真的有意义。如果该类的消费者确实必须按照该顺序执行步骤1,步骤2和步骤3,那么只需将它们折叠成一个公共方法并将这些步骤封装在您的类中。

另一方面,如果真的有消费者按照什么顺序做的选择,那么你就会遇到状态转换问题,并且你需要了解步骤的合法顺序。

4

@D。 Lambert和@David正在给出很好的建议。

如果你想要一个强制执行一系列调用的设计模式,请看Template Method。这可能不是你想要的,我过去一直很后悔选择这种模式,所以小心使用它。它执行一个命令,不管你喜不喜欢。