Refactoring 最佳实践和良好模式,以避免干法违规

Refactoring 最佳实践和良好模式,以避免干法违规,refactoring,dry,Refactoring,Dry,我想得到一些关于以下函数重构的建议: 有三个功能执行几乎相同的逻辑 public SendResult ExecuteSendMessageByEmployee(Employee emp, SendingOptions options) { var result = SendMessage(emp); if (options.DepictEmpData) { _generator.DepictData(emp); } if (options.DepictResul

我想得到一些关于以下函数重构的建议:

有三个功能执行几乎相同的逻辑

public SendResult ExecuteSendMessageByEmployee(Employee emp, SendingOptions options) {
  var result = SendMessage(emp);

  if (options.DepictEmpData)
  {
    _generator.DepictData(emp);
  }

  if (options.DepictResult)
  {
    _generator.DepictData(result);
  }
}

public SendResult ExecuteSendMessageByID(int employeeID, SendingOptions options) {

  var result = SendMessage(employeeID);

  var emp = _empService.GetByID(employeeID);

  if(emp == null)
  {
     _generator.NotifyNoEmployeeFound(employeeID);
     return new SendResult(){Success = false};
  } 

  if (options.DepictEmpData)
  {
    _generator.DepictData(emp);
  }

  if (options.DepictResult)
  {
    _generator.DepictData(result);
  }

  return result;
}

public SendResult ExecuteSendMessageByDNA(list<byte> dna, SendingOptions options) {

  var result = SendMessage(dna);

  var emp = _empService.GetByID(dna);

  if(emp == null)
  {
     _generator.NotifyNoEmployeeFound(dna);
  }      

  if (options.DepictEmpData)
  {
    _generator.DepictData(emp);
  }

  if (options.DepictResult)
  {
    _generator.DepictData(result);
  }

  return result;
}
public SendResult ExecuteSendMessageByEmployee(员工emp,发送选项){
var结果=发送消息(emp);
如果(选项.数据)
{
_发电机数据(emp);
}
如果(选项.结果)
{
_数据发生器(结果);
}
}
public SendResult ExecuteSendMessageByID(int employeeID,SendingOptions选项){
var结果=发送消息(员工ID);
var emp=_empService.GetByID(employeeID);
如果(emp==null)
{
_generator.NotifyNoEmployeeFound(employeeID);
返回新的SendResult(){Success=false};
} 
如果(选项.数据)
{
_发电机数据(emp);
}
如果(选项.结果)
{
_数据发生器(结果);
}
返回结果;
}
public SendResult ExecuteSendMessageByDNA(列出dna、发送选项){
var结果=发送消息(dna);
var emp=_empService.GetByID(dna);
如果(emp==null)
{
_生成器。未发现员工(dna);
}      
如果(选项.数据)
{
_发电机数据(emp);
}
如果(选项.结果)
{
_数据发生器(结果);
}
返回结果;
}
上述功能非常相似,但系统可以通过不同的数据关联员工。如图所示:有时我有完整的Employee对象,另一次我只有ID,另一次是DNA字节

上面的函数仅用于描述用例

应用程序需要在许多地方使用不同的参数执行函数;SendOptions也可以更改


您对减少冗余代码有什么建议吗?多接吻,不违反干法

只需从后两个方法调用第一个方法即可

public SendResult ExecuteSendMessageByEmployee(Employee emp, SendingOptions options) {
  var result = SendMessage(emp);

  if (options.DepictEmpData) {
    _generator.DepictData(emp);
  }

  if (options.DepictResult) {
    _generator.DepictData(result);
  }
}

public SendResult ExecuteSendMessageByID(int employeeID, SendingOptions options) {
   var emp = _empService.GetByID(employeeID);

   if (emp == null) {
       _generator.NotifyNoEmployeeFound(employeeID);
      return new SendResult(){Success = false};
   }

  return ExecuteSendMessageByEmployee(emp, options);
}

public SendResult ExecuteSendMessageByDNA(list<byte> dna, SendingOptions options) {
   var emp = _empService.GetByID(dna);

   if (emp == null) {
       _generator.NotifyNoEmployeeFound(employeeID);
   }

  return ExecuteSendMessageByEmployee(emp, options);
}
public SendResult ExecuteSendMessageByEmployee(员工emp,发送选项){
var结果=发送消息(emp);
如果(选项.数据){
_发电机数据(emp);
}
如果(选项.结果){
_数据发生器(结果);
}
}
public SendResult ExecuteSendMessageByID(int employeeID,SendingOptions选项){
var emp=_empService.GetByID(employeeID);
如果(emp==null){
_generator.NotifyNoEmployeeFound(employeeID);
返回新的SendResult(){Success=false};
}
返回ExecuteSendMessageByEmployee(emp,选项);
}
public SendResult ExecuteSendMessageByDNA(列出dna、发送选项){
var emp=_empService.GetByID(dna);
如果(emp==null){
_generator.NotifyNoEmployeeFound(employeeID);
}
返回ExecuteSendMessageByEmployee(emp,选项);
}

如果每个函数都调用同一个函数sendmessage(员工emp),您的建议似乎没有问题。如果我有机会高效地调用不同的SendMessage函数该怎么办。此外,必须首先调用它。在每个函数中,我选择不同的重载SendMessage,一次按员工,另一次按ID,等等?如果您可以证明存在可测量的显著性能差异,那么您不应该采用这种方法。我敢打赌你不能。