2013-04-12 8 views
6

Fooが返され、Barが返されます」という非常に一般的なパターンがあります。たとえば、user_idの場合は、Userを返します。「fooからbarへの変換」の関数名規則

これらの種類の関数には従来の命名パターンがありますか? Joel on Softwareの後、私は個人的に多くのbar_from_foo()を使用しましたが、他の人がこれを行うことはめったになく、すぐに冗長になります。

widgets = user_widgets_from_user(user_from_param_map(params)) 

そこに一般的な言語のいずれかで名前、または名前空間(例えばUser.from_map())に、従来の方法はありますか?私は特にPythonに興味がありますが、あなたが考えることができる言語はどれでも有益でしょう。

+3

私はUser.from_user_id(user_id)が好きです – Patashu

答えて

3

私はそれがコンテキストに多くを依存し、有意義なメタファーを選択すると思う:重要なのは、これは通常クラス方法ではなく、(サブクラスの利益のために)静的メソッドとして定義されています。例えば、ActiveRecordは、データベース内のレコードを見つけるためのクラスメソッド "find"を使用します。これは、 "user_idを入力してユーザを出力する"より意味のある考えです。たとえば、次のように変換するために

User.find(user_id) 
User.find_by_email(user_email) 

は、私は通常、高階関数では使用することを容易にするために変換方法を書くのが好き。ルビーの例では、変換は、多くの場合、あなたが書くことができるので、それは、すべてのFOOSためto_bar方法を有することは理にかなってBarFooを変換する例えばto_*インスタンスメソッド、で行われています。

foo = Foo.new(...) # make a new Foo 
bar = foo.to_bar  # convert it to a Bar 

そして、 FOOSの束を変換するために、あなたは可能性があり、単純に:

bars = foos.map(&:to_bar) 

Rubyは、オブジェクトに文字列を変換するためのFoo.parse(str)を持っている傾向があります。JavaScriptが


、私は例えば、(私は標準ミリリットルからもらった)クラスメソッドを持つよう:

Foo.toBar = function(foo) { 
    return new Bar(...); 
}; 

そして、あなたは(この例では、アンダースコアを使用して)だけでなく、その上にマッピングすることができます:

var bars = _.map(foos, Foo.toBar); 

標準ML規則は、構造体(クラス)メソッドです。例FNタイプ:

Foo.toBar : foo -> bar 
Foo.fromBar : bar -> foo 

そして、あなたはそれを使用したいが好き:

val bar = Foo.toBar foo; 
val bars = map Foo.toBar foos; 
5

たとえば、文字列を整数に変換する場合、メソッドは受信側で定義されるため、そのクラスはクリアなので、受信側クラスをメソッド名:String#to_iString#string_to_iではありません。これは、オブジェクト指向プログラミング(多型)のコアアイデアの1つです。

受信機はuser_idは単なる文字列で、Userに変換するString上のメソッドを定義することは右見ていない場合、あなたは上のコンストラクタメソッドを定義する必要があります例えば、このような方法を割り当てることが一般的すぎる場合戻り値が期待されるクラス:User.newまたはUser.from_id

15

私はClojureの命名の柔軟性を活用し、それを呼び出します。私には

(defn foo->bar [] ...) 

は非常に明確な意図を作ること、それはかなり短いです。

+4

OPによる目的はFooで与えられているので、Barを返すと、それを呼び出すとさらに明確になります'foo-> bar' –

+0

Tks。答えを編集しました。 – leonardoborges

+1

Clojureでは、私はオープンディスパッチ(マルチメソッドまたはプロトコル)を活用し、それを単に「バー」と名付けました。私はまた、それを二度呼び出すことがハマっていないように、それを等冪にしようとします。これは 'seq'がどのように動作するかです。 – cgrand

5

Pythonやその他のさまざまなOO言語では、Barのコンストラクタであり、単一のFooを唯一の引数として取ります。 Pythonはメソッドオーバーロードを行いません(そして、それをエミュレートしようとする試みは通常は壊れやすい)ので、Bar.__init__が既に別の署名を取っていれば、そのコンベンションはまさに最後のものです。

class Bar: 
     @classmethod 
     def from_foo(cls, f): 
      '''Create a new Bar from the given Foo''' 
      ret = cls() 
      # ... 
1

パラメータの型関数の名前を入れるのはなぜ?私は実装が存在する場合x.toBar()を呼び出すために試みることができるか、それがグローバルをチェックすることができ、Pythonで例えば...それは、あなたは多くの言語で、動的ディスパッチや過負荷に依存することができます

a_bar = bar_from(a_foo) 

のような明確なものになるだろうと思いますBar_builders[type(x)](x)のようなレジストリ; Lispではメソッドに頼ることができます。 C++でオーバーロードが発生しました...

+0

+1;これは物事がRでどのように働くか –

関連する問題