这是一个广泛的问题,我很欣赏没有简短/愚蠢的回答:“哦,这是模范工作,这个任务是迟钝的(期间)”
问题我在人们工作的地方创建了一个超过2年的系统,用于管理制造过程中的过度需求,尽可能简化,包括销售,购买,组装,系统编码Ruby On Rails。
应用程序已经多次更改,结果是回调混乱(有些被称为多次),200多个型号和胖控制器:总错误。
QUESTION 是,如果有一个gem或模式设计用于处理Rails大型应用程序逻辑?逻辑应该能够与模型完全对话(其唯一关注的是数据格式处理和验证)
我 EXPECT 是为了降低各种控制器的复杂性,并且难以跟踪回调到负责处理业务操作逻辑的文件。在某些情况下,需要等待响应,而在其他情况下,只有输入的验证就足够了,并且会发生bg过程。
即:
- >出售一些产品(需要等待操作完成)
1.设置View以获取产品输入
2.控制器获取员工输入的产品列表并调用逻辑
Logic::ExecuteWithResponse('sell', 'products', :prods => @product_list_with_qtt, :when => @date, :employee => current_user() )
此逻辑将处理采购订单,装配订单,机器计划,仓库预订等 请记住,SalesOrder上的回调是不够的,因为它取决于它的调用位置(没有字段),取决于用户的类,以及模型不可见的其他内容,或者在某些情况下,它会需要很长时间才能处理模型。
答案 0 :(得分:3)
业务对象和逻辑的固有复杂性需要为团队解决,理解和内化(或至少记录良好)。那不会消失。我的建议是获取遍布“胖”控制器的所有逻辑,并将它们移动到域对象,应用程序服务(服务层)或简单的事务脚本中(参见Martin Fowler的“企业应用程序架构模式”)。
理想情况下,嵌入在回调迷宫中的所有业务逻辑都可以重构为上述组件以促进理解。这消除了控制器上随着时间的推移而累积的所有偶然复杂性。但即使在摆脱了所有这些之后,我怀疑在问题领域仍会存在一定程度的固有复杂性。
答案 1 :(得分:1)
服务层的想法是结合高级逻辑,这种逻辑与某种模型无关。如果您开发类似系统的企业,并且集成了多个服务且拥有大量数据源,那么您最好选择Eric Evans的域驱动设计(DDD)。当然,福勒的企业模式书也很好。
另请参阅DataMapper(2,第一个类似于ActiveRecord)。对于这种类型的系统,它有更好的设计方法,并且(在概念层面上)比Rails中的ActiveRecord具有更少的限制。
确实说,这是因为Ruby人员的动态特性长期处理ActiveRecord的概念问题并试图满足企业需求,恕我直言。
答案 2 :(得分:0)
有些人已经在服务层和回调上完成了一些工作Pat Maddox(特别是回调)就是其中之一,Jay Fields(他早期的关于rails presenter模式的工作后来被替换为像模式的服务层)是另一个。我必须承认我喜欢添加额外图层的想法。对我来说,业务逻辑不属于模型,模型应该在复杂项目中解耦。我也喜欢在回调上增加一层的想法,因为随着数字的增加,回调变得太复杂了
这远不是完全爆炸的DDD,目前我不知道DDD如何在Rails中运行,但是,我相信它可以,我相信有人正在那里工作。对于我的项目,目前实施起来有点过分,但我会考虑添加一个服务层。