面向对象设计中的方法

时间:2010-10-24 22:00:56

标签: oop class-design analysis

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

这往往会生成一个类图,其中包含具有所有操作的actor,以及仅包含数据的内部类。

这似乎不正确。还有另一种思考如何建模对象的方法吗?

Q2。此外,该课程似乎强调在真实世界对应物之后对物体进行建模,但在域模型中并不一定有意义。 IE浏览器。在医疗实践中,他们有Patient: CreateAppointment(), CancelAppointment(),但这不是如何实施的(你会修改约会集合)。还有另一种思考方式吗?

示例Q1

  

秘书:RecordAppointment(),RecordAppointmentCancellation()

     

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

示例Q2

  

医生:SeePatient()

虽然SeePatient是一个用例,但它对实际类的方法没有意义。你觉得这个怎么样?

4 个答案:

答案 0 :(得分:10)

不幸的是,你所遇到的障碍在学术界是非常典型的。学术项目往往从视频租赁商店,图书馆或学生注册系统开始(你的医疗办公室不同于此),然后通过动物教授遗产。您提供的指南也非常典型

  

他们建议考虑一个对象可以为其方法做些什么,以及它对其属性的责任是什么

事实上,当初学者问我通常会解释一个对象的属性是它所了解的东西,它的方法是它知道如何做的事情。这真的只是另一种说明你在那里的东西的方式。正如您所发现的那样,当您开始讨论更有形的系统而不仅仅是示例时,这种思维方式会很快崩溃。

例如,该指南适用于此对象:

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()之类的操作。请不要将此示例表示人员类没有方法。

Stack Overflow有一些以上可能有用的相关问题:

此外,最好退房:

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

答案 1 :(得分:0)

<强> Q1 是否可能将对象的责任解释为授权或合同要求,以及它们应采取的操作?因此,要从Q2中获取医学示例,具有Scheduler角色的对象(想想C#/ Java接口或Obj-C协议)具有围绕CanEditAppointments或EditsAppointments的属性。

<强> Q2 从用例角度来看,患者可能能够创建约会,因此您可以使用CreateAppointment()方法在对象模型中实现Patient。但是,就封装而言,您可能会在CreateAppointment()中实例化一个Appointment对象,然后在Appointment对象上调用方法或设置属性来设置其时间,日期,患者,医生等。

因为Appointment集合很可能像数据库那样是永久存储,所以Appointment对象有责任将自己添加到集合中(Appointment.Schedule()遍历您的数据访问层以将自己保存到数据库中)。

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

答案 2 :(得分:0)

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

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

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

然后,服务是一个封装系统中某个功能或行为的组件。它在给定的对象模型上运行(可以是自己的内部模型,也可以是系统中更通用的业务对象模型)。如果您使用您的用例并创建与它们直接相关的服务,您可以编写非常易于维护的软件。

DCI Architecture是对此的形式化,并试图做同样的事情,但同时试图通过在对象需要时添加行为来尝试保持对象的真实性。

答案 3 :(得分:0)

我仍然感到困惑:“我告诉你做别的事”或“我做别人问我的事吗?”

也许你所要做的就是扮演芭比娃娃,或G.I.乔了解对象交互以及责任的去向。 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();
}