2016-04-04 42 views
0

我正在閱讀一些關於SOLID編程的內容,我試圖重構我的測試項目以實現其中的一些規則。單一責任原則 - 功能

我經常有單一功能原則的疑慮,所以我希望有人可以幫助我這一點。

正如我理解,SRP意味着(在一個功能的情況下),函數應負責只有一兩件事。這看起來很簡單,但我確實陷入了一個做不止的事情的陷阱。

這簡化的示例:

class TicketService { 

    private ticket; 

    getTicket() { 

     httpClient.get().then(function(response) { 
      ticket = response.ticket; 
      emit(ticket); <---------------------- 
     }); 
    } 

} 

混亂的部分是emit(ticket)。所以,我的函數名爲getTicket,這正是我在那裏做的(從服務器獲取它),但另一方面,我需要將該更改發佈到我的應用程序的所有其他部分,並讓他們知道該票證被改變。

我可以創建單獨的set()函數,我可以在其中設置私有變量並將其發送到那裏,但似乎是一樣的東西。

這是錯誤的嗎?它違反了規則嗎?你將如何解決它?

回答

0

這可能會導致意外的行爲。如果我想在未來重新使用您的班級,並且在我的IDE中看到自動完成,則方法getTicket()我期望獲得Ticket

但是,將此方法重命名爲mailChangedTicket,理想情況下,您希望此方法調用getTicket方法(實際返回故障單),並以此方式獲得可重用的代碼,這將更有意義。

你可以把SRP甚遠,例如您的TicketService有一個HttpClient的,但它可能並不重要這裏的門票從何而來。爲了「解決」這個問題,你必須爲此創建一個單獨的界面和類。

幾個優點:

  • 代碼變得更加可重用
  • 這是比較容易的部分測試單獨

我可以推薦羅伯特C.書「清潔守則」馬丁提供了一些很好的指導來實現這一點。

+0

是的,這更有意義。謝謝! – Ned

1

您也可以從getTicket()函數返回票證,然後擁有一個名爲setUpdatedTicket()的獨立函數,它接受一張票並設置專用參數,並在最後調用emit函數。