违反单一责任原则和静态方法

时间:2017-08-09 18:35:21

标签: java oop single-responsibility-principle

我有以下奇怪的问题。假设我们有一个类BlackJackGame,这个类包含用于选举获胜者的BlackJackGame算法。同一类虽然包含启动游戏的主要方法。从某种意义上说,这种主要方法违反了单一责任原则。另外我们假设我们还有一种方法可以以某种格式打印获胜者。可以说这种方法也是静态的,这种方法比主要方法更突破了责任原则。那么,我们可以说它正在破碎。这是否意味着我们应该创造。现在让我们假设我们还有一个实用程序方法,它解析来自命令行的参数并将其作为静态方法。

1用于保存Main方法的主类,1用于保存Print方法的Print类和1个用于解析参数的单个静态方法的ArgumentParser类。

我会像这样想象它:

public class BlackJackGame{

//returns the wining player
public Player play(Deck deck) {
  // some logic here
}
// deck is a class holding the Deck.
public static Deck parseArguments(String args[]) {
// logic here
}

public static void printPlayer(Player winner) {
// some logic here
}

public static void main(String args[]) {
    Deck deck = createDeck(args);
    BlackJackGame game = new BlackJackGame();
    Player winner = game.play(deck);
    printWinner(winner);

}

}

如果我们遵循单一责任原则。如果我们有:

,它是否会产生影响并且更正确?
public class BlackJackGame{

//returns the wining player
public Player play(Deck deck) {
  // some logic here
}
}

public class Main{

public static void main(String args[]) {
    Deck deck = DeckCreator.createDeck(args);
    BlackJackGame game = new BlackJackGame();
    Player winner = game.play(deck);
    Printer.printWinner(winner);

}

}

这不是有点极端????就像单一责任陷入极端一样?

我问这个问题,因为它在我在此处请求的代码审查期间弹出。 codereview.stackexchange.com/questions/172469/ ......我有点觉得这是一个单一的责任原则,诚实地说是极端的。

1 个答案:

答案 0 :(得分:2)

一些随意的想法。

(a)你甚至可以确定 对一个班级有什么“责任”意味着什么?然后,如果(我怀疑)你所拥有的只是模糊的概念而没有任何正式的可观察/可测量的属性/特征来确定“责任”的含义,那么你怎么能像你那样毫不含糊地说你所拥有的是违反的它? (b)如果您的应用程序变得足够大或者您希望某些高级方法(JMX)与正在运行的应用程序进行交互,那么您将自然地分离“MyEngine”和“StartMyEngine”。依我看。如果您的应用程序不够大/高级/复杂/严重/ ......足够,那么没有那么分开也无关紧要 (c)每个实例方法M(args)是静态方法SM的语义等价物,它具有所有args以及实例类型的参数。因此,类Foo上的实例方法M()等效于静态方法SM(Foo foo)。这开始在BlackJackGame类中显示 为什么 你的静态打印方法“不属于”:它没有BlackJackGame类型的任何参数,因此不能说是关联的任何方式到BlackJackGame类型。从根本上讲,同样适用于main(String [])但在这种情况下它的用法已经成为一种常见的模式,而且,作为某个地方的入口点,否则没有java进程可以一切都开始了。