【问题标题】:Where to put total() for an entity object in the OOP way that easy to use in presentation?以易于在演示中使用的 OOP 方式将实体对象的 total() 放在哪里?
【发布时间】:2013-07-26 10:49:56
【问题描述】:

我有一个与 OOP 相关的琐碎问题让我感到困惑:在 Invoice 类中,有一个 total() 方法将执行计算并返回结果计算。在编码表示层时,特别是“添加新发票”屏幕,我需要在用户输入数据时显示Invoicetotal()。此时,因为这是一个“添加新”屏幕,所以我还没有计划在用户单击“保存”按钮后创建的 Invoice 对象。用户输入的数据仍然存储在视图模型中(文本字段的值、组合框等)。

没有Invoice 对象意味着我无法在用户输入发票数据时调用total() 来显示正在进行的总计。但是根据我从 OOP 书籍中了解到的,total() 方法应该属于Invoice 类。

在不改变表示层要求的情况下有什么更好的设计:屏幕应该在用户输入新发票数据时显示临时总计?

【问题讨论】:

  • 据我了解,在提交 Invoice 表单期间,更新 Invoice 对象和总价值,将该值存储在变量中(last_updated_total)。下次加载 UI/Invoice 表单时,只需调用一个函数,该函数将返回 last_updated_total 值。该函数将充当表示层的消息传递接口。
  • 当用户在文本字段输入或选择组合框时,我需要显示一个实时的total() 值。用户输入的值仍在表示层中,尚未最终确定。用户尚未提交表单。我可以将Invoice.total() 源代码复制到表示层的控制器,但这会导致重复。
  • 您必须保留一些东西作为缓冲区,在该缓冲区中仅更新发票表单中需要实时计算的那些字段。在获得对每个项目的关注时,从缓冲区读取和操作数据并将其显示在 UI 中。您必须为视图和计算之间的通信维护一个中间层。
  • 你的意思是,在 OOP 方式中,我不应该将 total() 作为 `Invoice' 类的方法?
  • 视情况而定,如果您仅将 total() 用于此目的,则无需保留它,您可以轻松地从 UI 的每个项目的 getXX() 获取状态,您可以在 Save() 点击时更新。您可以保留一个像 buffer() 这样的函数,它将包含作为通信中间层的行为,并且当用户要填充 UI 时它会更新数据,但该数据不会反映在 Invoice 对象中。只有在 UI 中单击保存按钮后才会保存。你也可以在里面进行很多优化。

标签: oop


【解决方案1】:

答案很明显:即使添加一个新模型,您也需要有一个Invoice 模型。视图模型不应该在没有支持模型的情况下工作;它应该是一个提供便利的中间层

【讨论】:

  • 我将在用户提交表单后创建Invoice 对象(单击“保存”按钮)。但是我需要在用户输入文本字段或选择组合框时从Invoice 值显示实时total()。来自用户的输入还不是最终的,所以我将它们存储在视图模型中。你的意思是我应该在用户输入文本字段后立即将输入直接存储到一个新的Invoice 实例中?
  • @DavidBower:是的。如果没有模型支持,视图模型永远不会存在。所以必须有一个模型,但在这种情况下,它将是一个尚未保存的模型。
  • 这回答了我的问题,尽管它需要我为表单中的每个组件设置事件处理程序以充当活页夹,或使用 MVVM 框架。
猜你喜欢
  • 2011-05-03
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多