2016-04-21 46 views
1

可以说我有一个表示课程的类。课程具有自己的属性,如主题名称,描述,开始和结束日期等。在哪个类中“应该”负责将数据从数据访问层(RDD)中提取

然后,该课程具有参与者列表的属性。在数据库中,这显然表现为两类:该课程和参与者表以一对一的关系。

我的问题是关于如何设置课程类中的参与者列表:它应该是课程类本身提取数据(通过数据访问层或上面的图层),还是应该委托抓取和参与者设置某种帮助类,使课程类自己或多或少是一个愚蠢的对象,只有数据?

在RDD(Resopnsible驱动设计)中,它告诉我们要制作智能对象并将数据和行为之间的差异抽象出来。在这方面听起来很明显,课程班应处理参与者的提取。这样做是为了提高对数据访问对象(或上面的级别)的直接依赖,使其更加耦合起来。

任何想到这一点都会有所帮助。

+0

你可能想看看http://programmers.stackexchange.com这是很大的设计讨论。 –

+0

感谢您的输入! – Fred

+0

@ChrisWohlert在引用其他网站时,指出[交叉发布被皱起了眉头](http://meta.stackexchange.com/tags/cross-posting/info)通常很有帮助 – gnat

回答

0

课程类不应该负责提取参与者,实际上,它不应该负责提取课程。您提出了数据访问层的正确点,但课程类本身不应与此层一起工作,它只能代表一门课程。

您创建了一个负责提取数据的类,即数据访问层。你可以命名这个类似于CourseDao的东西,但重要的部分是;它只是从数据库获取数据,并以课程形式将其返回给客户端。 该类具有创建,读取,更新和删除等方法。

现在,您想为参与者做同样的事情,只需要一个小小的差异。由于您的Participant表具有课程的外键,因此您的ParticipantDao将具有超载的Read。

例子:

public class ParticipantDao{ 
    public void create(Participant participant){ 
     //Insert participant in db 
    } 
    public Participant read(int id){ 
     //read participant from db 
    } 
    public List<Participant> read(){ 
     //read all participants from db 
    } 
    public List<Participant> read(Course course){ 
     //read all participants in this course from the db 
    } 
    public void Update(Participant participant){ 
     //update and so on. 
    } 
} 

而且你CourseDao可以去像使用ParticipantDao:

foreach(Course course in read()){ 
    course.setParticipants(this.participantDao.read(course)); 
} 

总之,你有一个对象来访问数据库中的数据,这是不表示所述数据的相同对象。当你有一对多关系时,这些访问对象可以一起工作来检索正确的数据。

+0

嗨,谢谢你的回答!然后,您还可以在上面的对象上使用“包装器方法”,以获取课程和参与者数据,这些数据将与参与者创建一个课程对象,使其成为“智能/域对象”,同时不负责读取/设置数据。 – Fred

2

它应该是过程类本身被获取数据

这是已知为Active Record的图案。请注意,许多人认为活跃记录是anti-pattern

还是应该一个委托的抓取和参与者的某种辅助类

此的设置是被称为Repository模式。

使课程课程成为自己或多或少是一个愚蠢的对象,只保存数据?

删除从实体保存和检索数据的责任不会使该实体成为一个愚蠢的对象,只保存数据。实体仍然可以保存域逻辑,这在练习Domain-Driven Design时是很常见的做法。在DDD中,作为简单数据容器而没有行为的实体称为anemic domain model

+0

因此,简而言之,一个好的方法是使用Repository模式? – Fred

+1

@Fred:这取决于你。你应该通过阅读和理解这些模式进行调查并作出有教育的决定。 – Steven

相关问题