【发布时间】:2013-07-26 10:49:56
【问题描述】:
我有一个与 OOP 相关的琐碎问题让我感到困惑:在 Invoice 类中,有一个 total() 方法将执行计算并返回结果计算。在编码表示层时,特别是“添加新发票”屏幕,我需要在用户输入数据时显示Invoice 的total()。此时,因为这是一个“添加新”屏幕,所以我还没有计划在用户单击“保存”按钮后创建的 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