面向对象设计中的方法

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(使用前将#替换为@)

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

  • 错误 - 仅返回类型不同的函数不能重载。由 小码哥发布于

    我正在尝试创建一个图书馆管理系统 我收到一些我不明白的错误 我在 Mac 操作系统中使用 Eclipse 我的主要代码是 include
  • Python 对象属性 - 访问方法

    假设我有一个具有某些属性的类 在 Pythonic OOP 中 如何访问这些属性是最好的 就像obj attr 或者也许编写 get 访问器 此类事物可接受的命名风格是什么 Edit 您能否详细说明使用单下划线或双前导下划线命名属性的最佳实
  • 如何将一个窗格连接到另一个窗格

    如何将输出连接到paneWithList PaneWithList其上有一个监听器JList以便将所选行输出到控制台 我怎样才能将该输出定向到JTextPane关于输出 Could PaneWithList触发一个事件Main拿起 会属性更
  • 初始化父类时如何返回子类的新实例?

    给定一个类层次结构如下 class A def initialize param if param 1 then initialize and return instance of B else initialize and return
  • ASP.NET/ADO.NET:处理 .NET 对象内的许多数据库连接?

    我们有一个 NET 对象 它对数据库进行大量读 写操作 在该对象 或使用它的 ASP 页 的整个生命周期中 它可能会通过查询 更新来访问数据库 1 到 10 次 它不是在每次对象需要访问数据库时打开和关闭数据库连接 而是只是在实例化期间打开
  • 为什么c++中的构造函数不能声明为静态?

    我最近读完了第一卷 Bruce Eckel 的 Thinking in C 现在转向将这些知识应用到一些实际用途中 我最近正在使用静态成员函数 并尝试将构造函数设为静态 但编译器对此不满意 我查了书上的原因 但没有找到 谁能解释为什么 P
  • 在 C++ 中什么时候应该使用“friend”?

    我一直在阅读C FAQ http yosefk com c fqa 并且很好奇friend http yosefk com c fqa friend html宣言 我个人从未使用过它 但我有兴趣探索该语言 使用的一个很好的例子是什么frie
  • 在 Typescript 中从基类创建子类的新实例[重复]

    这个问题在这里已经有答案了 我想创建新实例Child班级来自Base类方法 这有点复杂 但我会尽力解释 这是一个例子 class Base constructor clone Here i want to create new instan
  • 依赖注入系统中的事件朝哪个方向发展?

    上或下 我是一个非常注重视觉的人 我将我的应用程序视为一个层次结构 顶部是根 底部是叶子 我还了解到 在 DI 系统中 容器不知道其所包含对象的职责 功能 相反 所包含的对象知道它们的上下文 因为上下文 依赖项 被注入 UP 非 DI 方式
  • 类是否应该有静态和非静态成员

    我试图找出一个类何时适合同时具有静态和非静态函数 又名 obj new ClassA obj gt doOOPStuff something ClassA doStaticStuff Note This example is done in
  • 工厂模式和策略模式

    我需要创建一个类来负责结果集处理 但可能会发生应该使用不同的算法来处理该结果集的情况 我知道以下选项 1 使用策略模式 伪代码如下 interface Strategy processResultSet ResultSet rs class
  • R参考类问题

    我正在尝试在 R 中创建一个简单的参考类 这是我的代码 R 初学者 MyClass lt setRefClass MyClass fields list a numeric b numeric methods list initialize
  • R 中使用 `UseMethod()` 与 `inherits()` 来确定对象的类

    如果我需要根据 R 对象的类以不同的方式处理它们 我可以使用if and else在单个函数内 foo lt function x if inherits x list Foo the list else if inherits x num
  • 使用元类的 __call__ 方法而不是 __new__?

    在讨论元类时 the docs http docs python org reference datamodel html state 您当然也可以重写其他类方法 或添加新的 方法 例如定义一个自定义 call 方法中的 元类允许在调用类时
  • 在javascript中访问函数内的实例变量?

    如何以最简单的方式访问函数内的实例变量 function MyObject Instance variables this handler Methods this enableHandler function var button doc
  • 什么是对象序列化和反序列化?

    什么是对象序列化 and 反序列化 序列化与读取对象的属性 然后用它们填充 DataRow 的列 最后将 DataRow 保存在数据库中等普通技术有什么区别 序列化通常是指创建可用于存储 可能在文件中 通过网络传输或仅用于进程之间传输的数据
  • 收到警告“标头不能包含多个标头,检测到新行”

    我正在用 oops 进行编码 以便用 PHP 上传图像 但是提交图片后却出现警告 标题不能包含多个标题 检测到新行 下面是我的函数 它给出了错误 public function ft redirect query if REQUEST UR
  • 为什么需要在 Python 方法中显式使用“self”参数? [复制]

    这个问题在这里已经有答案了 当在 Python 中的类上定义方法时 它看起来像这样 class MyClass object def init self x y self x x self y y 但在其他一些语言中 例如 C 您可以使用
  • 使用超类初始化器初始化类

    我有两个类 一个是另一个的子类 比如说Animal and Dog 超类有一些初始化器 比如initAnimal 子类有一些初始化器 比如initDog 问题是 从编译器的角度来看 做类似的事情是完全合法的Dog adog Dog allo
  • 具有更高可见性的重写方法是良好的实践吗?

    回答这个问题 如何使用 GUI 使用 PaintComponent 初始化 GUI 然后添加基于鼠标的 GUI https stackoverflow com questions 21336141 how to gui using pain

随机推荐

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