违反单一责任原则和静态方法[关闭]

问题描述 投票:-5回答:1

我有以下奇怪的问题。假设我们有一个类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/ ...我有点觉得这是一个单一的责任原则,诚实地被纳入极端。

java oop single-responsibility-principle
1个回答
2
投票

一些随意的想法。

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

© www.soinside.com 2019 - 2024. All rights reserved.