我正在尝试从OOAD开始,这个问题出现在我的脑海中,我不确定我能找到一个好的解决方案:(它是一个真实世界案例的超简化版本)。
渔夫用钓竿在池塘里钓鱼。在每一次鱼线发射时,当阳光照射时,钓到一条等于1/10的鱼的可能性是1/10,晚上是1/20。
定义哪些类?I将回答:渔夫、FishingRod、池塘、日(用于昼夜建模)。
哪些方法?I将回答: Fisherman.Launch(FishingRod),FIshingRod.TryToFish(池塘)返回布尔值
如何建模的可能性?谁有责任的可能性?它不属于渔夫,也不属于池塘。在这个例子中,只有与日光有关,在现实世界中,它可能也与渔民,钓鱼竿和池塘有关。
如何模拟外部因素(日光)?
欢迎任何评论。还有代码样本。
更新:问题的第一个评论和tdammers的回答迫使我更加具体。正如我在上面所写的“这是一个真实世界案例的超简化版本”,无论如何,我们假设我希望以后增加复杂性,而不是超级增加它,假设增加它足够多,这样我列出的所有类都是好的(例如,因为我跟踪池塘里有多少条鱼,渔夫有多累,…)。无论如何,我最感兴趣的问题是“如何建模可能性”和“外部因素”。对于在OOAD中没有太多技能的人来说,这是一个新手问题。
发布于 2010-09-22 22:12:01
我会有渔夫,FishingRod,FishingLine,池塘,鱼和天空(或“环境”)。
在面向对象的土地上,物体通常比你想象的要聪明。渔夫“有一个”(包含) FishingRod。他将FishingLine (FishingRod的一个组件)转换到池塘中。池塘“看”天空,以确定它是白天还是夜晚,然后滚动骰子,以确定它是否应该把鱼放在线上。
发出抖动的对象层次结构是,FishingLine可以选择性地包含鱼,并且由渔业人员拥有的FishingRod拥有。池塘包含鱼,接收FishingLines,但不“拥有”它们,也知道但不拥有天空。
下面的方法如下所示:
Fisherman.FishingRod -一种初始化属性(或一对getter/setter方法),用于为渔夫提供一个FishingRod到FishAt()一个池。这是可选的;渔夫可以创建自己的FishingRod,或者他自己可以从FishingRods的集合中选择它,而不是给他的FishingRod。
Fisherman.FishAt(池塘)-告诉渔夫使用他的FishingRod启动() FishingLine到池塘,然后检索()它可能会得到一条鱼。
FishingRod.Launch(池塘)-释放鱼竿的FishingLine到池塘。
FishingRod.Retrieve() -从池塘中检索FishingLine,返回一个Fish,这也可能是空值。
Pond.StockWith(Fish[]) --让渔夫用FishingRod捕捞池塘鱼。请记住,在OO-land中,所有东西都必须得到它想要的东西,或者知道如何制作它;如果您想要遵循这样的模型,池塘就可以很容易地创建Fish,但是这里的用户故事没有说明这是如何发生的(通常意味着它超出了故事的范围)。
Pond.SetFishingLine( FishingLine ) --被FishingRod用来把它的FishingLine放在池塘里。这是结合业务逻辑的“驱动功能”。当它被调用时,池塘应该询问天空是否是一天,并且可能会根据给定的时间将一条鱼放到FishingLine上。
Sky.IsDay() -如果白天返回true,如果是夜间返回false。
如果你认为池塘不应该直接知道鱼被放在FishingLine上的确切规则,它可以给FishingLine和它的Fish[]一个所谓的“纯粹的捏造”。这个被称为"FishingLogic“的捏造,将是一个检查天空和应用规则的人。在开发中,这通常是一件好事,因为这意味着FishingLogic可以在不改变池塘的情况下改变,除非FishingLogic需要更多的池塘(比如水温)。
在实际编程中,各种对象表示各种基本的“模式”:
的情况下发生的事情。
发布于 2010-09-22 21:38:34
不上课。没有方法。一个有三个参数的函数。
bool launch_rod(bool daytime, float chance_daytime, float chance_night) {
float chance = daytime ? chance_daytime : chance_night;
float cast = random_float();
return cast < chance;
}非那样做不行。也许,只是可能,将整个过程封装在一个类中,并为该类创建chance_daytime和chance_night属性。任何其他的东西,考虑到规格,都是过度工程的。
发布于 2010-09-22 23:20:28
鱼类也可以“仰望天空”来决定它有多饿。池塘班似乎相当呆板。
Fisherman, Rod, Line, Fish, Sky
Fisherman.cast(), .drinkBeer(), .chooseRod(), .addLineToRod()
Rod.cast()
Line.cast()
Fish.bite()
Fish.checkDay()
Sky.isDay()https://stackoverflow.com/questions/3773781
复制相似问题