2

メソッド名で開示する必要のある情報の量に関係する公式のC++の推奨事項はありますか?私はインターネットでたくさんの参考文献を見つけることができるので尋ねていますが、これを本当に説明するものはありません。

私は、というメソッドを使用してC ++クラスに取り組んでcalculateIBANAndBICAndSaveRecordChainIfChangedいます。これは、メソッドの機能をかなりよく説明しています。短い名前は覚えやすく、入力するためにインテリセンスやコピーアンドペーストは必要ありません。あまり説明的ではありませんが、機能は文書化されているはずです。

4

6 に答える 6

12

calculateIBANAndBICAndSaveRecordChainIfChanged悪い関数名と見なされ、1 つの関数で 1 つのことを行うという規則に違反します。

複雑さを軽減

ルーチンを作成する唯一の最も重要な理由は、プログラムの複雑さを軽減することです。考える必要がないように、情報を非表示にするルーチンを作成します。確かに、ルーチンを作成するときにそれについて考える必要があります。しかし、それが書かれた後は、詳細を忘れて、内部の仕組みを知らなくてもルーチンを使用できるようになるはずです。ルーチンを作成するその他の理由 (コード サイズの最小化、保守性の向上、正確性の向上) も十分な理由ですが、ルーチンの抽象化の力がなければ、複雑なプログラムを知的に管理することは不可能です。この関数を以下の関数に単純に分割できます。

CalculateIBAN
CalculateBIC
SaveRecordChain
IsRecordChainChanged

プロシージャに名前を付けるには、強力な動詞の後に目的語を使用します

機能的凝集度を持つプロシージャは、通常、オブジェクトに対して操作を実行します。名前はプロシージャの動作を反映する必要があり、オブジェクトに対する操作は動詞とオブジェクトの名前を意味します。PrintDocument()、CalcMonthlyRevenues()、CheckOrderInfo()、および RepaginateDocument() は、適切なプロシージャ名のサンプルです。

ルーチンが行うすべてのことを説明する

ルーチンの名前で、すべての出力と副作用を説明します。ルーチンがレポートの合計を計算し、出力ファイルを開く場合、ComputeReportTotals() はルーチンの適切な名前ではありません。ComputeReportTotalsAndOpen-OutputFile() は適切な名前ですが、長すぎてばかげています。副作用のあるルーチンがある場合、長くてばかげた名前がたくさんあります。治療法は、あまり説明的でないルーチン名を使用しないことです。治療法は、副作用を伴うのではなく直接的に物事が起こるようにプログラムすることです。

意味のない動詞、あいまいな動詞、気まぐれな動詞は避ける

いくつかの動詞は弾力性があり、ほぼすべての意味をカバーするために引き伸ばされます。HandleCalculation()、PerformServices()、OutputUser()、ProcessInput()、DealWithOutput() などのルーチン名では、ルーチンが何をするかわかりません。せいぜい、これらの名前は、ルーチンが計算、サービス、ユーザー、入力、および出力と関係があることを示しています。例外は、イベントを処理するという特定の技術的な意味で動詞「ハンドル」が使用された場合です。

上記のポイントのほとんどは、Code complete IIから参照されています。他の良い本はClean Codeロバート C. マーティンThe Clean Coderからです。

于 2013-01-10T11:29:55.427 に答える
4

直接的な質問に答えるために、私は関数名が覚えやすいものである必要はないと思います。そうであればいいのですが、あなたが言うように、このことは文書化されるべきです。私はそれを調べることができます。

calculateIBANAndBICAndSaveRecordChainIfChanged私の好みには長すぎます。それらを使用するためにc/pまたはオートコンプリートをしなければならないという不便さは別として、長い関数名に対する私の恐れは、それらを適切に読んでいないことです。別。

そのため、短い名前を探すことをお勧めします。これらの操作 (2 つのことを計算し、条件付きでレコード チェーンを保存する) がグループ化されているのには、何らかの理由があるはずです。その理由は質問には記載されていません。仕様またはプロジェクトの履歴のどこかにあります。その理由を特定し、より簡潔な関数名を探す必要があります。

関数に名前を付けるときは、関数が将来変更される理由[*]を考慮することもできます。同時に計算される 2 つのもの (IBANA と BIC) があるのはなぜですか? それらの間の関係は何ですか?両方を一度に実行してから保存する理由を特定できますか?

例: これらはこのオブジェクトの「頭字語」です。頭字語を一度にすべて再計算するのが一般的です。再計算した場合、当然、変更を保存する必要があります。次に、関数を呼び出しますrefreshAcronyms。将来的には 3 番目の頭字語が登場するかもしれません。

別の例として、呼び出し元が本当に必要としているのは、変更された場合にオブジェクトを保存することです。保存されたデータの整合性を維持するために、保存する前に常にIBANA と BIC を再計算する必要があるという追加の雑用です。その場合、残りはすべて保存に必要な前兆なので、関数を呼び出すことができますsaveRecordChain。パブリック インターフェイスのユーザーは、save 関数が必要な処理を実行することを知っておく必要があります。serializeToFile()余分なことをせずに変更された場合に保存するプライベートインターフェイスに関数があるかもしれません。

[*] 私は「理由」を複数形で言いますが、Robert C Martin は「単一責任の原則」を、適切に設計された機能を変更する理由は 1 つだけであると定義しています。

于 2013-01-10T12:06:09.977 に答える
2

これは個人的な好みの問題ですが、calculateIBANAndBICAndSaveRecordChainIfChanged長すぎるため、読みにくく、コーディングが難しいと思います (オートコンプリート可能なスマート エディターを使用している場合を除きます)。

さらに2つのポイント:

  1. 他のポスターが示唆しているように、関数はより小さな部分に分解する必要があります。
  2. ヘッダーにコメントを付けて関数の詳細を説明することを禁じる法律はないので、その機能のすべての側面を名前に組み込む必要はありません。
于 2013-01-10T11:51:45.390 に答える
2

理想的には、1 つのメソッドは 1 つのことだけを行うべきです。そして、メソッド名はそれが何をするかを反映する必要があります(その1つのこと)、そうすればあなたのプログラムだけが読めるようになります。

于 2013-01-10T11:29:55.420 に答える
1

キャリアの過程であまりにも多くの方法を読み書きし、その名前を覚えていません。ほとんどのプログラマは、言語の標準ライブラリから関数の名前を検索する必要があります。自分またはチームが開発した関数の名前は言うまでもありません! 最も覚えやすい関数名は、コードを保守していて初めて呼び出しを目にする人にとっては役に立ちません。さらに、6 か月後には覚えていない可能性も高くなります。

そのため、覚えやすさを気にせずに、最初にわかりやすい名前を使用することをお勧めします。結局のところ、IntelliSense を備えた IDE がすぐになくなることはありません (そして、メモリの制限に対処するために導入されたのには正当な理由があります)。

于 2013-01-10T11:37:16.020 に答える
0

個人的なやり取りには十分で便利ですが、アプリを完成させた後は、すべての関数名を正確に意図したとおりにリファクタリングする必要があります。また、グループや会社で作業している場合は、関数名がその機能を反映していることを確認してください。

そして、あなたの例の関数名では、次のように名前を付けることができます:saveRecordWithRespctToIBANandBIC()

于 2013-01-10T11:34:07.010 に答える