Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 违反单一责任原则和静态方法_Java_Oop_Single Responsibility Principle - Fatal编程技术网

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

Java 违反单一责任原则和静态方法,java,oop,single-responsibility-principle,Java,Oop,Single Responsibility Principle,我有一个奇怪的问题。假设我们有一个BlackJackGame类,这个类包含用于选择获胜者的BlackJackGame算法。虽然同一个类包含启动游戏的主要方法。从某种意义上说,这种主要方法违反了类的单一责任原则。此外,假设我们放置了一个以某种格式打印获胜者的方法。让我们说这种方法也是静态的,这种方法比主要方法更违反责任原则。然后呢,假设我们说它正在破裂。这是否意味着我们应该创造。现在假设我们还有一个实用方法,它解析来自命令行的参数,并将其作为静态方法放置 1个Main类用于保存Main方法,1个P

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

1个Main类用于保存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);

}

}
这不是有点极端吗????像是把一个责任推到了极端

我之所以问这个问题,是因为它是在我在这里请求的代码审查期间出现的…我有一种感觉,诚实是一种极端的单一责任原则

一些随意的想法

a你能准确地确定一个类承担一些责任意味着什么吗???随后,如果正如我所怀疑的那样,你所拥有的只是模糊的概念,没有任何正式可观察/可测量的属性/特征来确定责任的含义,那么你怎么能像你所做的那样毫不含糊地说你所拥有的违反了它? b如果您的应用程序变得足够大,或者您希望某些高级方法JMX与您正在运行的应用程序交互,那么您将自然地拆分MyEngine和StartMyEngine。我想。如果您的应用程序不大型/高级/复杂/关键/。。。够了,那么不拆分就没什么大不了的了。
c每个实例方法Margs都是静态方法SM的语义等价物,该静态方法SM具有所有参数和实例类型的参数。因此,类Foo上的实例方法M相当于静态方法SMFoo-Foo。这开始揭示为什么静态打印方法不属于BlackJackGame类:它没有BlackJackGame类型的任何参数,因此不能说它以任何方式与BlackJackGame类型相关。从根本上讲,mainString[]当然也是如此,但在这种情况下,它的用法已成为一种常见模式,而且,必须在某个地方有一个入口点,否则就根本无法启动java进程。

我的意见-不要对代码进行黑客攻击,只是为了使它符合一些命名的关于如何处理代码的一般准则。我不会费心创建一个单独的类,特别是对于像21点这样的小规模游戏,但这个问题是基于意见的。请记住,编程中几乎没有绝对规则。SRP规则始终取决于上下文。有人会说一件事,另一件事会说,对现代美国政治的不同讨论也是一次有趣的讨论,我们都可以从中学到很多东西。它也不属于这里。ImO:SRP是编码中非常重要的原则。但每个单一责任包含多个子责任。问题是,你能用一种简单的方式来描述一个模块的职责吗?还有其他模块的职责重叠吗?然后你应该重新考虑你的程序结构。是的,我同意你的说法。这开始揭示为什么你的静态打印方法不属于BlackJackGame类:它没有BlackJackGame类型的任何参数,因此不能说它与BlackJackGame类型有任何关系。但现在让我们想象一下,这种方法是放置在玩家而不是BlackJackGame中的。事情会是什么样子then@AlexanderPetrov显然,printPlayer与BlackJackGame确实存在某种关系,它采用BlackJackGame.play生成的一个玩家实例——这显然是一种关系。当你觉得这是正确的事情时,你会分割代码,这可能很难决定,所以一些程序员喜欢分割所有东西,但在我看来,你需要为这项活动找到一个黄金比例。事情会是什么样子:看起来会是这样,专业挑剔者会开始唠叨你,这本应该是一种实例方法,甚至在他们担任审阅角色时会直接拒绝你的代码。@ErwinSmout Crap:D:D:D:D@Krzysztof 西科奇黄金比率:1.618???对不起,我无法抗拒。