我将问题从 IRC 移到这里。
问题:我已经进入了一个我想要保持良好状态的代码库。我们不总是吗?
本着这种精神,在添加了一些覆盖率(如测试覆盖率)之后,我应用了几个已知的重构/改进来帮助完成这项任务。这是我所做的(实际上我做了更多,但这些是我的问题的相关部分):
- 添加了一些 PORO 对象以卸载在模型、控制器甚至视图中执行的一些任务。
- 使用 *decent_exposure* 来摆脱视图层所在的实例变量地狱。
- 使用draper实现了一些 for-views 装饰器,以避免在视图中包含太多逻辑。
- 为产生多个模型的操作添加了演示者。
现在,我(乐观地)预计这一切都会得到回报。确实更好,但是除了厨房水槽之外的所有东西都扔了之后,我本以为它会好得多。它不是。
由于我有一个视图层,它实际上是在单个操作上呈现 10-15 个部分,所以我担心我在控制器或视图层中更改内容的能力。每当我决定将帐户的成员称为“成员”或仅称为“用户”时,我都不想经历所有这些部分。我很关心这一点,因为模型层计划遭受更重大的变化。
我最初的想法(并且仍然坚持)是有愚蠢的观点。我希望我的大部分视图层完全避免知道他们正在渲染的模型。我想要一个知道如何做两件事的中间对象:从模型中提取它需要的数据,并呈现 HTML。在你告诉我我在这里违反了 SRP 之前,这个对象的真正责任可以理解为“向最终用户显示模型”。
在过度简化的情况下,我希望我的观点(至少上述这些观点)看起来像这样:
= some_object.render
= another_object.render
它听起来确实像装饰者模式,也听起来像演示者模式,至少我是这样的。
然后我开始认为我会对 MVC(至少是 rails 公开的 MVC)有很大的争议,所以我想知道这是否是最好的解决方案(除了明显的,在这个时间限制下几乎不可能,重写) ,所以我对投篮更有信心。
因此,在这种情况下,我真正的问题归结为:
a) 切换到 MVP、MVVM、MV 是否是解决这个问题的正确解决方案?
b) 如果是,你能告诉我我可以为这个 some_object.render 视图样式使用的最佳解决方案吗?
c)如果不是,能否告诉您如何避免这些部分和视图之间的硬依赖,而模型层可能需要数小时才能被显着重写?
d) 希望你不要来这里:YAGNI,所以之后修复?我很确定我会需要它。
我想到了另一种选择并带到了 IRC,不是真正的标题精神,而是一个有效的选择(尽管我认为手头的任务有点矫枉过正):
e) 添加一个服务层,并使我的视图映射到该服务层上的“逻辑”模型,因此我能够独立于视图更改物理模型。