做"回归成功"方法违反了单一责任原则?

时间:2014-04-06 12:59:01

标签: oop single-responsibility-principle

public class FooList {
    public boolean add(Foo item) {
        int index = indexOf(item.getKey());
        if (index == -1) {
            list.add(item);
        }
        return index == -1;
    }
}

由于这会添加项目并且会返回成功值,是否违反了单一责任原则?如果是的话,这有关系吗?

另一种方法是抛出异常:

public class FooList {
    public boolean add(Foo item) throws FooAlreadyExistsException {
        int index = indexOf(item.getKey());
        if (index == -1) {
            list.add(item);
        } else {
            throw new FooAlreadyExistsException();
        }
    }
}

但这是否会违反单一责任原则?似乎该方法有两个任务:如果项目不存在,则添加它;否则,抛出异常。


奖金问题:可以返回null的方法是否违反了单一责任原则?这是一个例子:

public class FooList {
    public Foo getFoo(String key) {
        int index = indexOf(key);
        return (index == -1) ? null : list.get(index);
    }
}

根据情况返回Foo或null,"做两件事"?

1 个答案:

答案 0 :(得分:1)

这个怎么样:

public class MyVector{
    private int[] data;
    private int count;

    public void add(int value){
        data[count]=value;
        ++count;
    }
}

add会做两件事 - 它会更新data并递增count。根据单一责任规则,我应该将其分为两个功能:

public void MyVector{
    private int[] data;
    private int count;

    public void add(int value){
        data[count]=value;
    }
    public void inc(){
        ++count;
    }
}
显然 - 这打破了OOP的基础。我希望 datacount一起改变 - 这就是在课堂上将它们捆绑在一起的重点!

如果你应用像这样的单一责任规则,你就不会走得太远。如果每个方法只能做一件事,那么整个程序只能做一件事,当一件事的定义与上例中使用的一样时,你的程序可以&# 39;做任何有趣的事情。

事情是 - 那不是单一责任规则的运作方式:

  • 您不应该努力编写无法以指定多个内容的方式定义的方法。相反,你应该编写一种方法,这种方法可以通过一种只指定他们所做的事情的方式进行有意义和充分的定义。

  • 您不应该根据实现定义一件事 - 您应该根据承载该方法的类的抽象来定义它。

  • 这会引起一些争议:你应该对副作用更严格,对返回值不要太严格。原因是方法的用户忽略返回值比忽略副作用更容易。

  • 异常不应算作"该方法正在做另一件事"。它们不是方法所做内容描述的一部分 - 它们是例外,只有在出现问题时才会发生。这是例外的全部内容。

现在,让我们来看看你的方法。实现有三个方面:检查是否存在,添加项目以及返回成功结果。但是如果你看一下抽象,你可以把它定义为添加一个项目,如果它不存在 - 那就是一件事!

是的,它也会返回一些内容,但返回值很容易被忽略,因此我不会将其视为"另一件事"。该方法的用户将使用它来添加项目,因此如果他们不需要,他们可以忽略返回值。如果是相反的方式,并且他们使用您的方法检查项目的存在,他们将无法忽略添加项目的副作用,这将是不好的。很坏。但是,因为"额外的事情"是返回值(或例外),而不是副作用 - 您的方法没有问题。

最重要的设计规则是不要盲目遵循设计规则。