OOP和DB访问

时间:2013-06-06 09:23:34

标签: database class oop

我以前在DAL中为每个DataTable都有一个BLL类。 试图遵循OOP原则我将每个类划分为两个类,如下所示:

  • class Item - 表示单个项目/行。 包括:

    1. 根据表格字段的字段和属性。
    2. 构造函数 - 它们不访问数据库
    3. 静态Get方法 - 从DB返回单个项目。
    4. 删除方法 - 从数据库中删除项目。
    5. 更新方法 - 更新数据库中的项目。
  • class Items - 表示类Item的对象的排序列表。 key是项目的ID。包括:

    1. 类型为SortedList的字段items_list
    2. 构造函数 - 访问数据库以填充items_list
    3. GetList方法 - 返回items_list

我的问题:
1.正如您所看到的,Item类不包含任何insert方法,因为我无法确定它应该属于哪个类。
2.可以在项目中使用Get方法,该方法将通过其ID返回项目 3.可以在Items类中使用Update和Delete方法从items_list中检索Item,然后调用Item的相应方法。

谢谢。

2 个答案:

答案 0 :(得分:1)

阅读ORMrepository pattern,您将获益匪浅。一旦你选择了一种语言,就可以使用特定的技术,例如在C#中有NHibernate,Entity Framework,通用的存储库模式都很受欢迎。

  

正如您所看到的,Item类不包含任何insert方法,因为我无法决定它应该属于哪个类。

域类不应包含任何数据访问层内容。将它分开,因为这些是不同的责任。请查看SOLID principlesDomain Driven Design

  

在Item中有一个Get方法可以通过它的ID返回一个Item。

不,不行。从域模型类中删除任何数据访问成员。

  

可以在Items类中使用Update和Delete方法从items_list中检索Item,然后调用Item的相应方法。

不,与其他原因相同。

总之,一个班 - 一个责任。将模型与数据库交互分开。使用单独的泛型类与数据库交互,使用ORM。看看有关这些模式和技术的几个教程。

答案 1 :(得分:0)

不幸的是,这个问题的答案是'不'。我认为正如oleksii在他的回答中所解释的那样,你在同一个班级中混合了不同的职责。 一个班级应该只有一个责任(Single Responsibility Principle)

  • Item应代表一条记录的数据,因此应限于其属性。
  • Items应该代表一个记录集,一个Item的集合(......你可能会迭代)。因此,您应该在查询后得到什么。

至少应该有第三个类,称之为DAO(数据访问对象)或负责执行数据库操作的经理,例如GetGetListUpdate,{ {1}}和Delete