2010-10-24 101 views
6

Q1。 在我的大学学习面向对象的建模和设计时,他们推荐考虑一个对象可以为它的方法做些什么,以及它的属性有什么责任。所有澄清的尝试都导致了进一步的混乱。面向对象设计方法

这倾向于生成一个包含所有操作的actor和仅保存数据的内部类的类图。

这看起来不正确。有没有另外一种思考如何建模物体的方法? Q2302。此外,该课程似乎强调在对象之后对对象进行建模,但在域模型中不一定有意义。 IE浏览器。在医疗实践中,他们有Patient: CreateAppointment(), CancelAppointment()但这不是它将如何实施(而是修改约会集合)。有没有另外一种思考方式?

例Q1

秘书:RecordAppointment(),RecordAppointmentCancellation()

预约时间,日期,...(没有方法)

例Q2

医生:SeePatient()

虽然SeePatient是一个用例,它没有任何意义上的实际类的方法。你如何看待这个?

+0

没有硬性规定。它过分简化所有不同的有效方法,只考虑'car.wheelCount'。例如,在约会的情况下,例如,“医生办公室计划。创建约会(病人,...)”似乎更“清楚”。也就是说,我倾向于面向数据而不是“面向对象”。 – 2010-10-24 22:36:30

回答

9

不幸的是,你遇到的障碍在学术界是非常典型的。学术项目倾向于从视频租赁商店,图书馆或学生注册系统开始(您与医生的办公室不同),然后继承与动物教授。您所提供的指导也很典型

他们建议想什么对象可以为其做的方法,它的职责是为它的属性

其实什么时,新手会问我平时解释一个对象的属性是它知道的事情,它的方法就是它知道如何去做的事情。这其实只是说出你在那里的另一种方式。正如你发现,当你开始讨论更多的有形系统而不仅仅是例子时,这种思维方式很快就会崩溃。

例如指引工作得很好,与此对象:

public class Tree 
{ 
    public int Height { get; set; } 
    public void Grow(int byHowMuch) 
    { 
     Height += byHowMuch; 
    } 
} 

虽然这当然符合该法案的权利,认为它并没有“感觉”的权利:

public class Secretary 
{ 
    public void MakeAppoinment(Patient patient) 
    { 
     //make the appointment 
    } 
} 

所以解决方案是什么?这是一个考虑你被教导和应用的问题。学习和理解design patterns将有助于开发比功能更强的树,以便知道如何增长。

推荐阅读:

为了解决这个问题,你已经呈现我愿意可能使用继承人类和接口的组合,这些接口将通过一系列服务类来执行他们的操作。基本上,一名秘书,医生和病人都会从人身上继承,而这些类别中的每一类都可以传递给陪同的服务类别。服务类可能会或可能不会做类似SeePatient()的事情。请不要拿这个例子来表示那个人类没有方法。

堆栈溢出比一些相关的问题,更可能是有用的:

此外,这将是很好的检查:

最后,没有什么使一个面向对象的应用程序一个统一的定义。你如何应用模式,原则等将定义你的程序。事实上,你问自己这些问题表明你正处在正确的轨道上。

0

Q1 您的对象可能有责任应该被解释为授权或合同要求,因为他们应该采取什么行动?因此,为了从您的Q2中获取医疗示例,具有调度程序角色的对象(认为C#/ Java接口或Obj-C协议)具有CanEditAppointments或EditsAppointments的属性。

Q2 从用例的角度来看,一个患者可能能够创建一个约会,这样你就可以实现你的对象模型中的病人一起CreateAppointment()的方法。但是,就封装而言,您可能会在CreateAppointment()中实例化一个Appointment对象,然后调用Appointment对象上的方法或设置属性来设置其时间,日期,患者,医师等。

而且因为约会集合很可能是永久存储,就像数据库一样,Appointment对象有责任将自己添加到集合中(Appointment.Schedule()会遍历数据访问层以将其自身保存到数据库中)。

这也与您的Q1相关,因为Appointment对象的职责是自我保存,所以它可能实现一个ISaveAppointment接口,该接口需要字段和方法来执行它。约会的责任是约会日期,时间和患者等。在保存之前,所以ISaveAppointment接口应该要求它们存在,并且Appointment.Schedule()应该验证这些值是正确的还是先前已经过验证。

0

你是对的,在很多情况下,有更高阶的东西更自然地包含行为,如系统或用户。

您可以在类中将此行为建模为对数据模型进行操作的静态方法。这不是面向对象,但它很好。您可以将相关的方法组合到这些类中,很快您就会体会到“服务”的概念,就像面向服务的编程一样。

在Java中,有创建这些类的规范和标准,即EJB中的无状态会话Bean。 Spring Framework与原型“Service”有相似的概念,它可以应用于类来标记它们作为业务逻辑的外观。

服务是一个组件,它在系统中封装某个功能或行为。它对给定的对象模型(它自己的内部模型或系统中更一般的业务对象模型)进行操作。如果你拿出你的用例并创建与他们直接相关的服务,你可以写出非常易于维护的软件。

DCI Architecture是这种形式化,并试图做到这一点,但同时试图通过在对象需要时向对象添加行为来保持对象的方向。

0

我仍然遇到困惑:“我告诉你做别的事吗”或“我在做别人问我的事情吗?”?也许你所要做的就是玩芭比娃娃或者G.I. Joe的理解对象互动和责任去。 G.I.乔受伤了(或者芭比打了一个钉子),所以他打电话给博士的办公室。 “嗨医生,这是乔,我需要预约。”所以,你这个孩子告诉芭比去看医生,他需要知道医生打电话以及如何打电话 - 参考和公共的MakeAppointment()方法。博士办公室需要将预约放在书上 - 这是自己的BookAppointment()方法,即办公室处理预约请求的过程。

public abstract GenderAppropriateDolly { 
    protected DrOffice Drkilldare; 
    public override MakeAppointment() {throw new NotImplementedException();} 
} 


public class GIJoe : GenderAppropriateDolly { 
    DrKilldare = new DrOffice(); 
    List<Appointment> myAppointments = new List<Appointment>; 

    public void MakeAppointment() { 
     myAppointments.Add(DrKilldare.BookAppointment(this)); 
    } 
} 

public class DrOffice { 
    List<Appointment> officeAppointments = new List<Appointments>; 

    public Appointment BookAppointment(GenderAppropriateDolly forWhom) { 
     Appointment newappt = new Appointment(formWhom); 
     this.Appointments.Add(newappt); 

     return newappt; 
    }  
} 

public class Kid { 
    GenderAppropriateDolly myRoleModel = new GIJoe(); 

    // Joe got wounded so ... 
    myRoleModel.MakeAppointment(); 
}