【问题标题】:How to model classes that do calculations and store them?如何为进行计算的类建模并存储它们?
【发布时间】:2016-05-12 22:20:26
【问题描述】:

我必须开发一个类,它是金融应用程序的一部分,它接收两个属性并返回两个结果。在你认为它不是一个类,而是一个方法之前,我不得不说我必须坚持两个:两个用户提供的参数和两个输出。让我们在这个模拟中进行如下说明:

 ----------------
|PetWash         |
|----------------|
|petWeight       |<- user provided
|petHeight       |<- user provided
|ammountSoapUsed |<- system calculated
|price           |<- system calculated
 ----------------
  1. 我应该在模型类中进行计算吗?例如,代表这个实体的同一个模型类应该包含进行这些计算的方法吗?还是应该创建一种“计算引擎”来返回数据并将其存储在计算字段中?

  2. 如果是第一种情况,我应该在 getter 方法中调用计算,还是只创建一个“计算”方法来更新 ammountSoapUsed 和价格的值?从这个意义上说,我是否应该只存储 petWeight 和 petHeight 并在每次需要它们时计算 ammountSoapUsed 和 price(请记住,在实际案例中计算要复杂得多)?

事实上,我对我能做什么不感兴趣,而是对 OOP 最佳实践建议做什么感兴趣。你能帮帮我吗?

【问题讨论】:

    标签: oop design-patterns uml


    【解决方案1】:

    理想的面向对象方法始于对问题域的分析。 PetWash 听起来不像是一个问题域的概念,它听起来像是发生的宠物清洗事件的记录,或者您将提供给客户的宠物清洗的估计。它是哪一个?说清楚。

    1. 对问题域进行建模,以更好地了解信息和操作要求。类必须与问题域的真实世界产生共鸣。 CalculationEngine 当然不符合这个标准。类当然可以进行计算,但它们应该提供非技术业务人员可识别的业务价值。假设目的是为潜在客户提供估计,对我来说有意义的是Customer 类的一个实例,它链接到Animal 类的多个实例,每个实例都有一个height 和weight .链接到Customer 类的实例可能是链接到要清洗的Animal 实例的Estimate 类的实例。以此类推。

    2. 您的问题太低级了。您既不应该在 getter 中调用计算,也不应该提供 calculate() 操作。专注于对非技术业务人员有意义的操作。同样,假设您要提供估算值,请提供对 Customer 实例的操作,以添加或更新他或她的 Animals。当给定一个或多个客户的Animals 时,提供一个提供Estimate 的操作。 Estimate 封装了规则和计算。如果Customer 同意Estimate,您可以使用它来管理您的肥皂库存或其他任何东西。将实现隐藏在这个问题域外观之后,这样您就可以在需要时(而不是如果)更换错误的实现。

    我最近看到的大多数 OO 代码都完全忽略了问题域,并且似乎在尝试敏捷的同时使用口香糖和胶带构建应用程序。问题域的良好模型相对持久。与此形成鲜明对比的是,专注于解决方案领域(管道胶带设计)是不持久的,并且是导致大量成本超支、昂贵的返工和取消项目的原因。不要让你的项目成为其中之一!

    【讨论】:

    • 好点。谢谢你的解释。我完全同意你的看法。我们在设计和项目上花费的每一分钟都可以在开发、测试和执行给客户的过程中节省一个小时或更多。出于这个原因,我决定在我做这个项目的时候在这里问。我真正的问题不涉及宠物,它是一个更抽象的金融应用程序,但这个概念是适用的。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多