2014-04-06 36 views
2
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

如何:

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一起改变 - 这是一个整体在一个班级捆绑在一起的点!

如果您应用这样的单一职责规则,您不会走得太远。如果每个方法只能做一件事,那么整个程序只能做一件事,而当定义一件事就像上面例子中使用的那样,你的程序不能做任何有趣的事情。

的事情是 - 这是一个责任规则不是如何工作的:

  • 你不应该努力写,不能在指定多件事情的方式来定义的方法。相反,您应该编写一种方法,可以通过指定他们所做的唯一事情的方式进行有意义和充分的定义。

  • 您不应该定义一件事基于实现 - 您应该基于托管该方法的类的抽象定义它。

  • 这会有点争议:对于副作用你应该更严格,对于返回值应该更严格。原因是你的方法的用户忽略返回值比忽略副作用更容易。

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

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

是的,它也返回了一些内容,但返回值很容易被忽略,所以我不会把它算作“另一件事”。该方法的用户将使用它来添加项目,所以如果他们不需要它们,他们可以忽略返回值。如果是相反的方法,并且他们正在使用您的方法来检查项目的存在,他们将无法忽略添加项目的副作用,那样会很糟糕。很坏。但由于“额外的东西”是返回值(或例外)而不是副作用 - 所以您的方法没有问题。

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

相关问题