ios - Objective-C/iOS -- 根据外部数据不同触发的类设计

标签 ios objective-c oop

这是基于我在调度表上的另一篇文章中提出的切线替代方案。

在 objective-c 面向对象设计中,假设我正在设计一个需要外部数据才能执行的类。该类有许多变体,每个变体在不同的时间根据不同的外部数据以不同的方式执行。执行/实现此设计的最佳方式是什么?

举一个具体的例子,假设这个类代表一种医疗状况。有 100 到 200 种不同的医疗状况,每一种都对不同的刺激使用react,并且一旦被触发,每一种都会做不同的事情。

我需要帮助的主要困难是如何传入触发后执行每个变体所需的数据——无法封装的数据,以及不能简单地用作输入到重写函数的参数的数据医疗条件的每一种变化都是不同的。

例如,当晒伤条件触发时,它需要传入的天气数据来确定严重程度。当失眠触发时,需要最近服用其他药物的病史。消化不良需要消耗食物的重量。当然,触发点也不同,但我已经枚举了它并将其作为枚举值存储在我的父类(super class)中。问题是如何处理数据:我是否为任何子类可能需要的每个可能输入进行子类化?或者使用像 Visitor 这样的设计模式?

感谢您的帮助。

编辑:这是我希望可以使我的问题更具体的示例情况:

一群病人进入一个房间,每个人都有不同的 MedicalCondition(在我当前的代码中,我没有子类化 MedicalCondition,我只称他们为不同的 NSString 名称)。这是病人的属性(property)。然后,通过程序的流程,对每个患者进行各种 MedicalTest。 MedicalTest 具有“int power”、“BOOL putsPatientToSleep”和“float chanceOfCausingFainting”等数据,而且 MedicalTest 与 MedicalTest 之间的差异也很大。房间本身也具有 isSunny、isDark、fullOfContagiousPatients 等属性,一旦 MedicalCondition 爆发,这些属性将成为我需要的数据。

现在,通过一系列测试,假设发生了一个事件,它是被测患者 MedicalCondition 的触发因素之一。假设它被称为@"sunburn"MedicalTest 具有导致被测试患者的 MedicalCondition 激活的质量。我的问题本质上是,在哪里以及如何编写 ExecuteWhenThisConditionFlaresUp(...从 MedicalCondition 到 MedicalCondition 的输入...)的激活代码?例如,当晒伤 Patient 的 MedicalCondition 着火时,我如何改变该响应与发冷 Patient 的响应?给定输入数据,我可以相当简单地编写函数,但问题是输入数据(即函数签名)会因条件而异,而且我还有 100 多个 MedicalConditions 做不同的事情,所以我不确定如果将 MedicalCondition 子类化只是为了在爆发时有不同的行为是正确的。有没有办法在 objective-c 中索引或存储仿函数?也许写 100 个不同的函数,所有函数都有不同的签名,但可以访问通用输入 NSArray,然后用适当的 NSString 存储适当的仿函数? (只保留一个 MedicalCondition 类)

最佳答案

这听起来像是 composition vs inheritance 的完美示例 问题。

如果您尝试为此使用继承,就会遇到问题。假设您有一个类Employee,其中包含子类TechnicianManager。现在假设您有一个 Customer 类,其中包含各种子类。当您的客户同时也是经理时会发生什么?在 Objective-C 中有一个单一的继承链(幸运的是),所以这很难用继承来建模。

这个问题的解决方案是改用组合。这看似简单 - 它只是意味着您创建一个容器类并添加特征(即协议(protocol)或具体协作者)。

它会像这样:

  • 创建顶级 MedicalCondition 类。
  • 进入这个医疗条件可以去其他对象。例如慢性病急性病症状生命体征
  • 寻找共同点并尝试提取抽象基类或接口(interface),您可以将其添加到医疗条件中。

听起来好像您可以将一组Trigger 对象添加到MedicalCondition。这可能是协议(protocol)或抽象基类。

您可能有兴趣探索 domain-driven design

至于其他可能相关的特定模式,鉴于您在问题中描述的高级要求,很难说。我会说尽量关注需求本身和建模它们的过程,而不是寻找早期应用的模式。当您继续建模时,适当的模式会大声喊出来。

更新:(基于评论讨论)

考虑使用观察者模式。在这里你可以有触发器。每当您在触发器上调用 setActivated 方法时,观察到此情况的任何疾病都可以执行操作。 Apple 的框架是键值观察 (KVO)。 .还有一个名为 ReactiveCocoa 的开源框架,您可能会觉得它很有趣。

关于ios - Objective-C/iOS -- 根据外部数据不同触发的类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19738864/

相关文章:

ios - 从 Xamarin 表单导航到 Xamarin Native

javascript - 在 TypeScript 中获取日期的周数

java - (OOP/Java) 我应该如何处理这种子类-父类(super class)关系?

iOS PWA 闪屏?

ios - 又一个 "Mutated while being enumerated"问题

ios - 设计这个核心数据数据库的好方法是什么?

objective-c - ARC 和非 ARC NSString 初始化

ios - didSelectRowAtIndexPath 没有被调用?

objective-c - 应用程序崩溃并显示 "Unable to restore previously selected frame"消息

c++ - 如何使对象获取并存储任意但编译时已知大小的数组?