这是基于我在调度表上的另一篇文章中提出的切线替代方案。
在 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,其中包含子类Technician 和Manager。现在假设您有一个 Customer 类,其中包含各种子类。当您的客户同时也是经理时会发生什么?在 Objective-C 中有一个单一的继承链(幸运的是),所以这很难用继承来建模。
这个问题的解决方案是改用组合。这看似简单 - 它只是意味着您创建一个容器类并添加特征(即协议(protocol)或具体协作者)。
它会像这样:
听起来好像您可以将一组Trigger 对象添加到MedicalCondition。这可能是协议(protocol)或抽象基类。
您可能有兴趣探索 domain-driven design 。
至于其他可能相关的特定模式,鉴于您在问题中描述的高级要求,很难说。我会说尽量关注需求本身和建模它们的过程,而不是寻找早期应用的模式。当您继续建模时,适当的模式会大声喊出来。
更新:(基于评论讨论)
考虑使用观察者模式。在这里你可以有触发器。每当您在触发器上调用 setActivated 方法时,观察到此情况的任何疾病都可以执行操作。 Apple 的框架是键值观察 (KVO)。 .还有一个名为 ReactiveCocoa 的开源框架,您可能会觉得它很有趣。
关于ios - Objective-C/iOS -- 根据外部数据不同触发的类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19738864/
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我有一个rubyonrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD