2017-01-14 58 views
2

给出一个类:命名Ruby方法

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_spiral是说给some_shell, “我想让你解开那个螺旋”,并且unwrapped_spiralsome_shell,“我希望你给我一个解开螺旋”。

POODR阅读:

询问发件人想要的消息,并告诉接收机如何做人看似细微,但其后果是显著的消息之间的区别。

看起来好像选择unwrapped_spiral会更好。

这有道理吗?

回答

3

命名事物是经典的两个(三分之一)难以做的事情之一。我指导如下:

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

Ruby似乎不寻常地强调名称的意图及其含义。例如,unwrap_spiral意味着它可能会在原地进行操作,除非有像unwrap_spiral!这样的公开方法使其清楚地表明它没有。

unwrapped_spiral可能是一个过于冗长的阴影。目前尚不清楚为什么spiral因素如此之多,unwrapped就足够了。

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

1

我的倾斜将是而非Shell具有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,而不是外壳本身。这可以让你开始使用其他方法来操作螺旋本身。随着Spiral的实施变得越来越复杂,Shell不一定会变得更复杂 - 它可能只是暴露并在Spiral的公共界面上运行。

+0

那去会是我的哲学也是如此。请注意,'unwrap'不仅仅是'flatten'。 –

+0

感谢您的回复。澄清'some_shell。''有意“解开”而不是“扁平化”。那是我想要的:'[1,2,3,4]'不''[1,2,4,3]' – mbigras

+0

啊。然后,我只是让'#unwrap' - >'flatten.sort' :) –

1

壳牌<螺旋

在你的榜样,Shell只活了@spiral,因此您可能:

  • 定义Spiral
  • Shell继承Spiral
  • 定义Spiral#unwrapArray#flatten ISN叫做flattened
  • 使用Shell(Spiral)#unwrap

壳牌#螺旋

如果Shell岂止其@spiral,你可以:

  • 定义Spiral类反正
  • 定义Spiral#unwrap
  • 使用Shell#spiral#unwrapshell.spiral.unwrap
2

我实际上认为已经有一种叫做flatten的方法,它似乎导致了相同的结果。

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

如果你有一个更高级的自定义的方法,我会unspiral

+0

该方法不是'flatten',尽管它起初看起来像。 –

+0

+1 unspiral,请查看我对[Chris Heald's]的评论(http://stackoverflow.com/a/41655195/2909897)关于'#flatten'混淆的回答 – mbigras