2017-01-14 2 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_spiralsome_shellに言っているように思え、 "あなたはそのスパイラルを解くようにしてほしい"とunwrapped_spiralsome_shell、 "あなたに私に螺旋状の螺旋を与えて欲しい"。

私はPOODRで読む:

送信者が望んでいると動作するようにどのように受信機を通知するメッセージが微妙に見えるかもしれませんが、結果が重大であるかを尋ねるメッセージを区別します。

unwrapped_spiralを選択すると良いと思われます。

それは意味がありますか?

答えて

3

名前を付けることは、古典的な2つ(うち3つ)の難しいことの1つです。 ジョークを除いて、私は次のように案内されています:

  1. 私はオブジェクトのプロパティについて質問していますか?私のメソッド名は、そのプロパティを表す名詞です。
  2. オブジェクトを別のフォームに変換していますか?私のメソッド名は "to_target"です。あなたの場合、それはto_unwrappedかもしれません。
  3. オブジェクトに内部処理を依頼していますか?それから私のメソッド名は動詞です。たとえば、スパイラルを登るために「登る」。
  4. 完全性のために;オブジェクトを別のものから構築していますか?その後、私のファクトリメソッドは通常 "from_source"から呼び出されます。仮にあなたの場合、「from_unwrapped」。
2

Rubyは、名前の意図とその意味に異例の重点を置いているようです。たとえば、unwrap_spiralは、unwrap_spiral!のようなコンパントメソッドがない限り、インプレースで操作を実行する可能性があることを示しています。

unwrapped_spiralが濃すぎることがあります。 unwrappedで十分である理由は、spiralがこれに非常に影響する理由は明らかではありません。

もう1つの考慮すべき点は、同じアルファベット順のspiralで動作するメソッドを編成することです:spiral_unwrapまたはspiral_unwrapped

1

マイ傾きがそれよりむしろShellunwrap方法を有している(ちょうどArrayのサブクラスであってもよい)Spiralクラスを持つように、Array螺旋を有するであろう(これは、この場合の希望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] 

あなたは、この場合には上の操作したい概念ではなく、シェルそのものよりも、Shellに属しSpiral、であるので、これは理にかなっている理由。これにより、スパイラル自体を操作する追加のメソッドを持つことができます。 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#unwrapArray#flatten ISNを定義できSpiralクラスを定義します'flattenedと呼ばれる)
  • 使用Shell(Spiral)#unwrap

シェル#スパイラル

Shellはちょうどその@spiral以上である場合は、可能性:

  • Spiral#unwrap
  • 使用Shell#spiral#unwrapを定義
  • とにかくSpiralクラスを定義します。 shell.spiral.unwrap
2

私は実際に同じ結果をもたらすようなflattenというメソッドが既に存在すると思います。

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

あなたは、より高度なカスタムメソッドを持っている場合は、私も私の哲学になると思いunspiral

+0

このメソッドは、最初のように見えますが、 'flatten'ではありません。 –

+0

+1の非スパイラルについては、私のコメントを参照してください[クリスHealdの](http://stackoverflow.com/a/41655195/2909897) '#flatten'混乱についての答え – mbigras

関連する問題