2014-04-06 75 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一起改變 - 這是一個整體在一個班級捆綁在一起的點!

如果您應用這樣的單一職責規則,您不會走得太遠。如果每個方法只能做一件事,那麼整個程序只能做一件事,而當定義一件事就像上面例子中使用的那樣,你的程序不能做任何有趣的事情。

的事情是 - 這是一個責任規則不是如何工作的:

  • 你不應該努力寫,不能在指定多件事情的方式來定義的方法。相反,您應該編寫一種方法,可以通過指定他們所做的唯一事情的方式進行有意義和充分的定義。

  • 您不應該定義一件事基於實現 - 您應該基於託管該方法的類的抽象定義它。

  • 這會有點爭議:對於副作用你應該更嚴格,對於返回值應該更嚴格。原因是你的方法的用戶忽略返回值比忽略副作用更容易。

  • 例外不應該算作「該方法正在做另一件事」。它們不是描述該方法的一部分 - 它們是例外情況,只有在出現問題時纔會發生。這是例外的全部。

現在,讓我們來看看你的方法。實現有三件事:檢查是否存在,添加項目並返回成功結果。但是如果你看看抽象概念,你可以將它定義爲添加一個項目,如果它不存在 - 那是一回事!

是的,它也返回了一些內容,但返回值很容易被忽略,所以我不會把它算作「另一件事」。該方法的用戶將使用它來添加項目,所以如果他們不需要它們,他們可以忽略返回值。如果是相反的方法,並且他們正在使用您的方法來檢查項目的存在,他們將無法忽略添加項目的副作用,那樣會很糟糕。很壞。但由於「額外的東西」是返回值(或例外)而不是副作用 - 所以您的方法沒有問題。

最重要的設計規則是不要盲目遵循設計規則。

相關問題