命名Ruby方法

时间:2017-01-14 21:16:18

标签: ruby oop

给出一个课程:

class Shell
  attr_reader :spiral
  def initialize spiral
    @spiral = spiral
  end

  def ?????
    # do stuff...
  end
end

some_shell = Shell.new([[1,2],[4,3])
some_shell.spiral #=> [[1,2],
                  #    [4,3]]
some_shell.?????  #=> [1,2,3,4]

命名?????

更有意义吗?
unwrap_spiral

unwrapped_spiral

似乎unwrap_spiralsome_shell说,"我希望你解开那个螺旋"并unwrapped_spiralsome_shell说,"我希望你给我一个未打开的螺旋"。

我读了POODR

  

要求发送者想要什么的消息与告诉接收者如何表现的消息之间的区别可能看起来很微妙,但后果是显着的。

选择unwrapped_spiral似乎更好。

这有意义吗?

5 个答案:

答案 0 :(得分:3)

命名事物是经典的两个(三个)难事之一。 除了笑话,我的指导如下:

  1. 我在询问物体的属性吗?然后我的方法名称是代表该属性的名词。
  2. 我是否将对象转换为另一种形式?然后我的方法名称是“to_target”。在你的情况下,它可能是to_unwrapped。
  3. 我是否要求对象在内部进行一些处理?然后我的方法名称是一个动词。例如,“爬”爬上螺旋。
  4. 为了完整;我是在建造另一个物体吗?然后我的工厂方法通常从“from_source”调用。假设在你的情况下,“from_unwrapped。”

答案 1 :(得分:2)

Ruby似乎特别强调名称的意图及其含义。例如,unwrap_spiral意味着它可以就地执行操作,除非有unwrap_spiral!这样的公用方法明确表示它没有。

unwrapped_spiral可能过于冗长。当spiral可能就足够时,为什么unwrapped会对此产生影响并不清楚。

要考虑的另一件事是组织在spiral下以相同的字母顺序运作的方法:spiral_unwrapspiral_unwrapped

答案 2 :(得分:2)

我实际上认为已经有一个名为flatten的方法似乎会产生相同的结果。

http://apidock.com/ruby/Array/flatten

如果您有更高级的自定义方法,我会使用unspiral

答案 3 :(得分:1)

我的倾向是,而不是Array有一个Spiral螺旋,而不是Array类(可能只是unwrap的一个子类) Array#flatten方法(在这种情况下只是class Spiral < Array def unwrap flatten end end class Shell attr_reader :spiral def initialize(spiral) # Or if your convention would allow, accept `spiral` as an Array # and assign @spiral = Spiral.new(spiral) @spiral = spiral end end > shell = Shell.new Spiral.new([[1,2],[4,3]]) => #<Shell:0x000000018286f0 @spiral=[[1, 2], [4, 3]]> > shell.spiral => [[1, 2], [4, 3]] > shell.spiral.unwrap => [1, 2, 4, 3] 的别名)。

Spiral

这是有道理的原因,因为在这种情况下您要操作的概念是Shell,它属于$(window).resize();,而不是shell本身。这使您可以使用其他方法对螺旋本身进行操作。随着Spiral的实现变得越来越复杂,Shell不一定会变得更复杂 - 它可以简单地在Spiral的公共接口上公开和操作。

答案 4 :(得分:1)

Shell&lt;螺旋

在您的示例中,Shell仅适用于@spiral,因此您可以:

  • 定义Spiral
  • Shell继承自Spiral
  • 定义Spiral#unwrapArray#flatten不称为flattened
  • 使用Shell(Spiral)#unwrap

贝壳#螺旋

如果Shell不仅仅是@spiral,您可以:

  • 无论如何定义Spiral课程
  • 定义Spiral#unwrap
  • 使用Shell#spiral#unwrapshell.spiral.unwrap