我刚刚查看了一些以前看起来像这样的代码
public class ProductChecker
{
// some std stuff
public ProductChecker(int AccountNumber)
{
var account = new AccountPersonalDetails(AccountNumber);
//Get some info from account and populate class fields
}
public bool ProductACriteriaPassed()
{
//return some criteria based on stuff in account class
//but now accessible in private fields
}
}
现在已经添加了一些额外的标准,这些标准需要不在 AccountPersonalDetails 类中的数据
新代码看起来像这样
public class ProductChecker
{
// some std stuff
public ProductChecker(int AccountNumber)
{
var account = new AccountPersonalDetails(AccountNumber);
var otherinfo = getOtherInfo(AccountNumber)
//Get some info from account and populate class fields
}
public bool ProductACriteriaPassed()
{
//return some criteria based on stuff in account class
// but now accessible in private fields and other info
}
public otherinfo getOtherInfo(int AccountNumber)
{
//DIRECT CALL TO DB TO GET OTHERINFO
}
}
我对数据库部分感到困扰,但人们能告诉我为什么这是错误的吗?或者是?
最佳答案
在您系统的分层 View 中,它看起来像 ProductChecker
属于业务规则/业务逻辑层,因此它不应该被用户交互功能“污染”(属于上面层)或——这与你的情况密切相关——存储功能(属于下面层) )。
“其他信息”应该封装在它自己的存储层类中,并且该类应该是处理持久化/检索功能的类(就像我想象的那样 AccountPersonalDetails
正在为它自己做东西)。 “个人详细信息”和“其他信息”最好作为单独的类保存还是合并到一个类中,我无法从提供的信息中判断,但应该认真考虑并仔细权衡该选项。
保持层分离的经验法则有时可能会让人觉得僵硬,并且通常很想通过层的混合来简化它以添加功能——但是为了在系统增长时保持系统的可维护性和清洁性,我几乎每当出现这样的设计问题时,总是主张层分离。用 OOP 术语来说,就是“强内聚弱耦合”;但在某种意义上它比 OOP 更基础,因为它也适用于其他编程范例及其混合!-)
关于c# - 对本课的建设性批评,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1454915/