我试图开始使用OOAD,这个问题浮现在我的脑海,我不确定能否找到一个好的解决方案:(这是现实世界案例的简化版本)。
渔夫在有钓鱼竿的一个池塘钓鱼。
在每次钓鱼线发射时,在有阳光的情况下钓到一条鱼的可能性等于1/10,在夜间则等于1/20。
要定义哪些类?
我会回答:渔夫,FishingRod,池塘,白天(用于白天和黑夜的建模)。
哪些方法?
我会回答:Fisherman.Launch(FishingRod),FIshingRod.TryToFish(Pond)返回布尔值
如何模拟可能性?谁负责可能性?它不属于渔夫,也不属于池塘。在此示例中,仅与日光有关,在现实世界中,它也可能与渔民,钓鱼竿和池塘有关。
如何建模外部因素(日光)?
欢迎发表任何评论。还编码示例。
更新:
对问题的第一条评论和tdammers的回答迫使我更加具体。
正如我在上面所说的“它是现实世界案例的简化版本”,无论如何,我想说以后要增加复杂性,而不是超级地增加它,比如说足够增加它,这样列出我列出的所有类是一件好事以上(例如,因为我跟踪池塘中有多少鱼,渔夫有多累,...)。无论如何,对我来说最有趣的问题是“如何对可能性建模”和“外部因素”。
对于没有OOAD技能的人来说,将此视为新手问题。
最佳答案
我要有渔夫,FishingRod,FishingLine,池塘,鱼和“天空”(或“环境”)。
在面向对象的土地上,对象通常最终比您想象的要聪明。渔夫“有一个”(包含)FishingRod。他将FishingLine(FishingRod的一部分)投到Pond中。池塘“注视”天空以确定是白天还是夜晚,然后掷骰子以确定是否应该将鱼放在钓线上。
令人震惊的对象层次结构是FishingLine可以选择包含Fish,并且由FishRoad拥有,后者由Fisherman拥有。池塘里有鱼,可以钓到鱼线,但不“拥有”它们,也知道但不拥有天空。
遵循的方法如下所示:
Fisherman.FishingRod-一个初始化属性(或一对getter / setter方法),用于为Fisherman提供一个FishingRod到FishAt()一个池塘。这是可选的;渔夫可以创建自己的FishingRod,或者他自己也可以从FishingRods的集合中选择它,而不是将FishingRod提供给他。
Fisherman.FishAt(Pond)-告诉渔夫使用他的FishingRod将FishingLine发射()到池塘中,然后检索()它可能得到一条鱼。
FishingRod.Launch(Pond)-将FishingRod的FishingLine释放到池塘中。
FishingRod.Retrieve()-从池塘中检索FishingLine,返回一条Fish,也可能什么也不是。
Pond.StockWith(Fish [])-给池塘里的鱼供渔夫钓到FishingRod。记住,在面向对象的领域中,必须给所有东西想要的东西,或者知道如何做。如果您要遵循该模型,则Pond可以轻松地创建Fish,但是此处的用户故事并未说明这种情况如何发生(通常意味着它不在故事范围之内)。
Pond.SetFishingLine(FishingLine)-FishingRod用于将其FishingLine放在池塘中。这是包含业务逻辑的“驱动功能”。呼叫时,池塘应询问天空是否是白天,并可能根据一天中给定的机会将一条鱼放到FishingLine上。
Sky.IsDay()-如果白天则返回true,如果夜晚则返回false。
如果您认为池塘不应该直接知道将鱼放置在FishingLine上的确切规则,则可以将FishingLine及其Fish []赋予所谓的“纯制造”。这种制造方法“ FishingLogic”将是检查天空并应用规则的一种方法。在开发中,这通常是一件好事,因为这意味着FishingLogic可以更改而无需更改Pond,除非FishingLogic需要从Pond中获取更多信息(例如水温)。
各种对象代表现实编程中的各种基本“模式”:
渔夫是一个“演员”,最接近我们的用户。这样的系统的用户基本上站在演员的肩膀上,并告诉他该怎么做。
FishingRod是“帮助程序”或“实用程序”。它是“工具”的真实世界模拟,包含状态和业务逻辑的混合体,可帮助其执行非常具体的任务。
此模型中的FishingLine与“请求”或“命令”相似。它的唯一目的是将一个对象提供给另一个对象,并且在发生这种情况时,它表明接收者应该采取特定的措施。
鱼是一种“反应”;请求的答案。可能有一个,也许没有。
池塘是一个“仓库”;它包含事物,并根据一组逻辑处理外部对象对这些事物的请求。
天空是一个“状态桶”。它具有数据,并通过其接口提供对该数据的访问。
FishingLogic是一种“纯粹的伪造”。它与我们正在建模的现实世界中的“名词”(对象)没有类似物,并且存在着包含环境规则或在模型对象不必知道如何发生的情况下发生的事情(鱼是如何决定钩上钩子的?)