c# - 用组合理解 CRUD
问题描述
我很想了解如何组织我的代码。假设我有一个名为“Brand”的类,它有一个“Product”对象:
public class Brand {
public int ID { get; set; }
public int name { get; set; }
public Product product { get; set; }
public void add(Brand brand)
{
// Database logic
}
}
而这个类叫做product
public class Product {
public int ID { get; set; }
public int name { get; set; }
}
我想知道的是我应该在产品类中有一个方法 AddProduct 还是该方法应该在顶级“品牌”上。那是我的困惑。
解决方案
为了更好地理解这一点,请考虑关注点分离和单一职责。这篇文章中的答案是一种很好的表达方式。
现在,您有一个名为的对象Brand
,其中包含一个方法Add
和一些与 Brand 对象相关的属性。这意味着品牌不仅负责管理自己,还负责管理自己与数据库的交互。Product
您正在修复与数据库之间的类似耦合。那么当您拥有一系列品牌时会发生什么,并且您意识到每个品牌都应该拥有一系列产品,并且它们都散布着数据库逻辑?然后,假设你注意到每个产品都需要一个成分列表,所以你必须添加它,所以成分需要数据库逻辑等等。你可以看到这很快就会变得非常混乱。
所以实际上,您应该有一个负责管理数据库对象的第三个类,并且该类将具有可以调用的方法,这些方法将您的 Brand 和 Product 对象作为参数并在内部与数据库进行交互。现在您已经将数据库逻辑从品牌和产品逻辑中抽象出来,因此 Database 类可以做它为之构建的事情,而不再做其他事情,并且 Brand 和 Class 对象可以作为相关数据的已定义包装器存在,不再赘述。现在一切都被划分了,因此每个类都代表一个简单的概念。Brand
类的存在是为了表示品牌数据。Database
类的存在是为了与数据库交互。
我相信你已经明白了这个概念,而且你可能已经看过一千次了,但是这样思考将帮助你发现需要改变的地方,并找到更简单、更清洁、更易于维护的解决方案。
推荐阅读
- acumatica - 得到“之前的操作还没有完成。” 如果在通过 Contract Soap API 调用的操作中使用 PXLongOperation 则异常
- java - return 总是 true,即使它是 false
- http - 如何在Flutter的firebase中获取集合中索引的集合列表?
- r - 在 group_by() %>% mutate() 函数调用中使用带引号的变量
- reactjs - 我的应用程序代码如何知道应用程序是否正在使用 testcafe 进行测试?
- google-cloud-platform - Bigquery,将聚簇表的簇保存到云存储
- reactjs - 有没有办法在反应路由中隐藏查询字符串中的参数?
- flutter - 工具提示消息文本和背景颜色
- vue.js - Babel 6->7:错误未知:意外令牌(扩展运算符)
- laravel - 如何在 laravel 网站上安装 ArrowChat