最佳实践,避免违反DRY的好模式



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

有三个函数执行几乎相同的逻辑。

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;
}

上述功能非常相似,但系统可以根据不同的数据关联员工。如图所示:有时我有完整的Employee对象,有时我只有ID,还有一次我有DNA字节。

上面的函数只是用来描述用例。

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

你对减少冗余代码有什么建议吗?多KISS,不违反DRY模式?

从第二个方法中调用第一个方法。

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);
}

最新更新