2012-02-19 52 views
3

背景我應該調用哪些對象來協調不同的行爲組合?

我經常跟單職責類:

  • ReportReader
  • ReportWriter
  • ReportSender
  • ReportGenerator

,但我需要執行較高的L通過協調他們之間的任務。這些物體應該被稱爲什麼?

例1 - 生成然後發送報告

  • 我需要一個協調的對象使用ReportGenerator和ReportSender類來生成一個報告,然後將其發送。
  • 我不能稱之爲發件人或發電機。
  • 調用類ReportGeneratorAndSender是一種氣味,因爲它負責兩種不同的行爲...
  • ...但它並不真正負責這兩種行爲 - 只是協調那些做這兩件事的對象。

例2 - 生成然後發送報告

  • 另一類需要生成一個報告,然後使用ReportWriter和ReportGenerator在同一應用程序寫入到磁盤 - 和我有同樣的問題。

我蹩腳的解決方案

  • 我結束了類似ReportController或ReportCoordinator。
  • 這太泛化,並沒有描述行爲。

我的問題

我應該稱之爲協調行爲的不同組合的對象?

有沒有可以幫助我的設計模式?

回答

3

不要被類名卡住,它不是唯一的方法來做一個乾淨的設計。使用方法名稱,方法重載,方法參數類型,方法參數名稱,構造函數重載,構造函數參數類型等等。大量的語言工具幫助你的課程的用戶。

例如,由於您談論的是一些簡單的函數,它們可以將已有的類組合起來,您可以使它們成爲輔助類的靜態方法(如果您願意,您甚至可以將它們作爲Report類的擴展方法):

public static class ReportHelper 
{ 
    public static void SaveToFile(Report report, string path) {}; 
    public static void Send(Report report, string address) {}; 
} 

如果你想去多一點抽象,支持更復雜的行爲,然後用於封裝行爲的對象正確的名稱將是一個工作流

public interface IReportAction 
{ 
    void Execute(Report report); 
} 

public class ReportWorkflow : IReportAction 
{ 
    //Composite pattern to keep a list of actions and execute them one by one 
} 

public class SendReportAction : IReportAction {} 
public class WriteReportAction : IReportAction {} 

擁有您的工作流程類,您可以創建它的多個實例併爲其提供一些面向業務的名稱。例如,您發送報告的工作流程的作用是什麼?也許這是一個EndOfDayReportWorkflow,所以這樣稱呼它,它可以格式化報告,做一些其他的事情,然後發送。您避免使用錯誤的名稱,並且您將使用高級業務術語進行編碼。

+1

絕妙的回答。感謝您澄清那些幾年來一直困擾我的東西! – 2012-02-20 09:25:57

1

ReportService將在野外使用最多的名稱。第二名將進入ReportAgentReportWorkerReportController也不會很少見。

這是非模式多達命名約定在您的組織內。

所以說,一些後綴通常也有意義。例如:

  • * 工人 - 多線程環境
  • * 控制器 - MVC環境
  • * 代理 - 隊列監聽
  • * 服務 - 行爲
  • 的一般總
1

ReportSen dCoordinator和ReportSaveCoordinator(並假設生成報告是發送/保存報告的一部分。例如,如果我要爲自己寫一個TODO,我會寫Send Report給Susan,事實上大部分的工作實際上是在暗示它。或者如果這些報告有特定的目標/用途,請在這些報告之後命名。例如,TPSReportService將使用ReportGenerator和ReportDumper。

1

這是一個純粹的類命名問題。你有許多小的單一責任類,並且想要抽象出一個更有用的類,你可以直接使用這個類。我將其命名爲ReportUtil類。它甚至可能只有靜態的公共方法。

相關問題