2009-06-11 19 views
19

したがって、関数を簡潔な名前で記述することはよくありません。再利用のために作られた関数では通常問題ではありませんが、しばしば大きなプロセスをサブ関数に分割する必要があります。多くの場合、これらは奇妙な名前(connectionsToAccessLinesまたはhandleWallVisionSplitなど)を取得します。これらの関数は1つのことしかしませんが、本当に大きなアルゴリズムの一部に過ぎないので、それらの関数には良い名前が付いてくるのは非常に難しいです。関数の名前がうまくいかない場合

この状況ではどうしますか?非常にイライラしています。

+5

これはウィキです。 – gnovice

答えて

17

は、時にはそれが機能は素晴らしいを持っていないことを示します代わりに、このような一つの機能の、鮮明なフォーカスとリファクタリングする必要があります。それがクラスメソッドであれば、おそらくクラスもリファクタリングを必要とします。

しかし、それはあなたのコードをはるかに理解して使いやすくするので、可能な限り最高の名前を見つけることが大変です。

更新:多くのソフトウェアエンジニアリング担当者が、命名の重要性について話しました。 Henry F. LedgardのProgramming Proverbs(1975年)とBrian KernighanとP.J. PlaugherのElements of Programming Style(1978年)は、初期のものであり、まだ読む価値があります。 Steve McConnellのすばらしいCode Complete(2005年版、第2版)は、最近の例です。

プログラミングスタイルの要素は、Strunk and WhiteのElements of Styleで部分的にパターン化されましたが、これは実際には驚くほど関連性があります。私たちのテクニカルライティングとコメント(および命名)には、散文を明確かつ簡潔にすることに重点が置かれていますが、コードをリファクタリングして改善する際には、常にこれを見ています。

+1

はい。強く同意する。 – PeterAllenWebb

+0

効率のために機能を分割することができないことがあります。たとえば、あるセットを反復して別のセットの値を探し、見つかった場合は両方を削除しますが、最初にMoveSetUnionToNewSetという3番目のコンテナに戻します。この機能を分割するためにアルゴリズムの複雑さが大幅に増加します。 – rlbond

+0

非常に真実であり、StrunkとWhiteは意味に必要な単語を削除することを示唆していませんでした。 "MoveSetUnionToNewSet"は私の本では長すぎるとは限りませんが、おそらく "Set ExtractSetUnion(Set a、Set b)"となるでしょう。 –

13

私は、関数の実装を見る必要性を減らすので、より大きいアルゴリズムのコンテキストで、むしろメソッド名を長くしたいと思います。

ReadPropertiesFromFileThenWriteToSessionのような名前がReadPropsよりも優れています。

+8

はい、長めの名前は、Doaction(int id)のような曖昧な名前を短くする方が望ましいです。 しかし、いずれも船外には行かないでください。 1つの単語や短いフレーズで何が記述されているのかわからない場合は、より多くのメソッドに分割してください:) –

+1

私は、あるメソッドが最終的により多くのメソッドを呼び出すようにしたいときに問題があると言います。 Method1はDoXAndYIfZ(いくつかの変数/状態チェックをカプセル化します)を呼び出します。これはXとYを別々に呼び出します。 このような場合、上位レベルのメソッドで分岐ロジックを使用したくない場合は、単に「メソッドを追加する」ことはできません。だからあなたの名前は長くなります。 –

+2

...一般的に私はあなたに「短い名前を思いついているときには長い名前をつける」という警告にのみ同意します! :) –

0

あなたの機能は、実際に彼らが何をしているかを述べるべきです!しかし、過度に冗長な方法ではありません。これは時間が経つと習得するものですが、機能を正しく実行するには少しの練習が必要です。

thisを読んで、私がこの種のことについて書いたものを見てください。other articleに連絡して、それを書いてコメントをチェックしてください。

0

リファクタリングの本の1つの提案は、長いアルゴリズムを見て、コード内にブロックがあると感じるあらゆる場所で、このブロックを1行のコメントリファクタで記述してプライベート関数にして、関数の名前としての単一の行。 それは本当に長いかもしれませんが、あなたがアルゴリズムを素早く読むのに役立つなら、それは完全にうまくいきます。コードの完成には、9〜15文字の間の良い範囲が含まれています。

そして、それは名前をリファクタリングプライベートヘルパー関数である場合、私は、関数またはプロシージャの名前を指定しようとしているレンガの壁にぶつかるたびに、後に、私は戻って何の問題

2

を行っていないと何について非常に難しいと思います心配しないでください私はそうだと思う。しばしば名前がそれ自体を示唆しにくい場合、関数やプロシージャが本当にやるべきことを私が考えていないことを示唆しています。

あなたはA、B、C、...、X、Y、Zを処理する必要があります。手続きdoABCDEFGHIJKLMNOPQRSTUVWXYZの名前を付けることはできません。プロセスを分割する論理的な中レベルのグループ化(おそらくグループ化のいくつかのレイヤー)を見つけなければなりません。

時には正しい名前を見つけるには、コードをもっと論理的な塊になるように移動する必要があります。

(名前はコンテナのコンテキスト内で解釈できるので)名前が短くなるように関数/プロシージャを(使用している言語の機能に応じて)カプセル化してください。たとえば、 "openFile"プロシージャは、通常は読み込み用にファイルをオープンするだけです。 "UserPrefsFile"クラスのコンテキストでは、より具体的な意味を持つかもしれません。

9

