2016-10-07 73 views
1

有一個類:這個類是否違反SRP?

class Printer 
{ 
    public void StartPrintAndWaitForCompletion() 
    { 
     Start(); 
     WaitForCompletion(); 
    } 

    private void Start() 
    { 
     // some logic for start printing 
    } 

    private void WaitForCompletion() 
    { 
     // some logic that waits for specific state of printer queue 
    } 
} 
  1. 這是否違反類SRP?
  2. 方法StartPrintAndWaitForCompletion做不止一件事。我應該刪除它,並總是分別調用Start()和WaitForCompletion()?

回答

0

這個班似乎是打印,這是一個單一的責任,這很好。

你絕對應該用StartPrintAndWaitForCompletion做點什麼,但是你需要決定怎麼做,最明顯的解決辦法就是簡單地叫它print

+0

另外想一想[抽象層次](http://principles-wiki.net/principles:single_level_of_abstraction)。 「打印機」類是一種抽象層次。到底有什麼好處呢?看看它的公共方法。啊,它打印(重命名後)。這是另一個級別。 「打印」意味着什麼?閱讀方法並向下一層:啓動打印機設備並等待它完成。什麼意思是「啓動打印機」?看看「開始」並下降到另一個抽象層次,等等。 – TobiMcNamobi

0

嗯,您可能沒有違反SRP級別,因爲Printer類處理打印是合理的。不過,你似乎有一個漏洞抽象。 StartPrintAndWaitForCompletion講述了實際的實現過多。

如果你的API是同步的,那麼調用諸如Printer.print之類的東西就必須等到打印完成才能將控制權返回給調用方法。如果你想設計一個異步API,那麼我會選擇一個類似Future的API。在C#中,您可以使用tasks

0

我認爲它不會破壞SRP。但是您可以更改公共方法名稱。因爲它講述了實際的實現,所以破壞了封裝。

+0

'初始化'似乎是一個很好的,或者足夠好的名字。 –

0

單一職責原則說: 「一個班級應該只有一個理由改變」 (見https://en.wikipedia.org/wiki/Single_responsibility_principle)。

打印邏輯是顯然屬於打印機的一項責任。 它可能會單獨更改。

等待完成是另一項責任,也可能會單獨更改(是否總是需要等待?等待多長時間?如果等待超時已到達,該怎麼辦等等)我建議將此邏輯移至另一個類(請參閱在可用於您的語言的任務執行框架中)。