Ruby on rails 在Ruby/Rails中使用长方法名是一种糟糕的做法吗?

Ruby on rails 在Ruby/Rails中使用长方法名是一种糟糕的做法吗?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在Ruby中有以下服务类: class EnableUserMatriculations def initialize(user) @user = user end def call! matriculations_that_current_user_is_matriculated_and_confirmed.each do |matriculation| matriculation.enable! end end private

我在Ruby中有以下服务类:

class EnableUserMatriculations

  def initialize(user)
    @user = user
  end

  def call!
    matriculations_that_current_user_is_matriculated_and_confirmed.each do |matriculation|
      matriculation.enable!
    end
  end


  private

  def matriculations_that_current_user_is_matriculated_and_confirmed
    # some logic to search user.matriculations that must be enabled
  end
end
我想知道长名称的方法是否是一种糟糕的做法

我不喜欢使用评论


请给我一些意见。

是的,这是一种不好的做法。有描述它们所做工作的名称是很好的,但是当它们变得太长时,代码就很难阅读。在这种情况下,您已经在
用户入学考试
的范围内,因此您可以轻松地从方法中删除前两个单词,即
当前用户已入学考试和确认。前导的两个词对这个名字没有多大影响。我试着去想那些与他们所处的环境相关的名字。如果名称太长,它还可能告诉我一些关于上下文复杂性的有用信息


(我还要说,这些建议适用于大多数(如果不是所有的话)编程语言,而不仅仅是Rails。)

您应该重命名此方法,但不仅仅是因为长度。您正在将逻辑与方法名称本身联系起来,例如,查找已被录取和确认的录取。如果随着时间的推移,您需要处理另一个案例,例如未经处理的预科或类似情况,该怎么办?或者你只需要处理刚刚确认的入学申请?现在您需要更改逻辑和重命名方法,而不仅仅是更改一个方法内部的逻辑,这很容易出现错误。你不想打电话
包含由于方法名称本身包含的逻辑而应启用的入学考试逻辑

在本例中,我将您的长方法名称更改为

def matriculations_ready_to_enable
  user.matriculations.matriculated.confirmed
end
然后将这些scope方法添加到您的入学模型中。您可能希望对user和
user.preciculations.preciculated.confirfied
有一个单独的方法,但这清楚地说明了需要什么样的预科,并将这些信息仅包含在代码的一部分中


关于长度本身,Ruby通常倾向于较短的方法名而不是较长的方法名,但也倾向于使用完整的单词而不是缩写,例如
def destroy\u入学考试
vs
def dstry\u入学考试

“我不喜欢使用注释。”为什么?如果有一种不好的做法,那就是不喜欢使用注释。类名也不经常包含动词。我尝试遵循以下方法:(无注释)=>(带动词的服务名)=>欢迎使用堆栈溢出。请读“。征求意见的问题是离题的。我认为,
当前用户\u是\u入学的\u和\u确认的
意味着一个布尔结果,而不是返回一组入学证书。@chrissmanderson我也是这样解释的,这意味着一个逻辑测试。要返回一个范围,需要仔细阅读内部内容。感谢您的回复。在我的例子中,决定什么入学必须启用的逻辑取决于另一个模型信息,如发票、付款。。。因此,我将此逻辑保留在特定的ServiceClass上。这是错误的吗?不,在这个特定的服务类中保留逻辑是完全正确的。我建议在一个方法中保留逻辑,而不是方法名称本身。我还想知道“ready to enable”是否是多余的,因为“ready”可能就足够了,或者考虑到这个方法的简单性,如果有必要的话。我同意这一点,即使只是
ready\u入学
或只是
ready
,如果这种方法永远不会在服务之外使用。