Oop 面向对象设计方法

Oop 面向对象设计方法,oop,class-design,analysis,Oop,Class Design,Analysis,问题1。 在我大学的面向对象建模和设计研究中,他们建议思考对象可以为其方法做什么,以及它对其属性的责任是什么。所有澄清的尝试都导致了进一步的混乱 这倾向于生成一个类图,其中参与者拥有所有动作,内部类只保存数据 这似乎不正确。关于如何对对象建模,还有其他的思考方式吗 问题2。此外,本课程似乎强调按照真实世界中的对象建模,但在领域模型中并不一定有意义。例如,在医疗实践中,他们有患者:CreateAppointment(),CancelAppointment(),但这不是它的实现方式(您将改为修改预约

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

这倾向于生成一个类图,其中参与者拥有所有动作,内部类只保存数据

这似乎不正确。关于如何对对象建模,还有其他的思考方式吗

问题2。此外,本课程似乎强调按照真实世界中的对象建模,但在领域模型中并不一定有意义。例如,在医疗实践中,他们有
患者:CreateAppointment(),CancelAppointment()
,但这不是它的实现方式(您将改为修改预约集合)。有没有其他的思考方式

示例Q1

秘书:RecordAppointment(),RecordAppointmentCancellation()

约会:时间、日期,。。。(无方法)

示例Q2

医生:病人


虽然
SeePatient
是一个用例,但它对于实际类上的方法没有意义。你对此怎么看?

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

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

事实上,当初学者提问时,我通常会解释一个对象的属性是它知道的关于它自己的事情,它的方法是它知道如何做的事情。这实际上只是另一种表达你所拥有的东西的方式。正如您所发现的,当您开始讨论更具体的系统而不仅仅是示例时,这种思维方式很快就会崩溃

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

public class Tree
{
    public int Height { get; set; }
    public void Grow(int byHowMuch)
    {
        Height += byHowMuch;
    }
}
虽然这当然符合条例草案,但你有权认为它“感觉”不对:

那么解决办法是什么呢?这是一个将你所学到的知识运用到实践中的问题。学习和理解将大大有助于开发比一棵知道如何生长的树更实用的系统

建议阅读:

  • (也称为四人帮或GoF)
为了解决您遇到的问题,我可能会使用继承的person类和接口的组合,这些类和接口将通过一系列服务类执行它们的操作。从本质上讲,秘书、医生和患者都将继承person,并且这些类中的每一个都可以传递给相应的服务类。服务类可以执行也可以不执行类似于
SeePatient()
的操作。请不要认为这个例子意味着person类没有方法

堆栈溢出有几个可能有用的相关问题:

此外,最好检查一下:

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

Q1 您的对象的责任是否可能被解释为授权或合同要求,以及他们应该采取的行动?因此,以Q2中的一个医学示例为例,具有调度程序角色(想想C#/Java接口或Obj-C协议)的对象具有CaneditAppoints或EditsAppoints的属性

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

由于约会集合可能像数据库一样是永久存储,因此约会对象有责任将自身添加到集合中(Appointment.Schedule()通过数据访问层将自身保存到数据库中)


这也与Q1有关,因为约会对象的职责是保存自身,因此它可能实现一个ISaveAppoimmation接口,该接口需要字段和方法来执行。预约还负责在保存之前提供日期、时间和患者等信息,因此ISaveAppoimmment界面应该要求这些信息存在,以及预约。Schedule()应该验证值是否正确或以前是否验证过。

您是对的,在许多情况下,更高阶的事物更自然地包含行为,如系统或用户

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

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

服务是封装系统中特定功能或行为的组件。它在一个给定的对象模型上运行(要么是它自己的内部模型,要么是更多的基因模型)
public class Secretary
{
    public void MakeAppoinment(Patient patient)
    {
        //make the appointment
    }
}
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();
}