面向对象设计中的方法

2024-01-12

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

这往往会生成一个类图,其中包含具有所有操作的参与者和仅保存数据的内部类。

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

Q2。此外,该课程似乎强调按照现实世界的对象对对象进行建模,但它在领域模型中不一定有意义。 IE。在医疗实践中,他们Patient: CreateAppointment(), CancelAppointment()但这不是它的实现方式(您可以修改约会集合)。还有另一种思考方式吗?

示例 Q1

秘书:预约记录()、取消预约记录()

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

示例 Q2

医生:SeePatient()

While SeePatient是一个用例,它对于实际类上的方法没有意义。您对此有何看法?


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

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

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

例如,该指南与该对象配合得很好:

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
    }
}

那么解决办法是什么呢?问题在于如何接受并应用所教的内容。学习与理解设计模式 http://en.wikipedia.org/wiki/Design_Patterns对开发比知道如何生长的树更实用的系统有很大帮助。

推荐阅读:

  • 设计模式:可重用的面向对象软件的元素 https://rads.stackoverflow.com/amzn/click/com/0201633612(也称为四人帮或 GoF)
  • 首先设计模式 https://rads.stackoverflow.com/amzn/click/com/0596007124
  • 面向对象的分析与设计 https://rads.stackoverflow.com/amzn/click/com/0596008678

为了解决您遇到的问题,我可能会使用继承的人员类和接口的组合,它们将通过一系列服务类执行其操作。本质上,秘书、医生和病人都将从 person 继承,并且每个类都可以传递给伴随的服务类。服务类可能会也可能不会做类似的事情SeePatient()。请不要将此示例视为人员类没有方法。

Stack Overflow 有多个可能有用的相关问题:

  • 单一职责原则是 OOP 的规则吗? https://stackoverflow.com/q/15412/61654
  • OOP 有什么规则吗? https://stackoverflow.com/q/399656/61654
  • 为什么 OOP 对我来说很难? https://stackoverflow.com/q/2035449/61654

