Java “facade方法”(调用自己类的公共方法)被认为是糟糕的设计吗?

Java “facade方法”(调用自己类的公共方法)被认为是糟糕的设计吗?,java,unit-testing,oop,design-patterns,facade,Java,Unit Testing,Oop,Design Patterns,Facade,“门面法”被认为是糟糕的设计吗?我想不出更好的说法了。例如: public class MyService() { public void doThis() { // do something } public int doThat() { // do something } public boolean isThisTrue(String str) { // do something }

“门面法”被认为是糟糕的设计吗?我想不出更好的说法了。例如:

public class MyService() {
    public void doThis() {
        // do something
    }

    public int doThat() {
       // do something
    }

    public boolean isThisTrue(String str) {
       // do something
    }

    // determine something by calling methods within the same class
    public boolean shouldSomethingBeDone() {
        int result = 0;            

        if (isThisTrue("foobar")) {
           doThis();
           result = doThat();
        }

        return result > 0; 
    }
}
我试图避免在调用服务的控制器类中有太多的逻辑。我能看到绕过这个问题的唯一方法是创建一个类似于上面的方法

当我试图创建一个单元测试并模拟shouldSomethingBeDone方法中的调用时,出现了这种困境。因为所有的调用都是对同一类中的方法的,所以很难对其进行模拟

谢谢。

你看到原理了吗

像Ishistrue这样的方法会提出问题,并将回答问题的逻辑推到各处。相反,你更愿意告诉对象该做什么,让它担心


这意味着,与其将某个东西命名为某个东西,不如将该方法重命名,告诉对象该做什么。如果没有实名,则很难做到这一点,但假设doSomething是一个更好的名称。

在您给出的高度抽象的版本中,很难说这是一个好设计还是坏设计的示例。然而,我不认为有一般的原则说它是坏的

有些东西可能很难进行彻底的测试,但这并不意味着它是一个糟糕的设计。。。反之亦然


我们可以对这些方法的名称进行评论,但我认为这并不能解决您的问题,无论是关于设计还是可测试性。

使用方法构建代码通常是好的设计。当然,您不应该过度喜欢创建许多单行方法

如果您有一个不应该被另一个类调用的方法,就不要使用public和private

另一个优点:使用继承可能更容易,因为您可能不需要覆盖整个shouldSomethingBeDone,而只需要覆盖较小的方法


是的,嘲弄很难。我会从整体上测试一种方法。或者使用Google来了解如何在您正在测试的同一类中模拟方法。

不,这还不错,我也这么做,我没有任何问题。你可以做的是创建另一个类,但它将是相同的,你可以添加创建另一个类来调用它的方法。不一定是糟糕的设计。然而,功能最紧密的类可能不会调用同一类的公共方法。我强烈反对这个答案中的几乎所有内容。说使用方法构造代码通常是一种好的设计毫无意义。此外,我不认为使用继承更容易被认为是一种优势。让事情变得更简单绝对不是劣势——即使你没有利用优势。组合可能更好,但继承仍然被大量使用。顺便说一句:如果你不需要模仿,调试可能会更容易,而只是重写方法。当然,如果你不过分,使用方法可能有助于构建一个大方法。此外,在两次调用方法时,您可能能够两次使用一段代码。如果你不过分的话,使用方法绝对不是一个糟糕的设计。