Phil Karlton氏は、コンピュータサイエンスには2つの困難な問題があります。名前を付けることとキャッシュを無効にすることだけです。私の経験は、そこに多くの真理があると私に信じさせる。

名前を付けることは、科学と同じくらい芸術であり、そのように固くて速い規則はありません。つまり、私は時々Ottinger's rules for Variable and Class Namingを読んでいます。これには留意すべき優れたヒューリスティックがあります。私のお気に入りの1つは、 - person.getName()やbitTorrentClient.findPeersFromTracker()のような名詞句を使用することです。これらの両方の場合、コード行の目的は英語のフレーズに似ています。

+0

+1 - オッティンガーのリンクは良いです。 –

+0

「get name」と「trackerからピアを見つける」は動詞フレーズです:) –

+0

http://agileinaflash.blogspot.com/2009/02/meaningful-names.htmlは私の命名規則の短い形式です。長い形式は、クリーンコードの第2章です。 –

6

名前を変更するだけで、関数名の長さを減らすことができます。代わりに:

あなたが使用することができ
void RetrievePropertiesFromRemoteStore() 

void RetrieveRemoteProperties() 

の代わりに:

bool CheckToSeeIfUserIsAuthorized() 

用途:

bool IsUserAuthorized() 

それを軽減する別の方法は何再考することです関数は行います。あなたが持っている可能性が

void GetUserProfileAndSetUpSession() 

:あなたは良い関数名を思い付くことができない場合

void GetUserProfile() 
void SetupSession() 
+5

の[link](http://www.maultech.com/chrislott/resources/cstyle/ottinger-naming.html)があります。クラス内のメソッドであれば、user.IsAuthorized ()またはservice.IsAuthorized(user)がさらに優れています。 – plinth

1

Heh。質問のタイトルを読んで、プログラミングの行為は「機能のための良い名前を思いつくのに困っている」と表現することができたと私は思いました。あなたは、あなたのコード内であまりにも多くの名前を避けるために番号付けと接尾辞「_ *」を使用することができ

-3

void DoX() 
void DoX_Decode1()   <-- this name shows that this function is only used by DoX() 
void DoX_Decode2() 
void DoX_Decode3() 
void DoX_Find1() 
void DoX_Find2() 
void DoX_Find3() 

をすることもできますプレフィックスを持つグループ同様の機能:

void tcpip_ShowConnectDialog() 
void tcpip_AcceptConnections() 
void logging_WriteToFile() 
void logging_UpdateLogWindow() 

あなたが得るこの方法で独自の関数名(検索と検索と置換に役立ちます)を使用しても、それらを比較的短く保ちます。また、クラスを分離してコードファイルを分割するという手間を省くこともできます。単にプレフィックスを短くしておくと、簡単に無視して過去のものを見ることができます。

+1

DoX_Decode2は私には絶対に何も意味しません。そして、多分あなたはOO言語を使用していませんが、DoX.find()とDoX.Decode()はより良いIMOです。あなたがクラスを分けることについて話していたので、私はそれを言う。だから私はそれはOOだと思う。最後に、リファクタリングを避けるべきではありません。 "IDEを抽出するのは面倒です"。IDE(Cough * Cough * eclipse Cough *)を使って、名前を変更して抽出する方法は本当に楽しいことです。 :) – user35978

+0

ええ、私はそのように古くなっています。すべての小さなもののための別のクラスとファイルを持つことは嫌いです。私にとって、あなたが見ているのは高水準の抽象化であり、すべてが「存在」し、その存在のために「戦う」(これまでに類推された類推のために申し訳ありません)というときに、コードを短くする(リファクタリングで)ことは事実上不可能です。 また、階層やツリーよりもリストのほうが信頼できます。たとえば、2次元の表を持つ複数のExcel文書(階層ツリー構造を持つ1つのxml文書)を使用することになります。だから私はOOのクラス階層が嫌いです。 – AareP

1

分かりやすい名前が不足している場合は、アルファベットの文字を使用してください。あなたがそれらを使い果たしたら、辞書からランダムな単語を選んでください。この方法では、あなたはコードを理解する唯一の人なので、決してあなたを解雇することはできません。

+0

ハ!アルファベットの文字がほとんどない場所のいくつかの言語の例については、http://stackoverflow.com/questions/961942/what-is-the-worst-programming-language-youever-worked-を参照してください。 BASIC私はかつて整数のためにAとB1のような名前だけを許可し、文字列には$ Dと$ R2を許可しました。恐ろしいです。 –

0

オブジェクト指向のアプローチを使用すると、この問題を軽減するのに役立ちます.. connectionsToAccessLines - > connexion.connect(System.getAccessLines());

handleWallVisionSplit - >これ、私はそれが何であるかは分かりません:D しかし、私は次のように言っています:wall.handleVision(Wall.split);または何でも、私はあなたが私が意味するものを理解すると思います。

また、あまりにも特定の機能に名前を付けるのが難しい場合は、コードの高水準が十分でないことが原因です。例: readSecondWordOfLine(a_line) - > line.split()[1]です。

ソート(sortWithSecondWordOfLine())はソート(行=>分割(行)[1])になる可能性があります。たとえば、C++では、新しいメソッドを作成するのではなく、バインドとstlのコンポジットを使用して1つのライナー式を作成できます。

技術的にも技術的な方法があると、要するに、機能が抽象化されていて名前を見つけるのが簡単になるため、通常は本当に短いです抽象名で一般化され、最初の関数で直接使用されます。

関連する問題