LaB*_*cca 2 c# java delphi oop
我试图开始使用OOAD,这个问题出现在我的脑海中,我不确定我能找到一个好的解决方案:(它是现实世界案例的超级隐形版本).
渔夫在有钓鱼竿的一个池塘钓鱼.每次发射钓鱼线时,有可能在有阳光和晚上1/20时捕获等于1/10的鱼.
要定义哪些类? 我会回答:渔夫,FishingRod,池塘,日(模拟夜晚和白天).
哪种方法? 我会回答:Fisherman.Launch(FishingRod),FIshingRod.TryToFish(Pond)返回布尔值
如何模拟可能性?谁具有可能性的责任?它不属于渔民或池塘.在这个例子中,只有日光的关系,在现实世界中它可能也与渔夫,钓鱼竿和池塘有关.
如何建模外部因素(日光)?
欢迎任何评论.代码示例.
更新:问题 的第一个评论和tdammers的回答迫使我更具体.正如我上面写的那样"它是现实世界案例的超级隐形版本",无论如何我要说我想要在以后增加复杂性,而不是超级增加它,让我们说增加它就足以让我列出的所有类都很好以上(例如,因为我记录了池塘里有多少鱼,渔民有多累,......).无论如何,对我来说最有趣的问题是"如何模拟可能性"和"外部因素".对于那些在OOAD中没有太多技能的人来说,这是一个新手问题.
我会有渔夫,FishingRod,FishingLine,池塘,鱼和"天空"(或"环境").
在面向对象的土地上,物体通常比你想象的更聪明.渔夫"有一个"(包含)FishingRod.他将FishingLine(FishingRod的一个组成部分)投入Pond.池塘"看"天空以确定它是白天还是晚上,然后滚动骰子以确定它是否应该将鱼放在线上.
抖动的对象层次结构是FishingLine可以选择性地包含Fish,并且由FisherR拥有的FishingRod拥有.Pond包含Fish,接收FishingLines但不"拥有"它们,并且也知道但不拥有Sky.
接下来的方法如下:
Fisherman.FishingRod - 一个初始化属性(或一对getter/setter方法),用于给渔夫一个FishingRod到FishAt()一个池塘.这是可选的; 一个渔夫可以创建他自己的FishingRod,或者他自己可以从FishingRods的集合中选择它,而不是给他的FishingRod.
Fisherman.FishAt(Pond) - 告诉渔夫使用他的FishingRod将钓鱼线发射到池塘,然后检索()它可能会得到一条鱼.
FishingRod.Launch(Pond) - 将FishingRod的FishingLine释放到池塘中.
FishingRod.Retrieve() - 从池塘中取回FishingLine,返回一条鱼,也可能一无所获.
Pond.StockWith(Fish []) - 为渔夫提供池塘鱼以捕获FishingRod.请记住,在OO-land中,一切都必须得到它想要的东西或知道如何制作它; 如果这是你想要遵循的模型,Pond可以很容易地创建Fish,但是这里的用户故事没有说明这是如何发生的(通常意味着它超出了故事的范围).
Pond.SetFishingLine(FishingLine) - 由FishingRod用于将其FishingLine放入池塘.这是包含业务逻辑的"驱动功能".当这个被召唤时,池塘应该询问天空是否有一天,并且可能根据一天中的时间将鱼放在钓鱼线上.
Sky.IsDay() - 一种方法,如果是白天则返回true,如果是黑夜则返回false.
如果你认为池塘不应该直接知道将Fish放在FishingLine上的确切规则,它可以将FishingLine及其Fish []赋予所谓的"纯制造".这个制作"FishingLogic"将是审查天空并应用规则的人.在开发过程中,这通常是一件好事,因为这意味着FishingLogic可以在不改变Pond的情况下进行更改,除非FishingLogic需要更多来自Pond(如水温).
各种对象代表了现实生活中的各种基本"模式":
| 归档时间: |
|
| 查看次数: |
740 次 |
| 最近记录: |