我有以下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;
}
答案 0 :(得分:0)
在不清楚现有代码的作用之前,很难建议您编写代码或模式。但我可以建议你考虑一些提示:
1)不要使用任何设计模式,因为有人建议它。您需要很好地理解为什么以及使用什么模式。你必须至少知道基本的和最受欢迎的,才能理解为什么要使用这个或那个。
2)我建议使用void类型的UpdateCustomer()函数而不是返回字符串错误消息。对于错误,请使用异常并仔细处理它们。
3)确保您的逻辑功能正确:您检查客户数据是否已更改,然后递归调用函数,但不保存这些更改。当数据发生变化并且函数一次又一次地调用直到堆栈溢出时,您将获得情况。您可能希望调用另一个UpdateCustomer()方法,该方法将实际保存您在DB中的更改
4)关于您关于ExistingUser和多个DB调用困境的主要问题: - 当existingUser为null时处理大小写 - 确保您需要现有用户来验证customerToUpdate - 如果您仍然需要现有用户进行验证,为什么还需要进行额外的数据库调用?或者,您可以在ValidateUser()函数中从DB中选择existingUser,并将isDataChanged作为此函数的out参数返回。