2010-04-28 68 views
1

我刚刚问了一个关于使用泛型(或多态)来避免重复代码的问题。我真的很想遵循DRY原则。你会使用Action委托来避免重复的代码吗?

所以我只是碰到了下面的代码...

Sub OutputDataToExcel() 

     OutputLine("Output DataBlocks", 1) 
     OutputDataBlocks() 
     OutputLine("") 

     OutputLine("Output Numbered Inventory", 1) 
     OutputNumberedInventory() 
     OutputLine("") 

     OutputLine("Output Item Summaries", 1) 
     OutputItemSummaries() 
     OutputLine("") 

End Sub 

我应该重写这段代码是使用Action委托如下...

Sub OutputDataToExcel() 
    OutputData("Output DataBlocks", New Action(AddressOf OutputDataBlocks)) 
    OutputData("Output Numbered Inventory", New Action(AddressOf OutputNumberedInventory)) 
    OutputData("Output Item Summaries", New Action(AddressOf OutputItemSummaries)) 
End Sub 

Sub OutputData(ByVal outputDescription As String, ByVal outputType As Action) 
    OutputLine(outputDescription, 1) 
    outputType() 
    OutputLine("") 
End Sub 

我意识到这个问题主观。我只是想知道你如何虔诚地遵循DRY。你会这样做吗?

赛斯

回答

4

我见过这个叫做“中间孔”的模式。 “真实世界的函数式编程”一书提到了它。这是一个链接。

http://enfranchisedmind.com/blog/posts/the-hole-in-the-middle-pattern/

看到,还有我已经得到了 在Ocaml-使用的模式,我甚至想用它在Perl ,这是我认为的“洞 在中间”模式。基本想法 是你有两个几乎完全相同的代码 , 除了那个小中间部分 那里。这个想法是,你将 公用代码分解成一个单一的 函数,该函数采用函数 指针作为参数。在共享代码中间 部分由 到函数指针的呼叫时,以及 两个地正被 加起来只需调用组合 函数的指针包含该独特部分的函数 代替。

+1

中间图案的孔?它也可以称为甜甜圈模式吗? MMMMM ...甜甜圈。 – 2010-04-28 19:26:47

1

我不会说我用它所有的时间,但我已经使用Action委托,以避免重复代码。我已经使用过的一种场景是将WCF调用(在客户端代理中)封装起来以避免使用相同的锅炉代码。

private void InvokeAndHandleFaults(
     Action<Data, Context> wcfCall, 
     Data data, 
     Context context) 
    { 
     bool isSuccess = false; 

     try 
     { 
      wcfCall(data, context); 

      if (this.ChannelFactory.State != System.ServiceModel.CommunicationState.Faulted) 
      { 
       this.ChannelFactory.Close(); 
      } 

      isSuccess = true; 
     } 
     catch (FaultException ex) 
     { 
      HandleFault(ex); 
     } 
     finally 
     { 
      if (!isSuccess) 
      { 
       this.ChannelFactory.Abort(); 
      } 
     } 
    } 

就问题中的示例而言,我可能不会使用Action。我绝对不会重构使用Action。主要是因为实际的逻辑很简单,所以我没有看到太多的好处。随着重复代码的“复杂性”/大小增加,我更可能使用委托。