PHPのコードの命名規則で少し困っています。
案や経験のお知恵を貸していただけると嬉しいです。
質問
複数の引数がある場合のメソッド名の命名で困っています。
質問詳細
例えば、DBからプライマリーキーでデータを取得する処理があった場合、
function getById(int $id)
のように定義できるかと思います。
では、与える引数が多い場合はどの様に命名するのがスマートなのでしょうか?
(メソッド名が長くなる)
function getByAaaTypeIdBbbTypeIdCccTypeId(int $aaaTypeId, int $bbbTypeId, int $cccTypeId)
は流石にごちゃごちゃしすぎます……
こういうのは引数を分けずに連想配列などで渡すのでしょうか?
その場合、どの様に命名すればいいのでしょうか…?
一人で開発する分には自分がわかればいいのですが、人と開発する場合なので結構悩んでおります。
お力を貸していただけると嬉しいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答9件
0
引数を基準に命名する必要があるのでしょうか。
それでは20個引数があったとして、それを全部使用しデータ検索する場合は20個を繋げたメソッド名になりませんか?
引数を使うというより、「どういうデータ」を取得したいのかで命名してみてはいかがでしょうか。
もし引数を必ず命名で使わなければいけないという規約があるのでしたら、配列などにまとめた物を渡すしかないかと思います。
投稿2018/11/09 05:40
総合スコア2341
0
関数名はあくまでも機能を示しますから、引数が増えようが何しようが命名は「機能が分かるように」するべきでしょう。
挙げられたのでいえば、
PHP
1function getById(in $id) 2function getByThreeTypes(int $aaa, int $bbb, int $ccc)
にでもしますかね。
ただし、上の例がどちらも「あるテーブルのプライマリーキーを指定して取得する」のであれば、
PHP
1function getByPk(int $id) 2function getByPk(int $aaa, int $bbb, int $ccc)
にします。明確に Primary Key でアクセスしているとわかったほうがいいからです。
投稿2018/11/09 05:40
総合スコア13703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/09 07:24
0
ベストアンサー
UNIX哲学を参考にしましょう。
これがUNIXの哲学である。
一つのことを行い、またそれをうまくやるプログラムを書け。
協調して動くプログラムを書け。
標準入出力(テキスト・ストリーム)を扱うプログラムを書け。標準入出力は普遍的インターフェースなのだ。
まぁ、質問はPHPの話なので「標準入力」云々は無視して良いのですが、
その手前の「一つのことを行い、またそれをうまくやるプログラムを書け」は非常に重要な考え方です。
機能はしょぼくてシンプルであればあるほどよいのです。
1個の引数だけ引き受けるメソッドを沢山用意しましょう。
与える引数が多い場合はどの様に命名するのがスマートなのでしょうか?
これは単純に連想配列案件でしょう。
適当にSQL文字列作る風な実装で書くとこんな感じになると思います。
PHP
1function getByOptions (options = []) { 2 $where = ''; 3 foreach ($options as $key => $val) { 4 if ($where === '') { 5 $where = 'WHERE '; 6 } else { 7 $where = $where . ' AND '; 8 } 9 $where = $where . $key . ' = ' . $val; 10 } 11} 12getByOptions([ 13 'aaa' => 123, 14 'bbb' => 234, 15 'ccc' => 345, 16]);
引数がゴテゴテ何個もあるのは完全に設計ミスです。
連想配列で受けられないようなケースは一時的にオブジェクトのプロパティに持たせて、
違う条件も欲しければ別途newして作り直すとか…
オブジェクト志向的な設計を工夫して対応しましょう。
投稿2018/11/09 05:42
総合スコア21203
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/09 06:13
2018/11/09 06:21
2018/11/09 07:45
2018/11/13 03:17
0
可変的な引数なら配列で渡すことが多いですが、
固定的で抜けを許さないならむしろご提示の羅列してるタイプが好ましいと思います。
もちろん配列で渡しても結局参照するときに意味がわかる命名が好ましいのですから
なにでやっても結果は同じだと思います
投稿2018/11/09 05:33
総合スコア116810
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こういうのは引数を分けずに連想配列などで渡すのでしょうか?
引数の渡し方についてはメンテのしやすさや可読性を考慮して決めればよいかと。
yamabejp 様が仰るように、臨機応変に適宜使い分けるのがよいと思われます。
その場合、どの様に命名すればいいのでしょうか…?
getById
は「IDをキーにして(何か)を取得する」と言うような意味合いでしょうか。
私なら「そのメソッドがどういった役割、機能を持つか」が明示的にわかるようにしますかね。
何かを作成するメソッドならmake○○
、何かを削除するメソッドならdelete○○
みたいな感じですね。
後々自分や他の人が見た場合に、何をやっているかがイメージしやすいような形にするのがよいかと。
投稿2018/11/09 05:36
編集2018/11/09 05:41総合スコア994
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/09 05:46
2018/11/09 06:00 編集
0
同じでよくないですか?
それかidというのが気持ち悪いならpkey
PhpDocの様式でコメントでparamとreturnの補足をつければ良いかと。
モデルであればどのデータのgetIdかはクラス名辿ればかりますし。
固定の引数がたくさんあるのは拡張性に欠けるので配列でドンと渡して
設定でpkeyのリストを持っておいて必須チェックかけるようにすれば良いと思います。
今後構成が変わってキーが増減する場合のことを考えて命名すべきと思います。
メソッド名を変えて(呼びもともメソッドにも)引数も増やすのか
呼びもとの引数を増やしてコメント追記するだけにするのか
影響範囲次第だと思います。
IDEを使っていてきちんとPhpDoc書いてればコメントは開発時に確認できるので
長すぎるメソッド名は開発を進めてメンテナンスまで考えた場合、
リスク高いと思います
投稿2018/11/09 05:35
編集2018/11/09 05:46総合スコア80875
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/09 05:42
2018/11/09 05:45
2018/11/09 05:56
2018/11/09 06:08
0
辞書を共有できるネーミングツール
ってのがありますけど、、。
codic
概要がわかるblog
投稿2018/11/09 06:39
総合スコア798
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー出たあとで申し訳ないですが、答えとしてはケースバイケースで、絶対コレが正しいというのはないと思います。
なので、どんな書き方があるのかを知っておいて、その状況に適切だと思うのを選ぶのが良いと思います。
php
1function getByAaaTypeIdBbbTypeIdCccTypeId(int $aaaTypeId, int $bbbTypeId, int $cccTypeId)
php
1function getRecords($aaaTypeId, $bbbTypeId = null, $cccTypeId = null)
php
1function getWithOptions($options = [])
php
1getById($id)->filterWithTypeA($typeA)->filterWithTypeB($typeB)
で、個人的に思うのは、連想配列で渡すのは、本当に必要かどうか考えて、できれば最後の選択肢にして欲しいです。
後で修正する必要が出たときに大変だからです。
柔軟性がある反面、引数になんでもアリなわけだから、動いてみなくちゃわからないってことになりがちだし、影響度も膨らみがちだからです。
だから、3個ぐらいの引数だったら、そのまま引数の名前で関数名にするか、他の意味で命名するのが良いと思います。
だって、他の言語だったら、迷わずオーバーロードで書くでしょう?
投稿2018/11/13 01:13
総合スコア56
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/09 05:58
2018/11/09 06:03