ライブラリを作成するとき、クラスを設計するとき、または既存のAPIを拡張するとき、名詞エンティティを含むアクションまたは関係を表現する必要があることがよくあります。
(ここでは、プログラミングの暗示をあまり行わずに具体例を使用しようとしています。)
時々、名詞のみが適切に命名され、次に_coats[client]
_(これはインデックスまたはハッシュを使用したルックアップである可能性があります)などのコードを記述します。他の場合では、実際の名前付き関数またはメソッドを作成しています。そして今、私たちはジレンマに直面しています-私たちはどの名前に合いますか?
_cloackroom.obtain_coat(some_client); /* vs */ cloackroom.obtain_coat_for(some_client);
red_ball.place(the_blue_bin); /* vs */ red_ball.place_in(the_blue_bin);
_
関数を作成している場合、これらは次のようになります。
_obtain_coat(some_client); /* vs */ obtain_coat_for(some_client);
place(discarded_ball, the_blue_bin); /* vs */ place_in(discarded_ball, the_blue_bin);
_
私はこれらの2つの命名オプションの間で引き裂かれています。
_in
_、__for
_など)私のジレンマは、明確さ/表現の正確さ、美学、簡潔さの組み合わせです。しかし、ここで明らかな簡潔さを除けば、「より良い」ものを決定することすらできません。メソッドまたは関数の名前だけを見ると、接尾辞のようなものに私は不愉快です。しかし、obtain_coat(some_client)
を読むことも、見た目がすっきりしています(名前が他動詞である関数refund(some_client)
とは対照的に)。一方、関数はアクションなので、動詞だけを使用して名前を付け、オブジェクトに関連する前置詞を他の構文要素に残しておくのは理にかなっています。一部の言語では、名前付き引数を使用してこれをサポートしています。
_ball.place(target_receptacle <- the_blue_bin)
obtain_coat(requisitor <- some_client)
_
しかし、それが利用できないと仮定しましょう。
私の質問:いくつかのAPIを設計(または名前を付ける)するときにこのジレンマに直面した場合、前置詞の使用について、または前置詞の使用に対する重要な考慮事項は何でしたか?
注:言語固有または言語カテゴリ固有の答えがある場合は、それで問題ありません。私が言ったように、言語機能はこの選択に影響を与えるようです。
前置詞は確かに非常に表現力豊かです。また、表現力により、あいまいさや誤解が原因であるエラーが減少しました。
ただし、この表現力は単一の引数を持つメソッドにのみ付与されます。より多くのパラメーターがある場合、プレフィックスの利点はあまり明白ではありません。
次に、実際的な側面があります。ネイティブスピーカーではないプログラマは、それが_in
_on
または_of
または_for
または_to
。または、プレフィックスなしで関数にパラメーターを追加することもできます。または、パラメータの順序をリファクタリングします。そして、オプション/デフォルトパラメータはどうですか?接頭辞アプローチは、このような状況では、単純なアプローチよりもはるかに多くの疑問、ためらい、変更を生み出します。
おそらくこれが、多くのプロジェクトと命名規則が、プレフィックスのない、より中立的で表現力のない形式を採用する理由です。
しかし、あなたの懸念は完全に有効です。この理由で名前付きパラメーターを使用するプログラミング言語はたくさんあります。 Swiftの例は、たとえば次のようになります。
cloackroom.obtainCoat(for:someClient);
red_ball.place(in:theBlueBin,with:leftHand,mode:swiftly);
もちろん、名前付きパラメーターのある言語で使用する接頭辞の命名規則を持つAPIがある場合、これは非常に奇妙に見える可能性があります;-)メソッド名で接頭辞が終了しないようにする理由?
意味のある前置詞を使うためのものです。コードを読みやすくするのに役立ちます。また、最新のIDEでは、先行入力機能により、あいまいさは問題になりません。
closet.obtain_coat_for(client)
はcloset.obtain_coat_from(client)
とは異なるセマンティクスを持っています。言語に関する懸念は、次の場合にのみ該当します。
私はいつも自然言語のようなプログラミングスタイルを好んだ。
ドイツ語を母国語とする私にとって、前置詞と動詞を組み合わせた単語は1つだけであるのが普通です。例として LEA-Dictionary:to put inside = hineinlegen を参照してください。だから私はバージョンred_ball.place_in(the_blue_bin);
またはドイツ語roterBall.legeIn(kasten)
を好むでしょう。
他の国ではこれは異なる場合があり、読者を混乱させる可能性があります。ですから、あなたの質問に対する答えは、文化や言語に依存すると思います。