2014-09-04 60 views
0

我正在構建一個可以在PDF文件上應用多種操作(添加文本,圖像,調整大小,裁剪等)的命令行exe。如何正確重構一些複製/粘貼代碼

目前,我的Program.cs看起來有點像這樣(它使用CommandLineParser):

switch (invokedVerb) 
{ 
    case "barcode": 
     Operations.BarcodeOperations.AddBarCode(options.AddBarcodeVerb); 
     break; 

    case "addblankpage": 
     Operations.PageOperations.AddBlankPage(options.AddBlankPageVerb); 
     break; 
} 

正如你所看到的,我的操作分成幾個XXXOperations類,他們每個人具有非常相似的指令:

public static void AddStuff(StuffOptions options) 
{ 
    Logging.Log("here is a bunch of logging"); 

    // here sometimes there is some action-specific code but not often 

    using (DocWrapper doc = new DocWrapper(options.File)) // this is in all actions 
    { 
     foreach (int page in doc.GetPagesToModify(options.Pages)) // this is in most actions 
     { 
      // call some stuff on the doc instance 
     } 

     doc.Save(options.OutputFile); // this is in all actions 
    } 
} 

因此,所有的行動其網頁上創建DocWrapper的新實例,其中大部分環路(但我可以修改的行動,使他們都這樣做),和所有的人都救,但每個他們在裏面做了一系列不同的動作。

我該如何重構此代碼,以便DocWrapper實例化,頁面循環和保存位於一個位置,但我可以在循環內指定自定義代碼?

我在考慮使用委託或操作來定義我的操作,但我不知道從哪裏開始,因爲我對它們不是很熟悉。

謝謝!

+1

你的問題是關於SO的話題,請嘗試http://codereview.stackexchange.com/ – InferOn 2014-09-04 08:25:37

回答

0

我已經找到了解決方案,並張貼at CodeReview

這是我迄今所做的:

我創建了一個Worker類與我的冗餘代碼:

public static void DoWorkOnPages(IProgramOptions options, Action<DocWrapper, int> actions) 
{ 
    using (DocWrapper doc = new DocWrapper(options.File)) 
    { 
     foreach (int page in doc.GetPagesToModify(options.Pages).OrderBy(p => p)) 
     { 
      actions(doc, page); 
     } 

     doc.Save(options.OutputFile); 
    } 
} 

在每個XXXOperations課程中,我的方法都會這樣調用它:

public static void AddBarStuff(StuffOptions options) 
{ 
    Logging.Log("Here is a magnificient function"); 

    using (Image barcode = CreateStuffImage(someParameters)) 
    { 
     Worker.DoWorkOnPages(options, (doc, page) => 
      { 
       // do something with options, doc, page and barcode 
      }); 
    } 
} 

顯然,對於不完全像 這樣的操作,我不得不復制一些代碼,但我想它不能被幫助。

如果您想出一個更優雅,更簡單,更強大的解決方案或僅僅是一個不同的解決方案,我會很樂意提升它。