如何有效地设计此功能

本文关键字:功能 有效地 | 更新日期: 2023-09-27 18:27:37

我有下面的UpdateCustomer函数。我遇到的问题是,我希望ValidCustomer函数自己工作,而不需要现有的客户对象。换句话说,它应该调用数据库来获取现有客户并执行所有复杂的业务规则检查。如果我这样做,我将多次调用数据库,因为CustomerDataChanged函数也需要现有的客户对象。设计此功能的最佳方式是什么?有没有一种设计模式可以让我重构它?

public string UpdateCustomer(Customer CustomerToUpdate)
{
  Customer ExistingCustomer = GetExistingCustomerFromDataBase(CustomerToUpdate.ID);
  string ErrorMessage = ValidCustomer(CustomerToUpdate, ExistingCustomer);
    if (string.IsNullOrEmpty(ErrorMessage)) {
       bool DataChanged = CustomerDataChanged(CustomerToUpdate, ExistingCustomer);
       if (DataChanged) {
          UpdateCustomer(CustomerToUpdate);
       }
    }
  return ErrorMessage;
 }

如何有效地设计此功能

在不清楚现有代码的作用之前,很难建议您编写代码或模式。但我可以给你一些建议:

1) 不要因为别人建议而使用任何设计模式。你需要很好地理解为什么使用以及使用什么模式。你必须至少了解最基本和最受欢迎的内容,才能理解为什么应该使用其中一个或另一个。

2) 我建议将UpdateCustomer()函数设置为void类型,而不是返回字符串错误消息。对于错误,请使用异常并小心处理。

3) 确保函数中的逻辑是正确的:检查客户数据是否已更改,然后递归调用函数,但不保存这些更改。当数据发生更改,函数一次又一次地调用,直到堆栈溢出时,就会出现这种情况。您可能想调用另一个UpdateCustomer()方法,该方法将实际保存您在DB 中所做的更改

4) 关于您关于ExistingUser和多个DB调用困境的主要问题:-当existingUser为null时处理case-确保您需要现有用户来验证customerToUpdate-如果您仍然需要使用现有用户进行验证,为什么需要进行额外的DB调用?或者,您可以在ValidateUser()函数中从DB中选择existingUser,并返回isDataChanged作为该函数的out参数。