10

Foo私は非常に一般的な「与えられた a 、返す a 」のパターンを持っています。Barたとえば、与えられた a user_id、返す a User

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

widgets = user_widgets_from_user(user_from_param_map(params))

名前を付ける従来の方法、または名前空間 (例: User.from_map()) が普及している言語のいずれかにありますか? 私は特に Python に興味がありますが、あなたが思いつくどんな言語も役に立つでしょう。

4

5 に答える 5

15

Clojure の命名の柔軟性を利用して、次のように呼びます。

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

私にとって、それは意図を非常に明確にし、かなり短いです。

于 2013-04-12T03:45:16.923 に答える
6

Python やその他のさまざまな OO 言語では、これは単一の Foo を唯一の引数として取る Bar のコンストラクターである必要があります。Python はメソッドのオーバーロードを行わない (そして、それをエミュレートしようとする試みは通常壊れやすい) ため、Bar.__init__既に別の署名を使用している場合、その規則はまさに最後のものです。重要なことに、これは通常、静的メソッドではなくクラスメソッドとして定義されます (サブクラスの利点のため)。

 class Bar:
      @classmethod
      def from_foo(cls, f):
          '''Create a new Bar from the given Foo'''
          ret = cls()
          # ...
于 2013-04-12T03:49:15.583 に答える
5

String#to_i何かを別のものに変換したい場合、例えば文字列を整数に変換したい場合、メソッドはレシーバー上で定義される必要があるため、そのクラスは明確であるため、メソッド名の一部としてレシーバー クラスを入れるべきではありません:ありませんString#string_to_i。これは、オブジェクト指向プログラミング (ポリモーフィズム) の中心的な考え方の 1 つです。

レシーバーが一般的すぎてそのようなメソッドを割り当てることができない場合 (たとえば、user_idが単なる文字列であり、Stringそれを に変換するメソッドを定義するのUserが正しくないように見える場合)、戻り値を期待するクラスにコンストラクター メソッドを定義する必要があります。値:User.newまたはUser.from_id.

于 2013-04-12T03:43:39.957 に答える
4

それは文脈と意味のある比喩の選択に大きく依存すると思います。たとえば、ActiveRecord はデータベース内のレコードを検索するためにクラス メソッド "find" を使用します。これは、"user_id を入力し、ユーザーを出力する" よりも意味のあるアイデアです。例えば:

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

変換については、通常、高階関数で使いやすいように変換メソッドを作成するのが好きです。たとえば ruby​​ では、変換はto_*インスタンス メソッドで行わFooれるBarことがよくありto_barます。

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

そして、一連の foo を変換するには、次のようにします。

bars = foos.map(&:to_bar)

Foo.parse(str)文字列をオブジェクトに変換する機能も Ruby にはありがちです。


JavaScript の場合、クラス メソッド (標準 ml から取得) を使用するのが好きです。たとえば、次のようになります。

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;
于 2013-04-12T08:04:15.233 に答える