ruby 我可以使用什么设计模式来操作控制器参数?

k7fdbhmy  于 2023-08-04  发布在  Ruby
关注(0)|答案(1)|浏览(94)

我试图找到最干净的方式来编码一系列的操纵控制器参数
我的应用程序有一个用例,其中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

字符串

4smxwvx5

4smxwvx51#

“太复杂了,不能在这一点上完全分裂出来”应该是一个大红旗。“太复杂”意味着代码很脆弱,难以维护和测试。我的建议是确保你有极好的测试覆盖率,然后重构代码。
将单个控制器与单个模型相关联是最常见的Rails模式。但这不是必需的,通过将控制器与工作流相关联可以实现极大的简化(可维护性/可测试性)。例如,你可以使用AdminUsersController、ManagerUsersController、PublicUsersController等来代替UsersController,它们都有自己的#update方法,比UsersController简单得多。它们甚至可能继承自一个公共的超类或具有共享的mixin。但他们都在处理同一个模型。正如您所建议的,将复杂性转移到服务对象中并不会降低复杂性,它只是移动了复杂性!
我们无法深入了解您的应用程序,以确定这是否合适,但我建议您找到一种方法,从应用程序中消除“太复杂,无法在此时拆分”的想法。用阳光明媚的日子和蓝天来代替对处理复杂代码的恐惧!

相关问题