此外,最好检查一下:

  • 单一责任原则 http://en.wikipedia.org/wiki/Single_responsibility_principle
  • 不要重复自己 http://en.wikipedia.org/wiki/Don't_repeat_yourself
  • 食物原理 http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面向对象设计中的方法 的相关文章

  • 为什么将私有字段和方法放在类的顶部?

    我在很多语言的很多地方都看到过这个事实上的标准 但我从来没有理解过它 为什么要把你的私有字段和方法放在类声明的顶部 打个比方 似乎私有的东西应该位于底部 隐藏 所有公共的东西都应该位于顶部 这样当你从上到下阅读类时 你首先看到公共接口 然后
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 替代 __del__ 来获得最终结果并终止类中的进程?

    这个虚拟类类似于我当前的项目 class EndProcess object def init self self Q multiprocessing Queue self p1 multiprocessing Process target
  • Smalltalk:消息的发送者是什么?

    在smalltalk中 一切都是通过向接收者对象发送消息来发生的 其语法通常遵循以下格式接收者消息 其中接收者是消息发送到的对象 现在我忍不住想知道 smalltalk 消息的发送者是什么 考虑以下smalltalk 语句 aMorph c
  • 无法分配给对象“[object Object]”的只读属性“名称”

    以下代码仅会抛出错误name财产 可以通过指定来修复name属性可写Object create争论但是我试图理解为什么会发生这种情况 也许有一种更优雅的方法来解决它 var BaseClass function data Object as
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • PHP:数据库连接类构造方法

    我是面向对象编程的新手 最初 我是在类内部和构造函数外部定义变量并为其赋值 但是在今天的 Java OOP 课程之后 我被告知这是不好的风格 应该避免 这是我模拟的原始 PHP 数据库连接类 class DatabaseConnection
  • 是否可以在 Python 中子类化 Lock() 对象?如果没有,还有其他方法来调试死锁吗?

    所以 我有一个多线程Python程序 它目前正遭受死锁 我打算通过子类化 threading Lock 对象来记录锁获取 import traceback class DebugLock threading Lock def acquire
  • 避免内存泄漏

    所以我正在学习 C 中的 OOP 我认为编写自己的字符串类是一个很好的实践 当然是为了学习目的 我提出了一个我不知道如何解决的问题 这是一些和平的代码 class String char str public String char con
  • 如何从继承的方法中获取派生类的路径?

    如何从继承的方法中获取当前类的路径 我有以下内容 and
  • 这是重载,不同类中具有相同名称和不同签名的方法吗?

    如果我有以下 Java 代码 class A public int add int a int b return a b class B extends A public float add float a float b return a
  • Objective-C 继承中@synthesize/@property 的使用

    如果您有一个带有实例变量 foo 的类 A 该类具有 property synthesize 指令 并且类 B 继承自类 A 那么它是否还需要 property synthesize foo 我问的原因是因为当我尝试使用 B 类的 foo
  • VB.NET 中的“阴影”与“覆盖”

    这两个关键词有什么意义Shadows http msdn microsoft com en us library 1h3wytf6 aspx and 覆盖 http msdn microsoft com en us library k777
  • 如果我们在实体类的getter和setter中添加逻辑是不是不好的设计

    JAVA 8 我有一个 POJO 类 class User private String name private String password Getters Setters 我将使用它作为实体类 在 getter setter 中pa
  • 非静态类中的静态方法和静态类中的静态方法有什么区别?

    我有两个班级A级和B级 static class ClassA static string SomeMethod return I am a Static Method class ClassB static string SomeMeth
  • PHP 接口有属性吗?

    PHP 中的接口有属性 还是只有方法 您可以在 DocBlock 中为接口声明属性 然后 IDE 将提示接口的这些属性 PhpStorm 会这样做 但这不会强制在实现类中实际实现这些字段 例如 property string passwor
  • tkinter - 使用按钮在帧之间来回切换

    我需要功能 最好是一个功能 当按下下一页和后退按钮时可以在页面之间来回切换 我想这可以通过将布尔变量分配给后退和下一页按钮来完成 不确定是否可以这样做 来确定您是否要前进或后退所有页面的有序列表 需要知道当前升高的框架的索引 索引可用于找出
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • 在 Perl 中,如何将一个函数作为另一个函数的参数传递?

    我编写了以下 Perl 类 package Menu use strict my MENU ITEMS my HEADER Pick one of the options below n my INPUT REQUEST Type your
  • 面向对象的编程和事务

    一点介绍 类包含字段和方法 这次让我跳过属性 字段代表一个state班级的 方法描述behavior班级的 在设计良好的类中 如果方法抛出异常 则不会更改类的状态 对吧 换句话说 无论发生什么 类的状态都不应该被破坏 问题 是否有一个框架

