违反单一职责原则和静态方法
Violating Single Responsibility Principle and static methods
我有以下奇怪的问题。假设我们有一个 class BlackJackGame,这个 class 包含用于选出获胜者的 BlackJackGame 算法。 Same class 虽然包含开始游戏的主要方法。这个main方法在某种意义上违反了class的单一职责原则。此外,假设我们放置了另一种以某种格式打印获胜者的方法。可以说这个方法也是静态的,这个方法是否比主要方法更违反责任原则。然后呢,假设我们说它坏了。这是否意味着我们应该创造。现在假设我们还有一个实用方法,它解析来自命令行的参数并将其也作为静态方法放置。
1 个 Main class 保存 Main 方法,1 个 Print class 保存 Print 方法,1 个 ArgumentParser class 保存单个静态方法来解析参数。
我会这样想象它:
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/... 老实说,我有点感觉这有点走极端的单一职责原则。
一些随意的想法。
(a) 你甚至可以确定 精确地 class 有一些 [=26] 意味着什么=] ???随后,如果(正如我怀疑的那样)你所拥有的只是模糊的概念,没有任何正式可观察/可测量的属性/特征来确定 "responsibility" 的含义,那么你怎么能像你所做的那样明确地说出你所拥有的违反了吗?
(b) 如果您的应用程序变得足够大,或者您希望某些高级方法 (JMX) 与您的 运行 应用程序进行交互,您将自然而然地拆分 "MyEngine" 和 "StartMyEngine"。我想。如果您的应用程序 large/advanced/complex/critical/... 不够,那么不进行拆分也没有多大关系。
(c) 每个实例方法 M(args) 都是静态方法 SM 的语义等价物,它具有所有 args 加上实例类型的参数。因此 class Foo 上的实例方法 M() 等同于静态方法 SM(Foo foo)。这开始揭示 为什么 你的静态打印方法 "does not belong" 在 class BlackJackGame 中:它没有任何类型的参数BlackJackGame 因此不能说与 BlackJackGame 类型有任何关系。从根本上讲,对于 main(String[]) 当然也是如此,但在那种情况下,它的用法已成为一种常见的模式,而且, has 不知何故成为某个地方的入口点,否则没有java 进程根本无法启动。
我有以下奇怪的问题。假设我们有一个 class BlackJackGame,这个 class 包含用于选出获胜者的 BlackJackGame 算法。 Same class 虽然包含开始游戏的主要方法。这个main方法在某种意义上违反了class的单一职责原则。此外,假设我们放置了另一种以某种格式打印获胜者的方法。可以说这个方法也是静态的,这个方法是否比主要方法更违反责任原则。然后呢,假设我们说它坏了。这是否意味着我们应该创造。现在假设我们还有一个实用方法,它解析来自命令行的参数并将其也作为静态方法放置。
1 个 Main class 保存 Main 方法,1 个 Print class 保存 Print 方法,1 个 ArgumentParser class 保存单个静态方法来解析参数。
我会这样想象它:
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/... 老实说,我有点感觉这有点走极端的单一职责原则。
一些随意的想法。
(a) 你甚至可以确定 精确地 class 有一些 [=26] 意味着什么=] ???随后,如果(正如我怀疑的那样)你所拥有的只是模糊的概念,没有任何正式可观察/可测量的属性/特征来确定 "responsibility" 的含义,那么你怎么能像你所做的那样明确地说出你所拥有的违反了吗?
(b) 如果您的应用程序变得足够大,或者您希望某些高级方法 (JMX) 与您的 运行 应用程序进行交互,您将自然而然地拆分 "MyEngine" 和 "StartMyEngine"。我想。如果您的应用程序 large/advanced/complex/critical/... 不够,那么不进行拆分也没有多大关系。
(c) 每个实例方法 M(args) 都是静态方法 SM 的语义等价物,它具有所有 args 加上实例类型的参数。因此 class Foo 上的实例方法 M() 等同于静态方法 SM(Foo foo)。这开始揭示 为什么 你的静态打印方法 "does not belong" 在 class BlackJackGame 中:它没有任何类型的参数BlackJackGame 因此不能说与 BlackJackGame 类型有任何关系。从根本上讲,对于 main(String[]) 当然也是如此,但在那种情况下,它的用法已成为一种常见的模式,而且, has 不知何故成为某个地方的入口点,否则没有java 进程根本无法启动。