首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于这个简单的OOAD问题,哪个是最优雅的设计?

对于这个简单的OOAD问题,哪个是最优雅的设计?
EN

Stack Overflow用户
提问于 2010-09-22 21:30:38
回答 3查看 750关注 0票数 2

我正在尝试从OOAD开始,这个问题出现在我的脑海中,我不确定我能找到一个好的解决方案:(它是一个真实世界案例的超简化版本)。

渔夫用钓竿在池塘里钓鱼。在每一次鱼线发射时,当阳光照射时,钓到一条等于1/10的鱼的可能性是1/10,晚上是1/20。

定义哪些类?I将回答:渔夫、FishingRod、池塘、日(用于昼夜建模)。

哪些方法?I将回答: Fisherman.Launch(FishingRod),FIshingRod.TryToFish(池塘)返回布尔值

如何建模的可能性?谁有责任的可能性?它不属于渔夫,也不属于池塘。在这个例子中,只有与日光有关,在现实世界中,它可能也与渔民,钓鱼竿和池塘有关。

如何模拟外部因素(日光)?

欢迎任何评论。还有代码样本。

更新:问题的第一个评论和tdammers的回答迫使我更加具体。正如我在上面所写的“这是一个真实世界案例的超简化版本”,无论如何,我们假设我希望以后增加复杂性,而不是超级增加它,假设增加它足够多,这样我列出的所有类都是好的(例如,因为我跟踪池塘里有多少条鱼,渔夫有多累,…)。无论如何,我最感兴趣的问题是“如何建模可能性”和“外部因素”。对于在OOAD中没有太多技能的人来说,这是一个新手问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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需要更多的池塘(比如水温)。

在实际编程中,各种对象表示各种基本的“模式”:

  • 渔夫是一个“演员”,最接近于我们的用户。这样一个系统的用户基本上站在演员的肩上,告诉他该怎么做。
  • FishingRod是“助手”或“实用程序”。它是一个与“工具”类似的现实世界,包含状态和业务逻辑的混合,帮助它在这个模型中执行非常具体的task.
  • FishingLine,类似于“请求”或“命令”。它的唯一目的是从一个对象到另一个对象,当这种情况发生时,它表明recipient.
  • Fish应该采取特定的行动,这是一个“响应”,是对请求的回答。可能有一个,也许不是。
  • Pond是一个“存储库”;它包含一些东西,并根据一组逻辑处理外部对象对这些东西的请求。
  • Sky是一个“状态桶”。它拥有数据,并通过它的interface.
  • FishingLogic提供对这些数据的访问,这是一个“纯粹的捏造”;它与我们正在建模的现实世界中的“名词”(对象)没有任何相似之处,并且存在于包含环境规则的事物中,或者在模型对象不知道如何(鱼如何决定上钩?)

的情况下发生的事情。

票数 7
EN

Stack Overflow用户

发布于 2010-09-22 21:38:34

不上课。没有方法。一个有三个参数的函数。

代码语言:javascript
复制
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属性。任何其他的东西,考虑到规格,都是过度工程的。

票数 2
EN

Stack Overflow用户

发布于 2010-09-22 23:20:28

鱼类也可以“仰望天空”来决定它有多饿。池塘班似乎相当呆板。

代码语言:javascript
复制
Fisherman, Rod, Line, Fish, Sky

Fisherman.cast(), .drinkBeer(), .chooseRod(), .addLineToRod()
Rod.cast()
Line.cast()
Fish.bite()
Fish.checkDay()
Sky.isDay()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3773781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档