随机推荐

  • 具有 CuDNNLSTM 层的 Keras 模型无法在生产服务器上运行

    我使用 AWS p3 实例通过 GPU 加速训练以下模型 x CuDNNLSTM 128 return sequences True inputs x Dropout 0 2 x x CuDNNLSTM 128 return sequenc
  • JavaScript 中有语音或语音就绪事件吗? [复制]

    这个问题在这里已经有答案了 我在 Google Chrome 上尝试了以下操作 它会打印出来0声音 然后再次打印0我的电脑上有声音 但如果我重新加载页面以重新开始 并将最后一行更改为setTimeout foo 1000 那么第一行会打印出
  • 函数printf()打印退格问题

    有两个程序 它们得到不同的结果 但我不明白为什么 这是第一个 int main printf 12345 fflush stdout printf b b fflush stdout return 0 结果是 123 然后是第二个 int
  • 在单击按钮之前不要对引导表实施过滤器控制

    我提出的问题的后续行动earlier https stackoverflow com questions 64720472 add button on header th to hide and show filter control in
  • 将自定义类型转换注入 .NET 库类

    我想通过C 中的Convert ChangeType实现两个库类之间的转换 我无法改变这两种类型 例如 Guid 和 byte 之间的转换 Guid g new Guid object o1 g byte b byte Convert Ch
  • 在 Laravel 5.x 中组织 trans() 本地化文件的好策略有哪些?

    这是一个关于方法论和建议实践的问题 我知道它并没有严格依附于框架 甚至不是 PHP 答案可能是 这取决于你 但我关心的是最佳实践和方法 因为通常存在针对特定环境的最佳方法 我想知道哪些是最佳实践键命名为了trans 的函数Laravel 5
  • 在 Linux 中禁用网络摄像头自动对焦

    我正在 beagleboard 的嵌入系统中工作 源代码是Python的 但我从OpenCV导入库来进行图像处理 实际上 我使用的是 Logitech c910 网络摄像头 它是一款出色的摄像头 但它具有自动对焦功能 我想知道是否可以从 P
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • 在mongoDB的一个文档中插入多个json文件

    我有个问题 但是如何在一个文档集合中插入许多 json 文件呢 我有一个与 mongoDB 连接的 ruby 脚本 它为每个 ID 产品生成 json 文件 在 mongo 中我应该想要一个像这样的结构 Id document s name
  • 上传php时重命名图像文件

    我有一个用于上传图像的表格 index html 将数据提交到 resizer php 编码如下 索引 html
  • 如何将 dict_values 转换为集合

    我有一个dict包含集合作为每个键的值 例如 key1 8772 9605 key2 10867 10911 10917 key3 11749 11750 key4 14721 19755 21281 现在我想把每个值 即一组int变成一个
  • PHP 会话过期过早

    我遇到一个问题 我的应用程序会话在大约 15 分钟后意外过期 我需要它们在 4 小时后过期 服务器是Centos 5 5 PHP是5 3 2 下面是我的代码 包含在全局标头中
  • 图像大小应该在 img 标签高度/宽度属性中定义还是在 CSS 中定义? [复制]

    这个问题在这里已经有答案了 在中定义图像大小是否更好的编码实践img tag s width and height属性 img src images academia vs business png width 740 height 382
  • PHP MySQL 生成唯一的随机数

    我不明白为什么我的代码不起作用 连接工作正常 其他一切都正常 但是当我尝试生成一个唯一的随机数并从 MySQL 检查该数字是否存在时 它仍然打印出一个随机数 但它不是唯一的 有人可以帮助我吗 这是我的代码 num rand 1 5 sel
  • 如何正确克隆(jQuery)通过 PIE 应用样式的元素?

    我一直在使用 htc的版本PIE http css3pie com在一个新项目 专门针对 IE8 上成功 但是 在尝试克隆应用了 PIE 样式的元素时遇到了麻烦 我有一个 jsfiddle 说明了问题here http jsfiddle n
  • node.js:child_process.exec()的回调函数有没有办法返回进程PID

    Node JS 执行问题 我有一个生成多个进程的程序 我想通过在进程完成时捕获 PID 来记录进程完成的顺序 据我所知 标准回调不包括 PID stdout stderr 和错误 我想避免使用spawn 但看起来我必须这样做 除非任何善良的
  • mysql 连接。我应该在每次事务之前保持它的活动状态还是启动一个新连接?

    我正在第一次尝试 mysql 我对如何处理我的应用程序的连接有疑问 我现在正在做的是打开一个连接并保持它的活动状态 直到我终止我的程序 我时不时地执行一次 mysql ping 并使用 MYSQL OPT RECONNECT 启动连接 另一
  • 如何使用rails中的form_tag方法在params中传递参数

    我正在尝试传递一个参数params tab gt drive 在 car path 方法中使用 form tag 但它在 car path 参数中不可用 这就是我正在尝试的 有点不同的想法 使用 a 不是更好吗 隐藏字段 http api
  • 在这种情况下,“动态声明的字段”是什么意思?

    我对 OOP 和 PHP 还很陌生 我正在使用 IDE PhpStorm 它给了我这个 见下文 关于我参考的警告 width 这是我的代码 我以前从未见过 字段 一词 并且我不完全确定 动态声明字段 这句话的含义 看来这个警告是我今天更新
  • 面向对象设计中的方法

    Q1 在我大学的面向对象建模和设计研究中 他们建议思考对象可以为其方法做什么 以及它对其属性的责任是什么 所有澄清的尝试都导致了进一步的混乱 这往往会生成一个类图 其中包含具有所有操作的参与者和仅保存数据的内部类 这似乎不正确 是否有另一种