我试图找到最干净的方式来编码一系列的操纵控制器参数
我的应用程序有一个用例,其中2个正在运行的实验使用相同的控制器来更新模型。它太复杂了,在这一点上完全分裂出来,所以我只是操纵控制器参数。
因此,参数需要通过N个函数来更新不同的属性,然后返回它们。我正在尝试用最简洁的方式来做这件事,因为我还在学习设计模式。我正在寻找一些关于我的方法的输入,以及可能更好的模式来解决这个问题
class UsersController < ApplicationController
def update
manipulated_params = ParamsManipulationService.call(params)
user = User.update(manipulated_params)
end
end
class ParamsManipulationService
attr_reader :params
def initialize(params:)
@params = params
end
def call
manipulate_params
end
private
def manipulate_params
manipulate_func_one(params).
then { |params| manipulate_func_two(params) }.
then { |params| manipulate_func_three(params)}
end
def manipulate_func_one(params)
# return some manipulated params
end
def manipulate_func_two(params)
# return some manipulated params
end
def manipulate_func_three(params)
# return some manipulated params
end
end
class ApplicationService
def self.call(*args, **kwargs, &block)
new(*args, **kwargs, &block).call
end
end
字符串
1条答案
按热度按时间4smxwvx51#
“太复杂了,不能在这一点上完全分裂出来”应该是一个大红旗。“太复杂”意味着代码很脆弱,难以维护和测试。我的建议是确保你有极好的测试覆盖率,然后重构代码。
将单个控制器与单个模型相关联是最常见的Rails模式。但这不是必需的,通过将控制器与工作流相关联可以实现极大的简化(可维护性/可测试性)。例如,你可以使用AdminUsersController、ManagerUsersController、PublicUsersController等来代替UsersController,它们都有自己的#update方法,比UsersController简单得多。它们甚至可能继承自一个公共的超类或具有共享的mixin。但他们都在处理同一个模型。正如您所建议的,将复杂性转移到服务对象中并不会降低复杂性,它只是移动了复杂性!
我们无法深入了解您的应用程序,以确定这是否合适,但我建议您找到一种方法,从应用程序中消除“太复杂,无法在此时拆分”的想法。用阳光明媚的日子和蓝天来代替对处理复杂代码的恐惧!