メソッドと関数の名前

あらゆる種類のシステムを調べてみると、多くの人が命名方法に問題があることがわかりました。 これは私に記事を書くよう促しました。



奇妙なコード



記事を書くきっかけは何ですか?



str_replace PHP関数の引数の順序を見つけるために1000回目にマニュアルを調べた後、問題が非常に関連していることが明らかになりました。 結局のところ、str_replace関数の名前は、それが何をするかだけを示していますが、引数については何も言っていません。 これは何でいっぱいですか? さて、組み込みライブラリの引数の数と順序は覚えていますが、独自の設計では、引数を覚えるのはそれほど簡単ではありません。 はい、教えてくれる開発環境はありますが、関数にカーソルを合わせると機能しないため、このようなコードを読むのは困難です。 しかし、コードがコメントなしで読みやすく理解しやすいことが重要です。 これは品質コードのサインです。



多数のエラーの例として、PHPを提供します。 私はすぐにいくつかの間違いに名前を付けることができます:



1.一部の関数の名前は、暗黙的に目的を伝えます。 たとえば、 basename



2.関数の名前は、1つの原則に従ってコンパイルされません。 たとえば、文字列関数はstr_で始まりますが、すべてではありません(例: strstrstrpos )。 ファイルに関する同じ問題: filesize vs file_exists



3.引数の非自明性と関数内での順序。 たとえば、 str_replace関数の検索文字列は最後に来て、最初のstrpos関数には( str_replace($ search、$ replace、 $ subject [、$&count]) vs strpos( $ haystack、$ needle [、$ offset]) ) たとえば、目的の行が常に最初の位置を占めている場合は、より便利です。

はい、これはCの遺産です(だけでなく)。問題ではありません。問題は問題です。



うん



したがって、次のようにメソッド/関数の名前を考え出す必要があります。



1.関数/メソッドの名前は、その目的を明確に伝えていました。



2.関数/メソッドの名前は、1つの原則/標準に従って構成されています。



3.関数/メソッドの引数の順序とリストは、1つの原則に従ってコンパイルされ、名前と組み合わされました。



4.メソッドはメソッドのままです。



4番目の点について説明します。 多くの場合、フォームobject.Pi()の行に出くわします:このようなメソッドはオブジェクトに関連していません。 むしろ関数(または定数)です。



例など



1.文字列に部分文字列が必要です。 最も明らかなオプションは、string.replace(from、to)です。 PHPで実行できないのは残念です。



2.引数と意味のヒント:groups.getByName(name)。 これ以上。 コンテキストはグループのおかげで明確であるため、getGroupByNameを記述する必要はありません。 他のメソッドはまったく同じです: groups.remove(group)またはgroup.delete() 。 うん! そして興味深い点があります:)コレクションから削除すると、 コレクションは.remove(element)になります。 要素がそれ自体を削除する場合、 .delete()要素。 そして、これは重要です。私たちのコードは英語に関して有効でなければなりません。



3.関数/メソッド名の反意語。 はい、命名するときは常に正しい反意語を使用する必要があります。 コレクション内のアイテムの追加と削除:追加/削除。 オブジェクトの作成と削除:作成/削除。 プロセスの開始と終了:開始/終了、開始/終了(ただし、開始/終了および開始/終了は一切行わない)。



4.ブール戻り値。 はい、はい、はい。コードを読みやすくするために、これをヒントにする必要があります。 メソッド名の先頭にあるhas、is、was、haveなどの単語は、このメソッドがブール値を返すことを示唆しています。 例: object.hasData() 。 リマインダーをお送りいただきありがとうございます。



5.メソッドの引数の順序にヒントを与えます: cars.getByMonthAndYear(month、year)



6.名前の形成。 メソッド名は一種の文であり、必ず述語( input.focus() )で構成されますが、追加( element.appendChild() )、定義( window.slowlyShow() )、およびそれらの組み合わせ( todo.getNewTask() )を含むことができます。 しかし、規則はしばしば違反されます。 たとえば、user.next()。 うん...同様の状況がありましたか? この問題は、プロパティのないプログラミング言語に固有のものです。 はい、そのような名前を我慢する必要があります。 良いか悪いかはあなた次第です。



合計



この記事がお役に立てば幸いです。 もっと知りたいですか? 次に、書店に行って、Steve McConnellの本、The Perfect Codeを購入します。



All Articles