【问题标题】:Does this Rails 3 Controller method make me look fat?这个 Rails 3 Controller 方法会让我看起来很胖吗?
【发布时间】:2010-10-26 14:42:16
【问题描述】:

这是一个新应用程序,我在 Search 控制器上有一个 index 方法。这也是应用程序的主页,我正在尝试从设计模式的角度确定我是否走错了路。

该方法已经有 35 行长。以下是该方法的作用:

3 行设置变量以确定正在搜索的分层数据的“级别”。

另外 10 行用于根据请求中是否包含子域来填充一些视图变量。

一个 10 行的部分,根据以下条件重定向到两个页面之一:

1) 如果用户没有访问权限,并且已登录,但尚未请求访问权限,请告诉他们“单击此处请求访问此品牌的访问权限”。

2) 如果用户没有访问权限、已登录并且已经请求访问权限,请告诉他们“某某正在审查您的请求”。

另外 10 行来构建动态 arel。

我无法直截了当地弄清楚如何将这些问题分开,或者即使它们应该分开。感谢您提供的任何帮助!

【问题讨论】:

    标签: ruby-on-rails design-patterns refactoring ruby-on-rails-3 separation-of-concerns


    【解决方案1】:

    用类似代码的方式总结你所说的(对不起,不知道 ruby​​;认为它是伪代码):

    void index() {
      establishHierarchyLevel();
      if (requestIncludedSubdomain())
        fillSubdomainFields();
      else
        fillNonsubdomainFields();
      if (user.isSignedIn() && !user.hasAccess()) {
        if (user.hasRequestedAccess())
          letUserIn();
        else
          adviseUserOfRequestUnderReview();
      }
      buildDynamicArelWhateverThatIs();
    }
    

    14 行而不是 35 行(当然,提取的方法的主体会延长整个代码,但您可以看看它并知道它在做什么)。值得做吗?这实际上取决于您或后续程序员是否更清楚。我的猜测是值得这样做,将小代码块拆分为自己的方法将使代码更易于维护。

    【讨论】:

    • 谢谢卡尔,我现在正在提取那些东西。
    【解决方案2】:

    设置了很多变量。也许这是某种模块的好机会?也许您的模块可以为您做出很多这样的决定,以及充当很多这些变量的包装器。抱歉,我没有更具体的答案。

    【讨论】:

      【解决方案3】:

      如果没有您的代码,很难提出实际的修复建议,但这听起来确实是一种真正错误的方法,而且您让事情变得比实际需要的困难得多:

      3 行设置变量 确定层次结构的“级别” 正在搜索数据

      如果有一个搜索表单,我想你会希望将那些直接从 params 散列传递到范围或 Model.where() 调用中。根据需要在您的模型上设置范围。

      另外 10 行用于根据请求中是否包含子域来填充一些视图变量。

      在我看来,它最多应该是 1 行。或者在您看来,您应该使用 if 语句来更改您希望输出的内容,具体取决于您的子域。

      一个 10 行的部分,根据以下条件重定向到两个页面之一:

      您对这两个视图的解释唯一不同的是“用户是否请求访问”,这肯定只是一个布尔变量吗?您只需要 1 个视图。将差异包装成 2 个部分,然后在您的视图中并编写一个 if 语句以在它们之间进行选择。

      另外 10 行来构建动态 arel。

      可能有必要进入 Arel,但我非常怀疑。在大多数情况下,您的实际搜索调用可以(并且应该是)1 行,通过标准的 ActiveRecord 查询接口完成。你想在你的模型中设置强大的范围,通过 ActiveRecord 查询接口来处理加入其他模型/缩小条件等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-17
        • 1970-01-01
        • 1970-01-01
        • 2016-07-09
        • 1970-01-01
        • 2013-08-05
        相关资源
        最近更新 更多