Javaメソッド名が長すぎるのはいつですか?[閉まっている]


173

ここ数週間、メソッドまたはクラスに非常に長い名前(50文字)を使用している人を見たことがありますが、これは通常、読みやすさを向上させることを前提としています。このような長い名前は、このような長い名前が必要な場合は、メソッドクラスで多くまたは多くのことを試みますが、皆さんはそれについてどう思いますか。

例は次のとおりです。

getNumberOfSkinCareEligibleItemsWithinTransaction

19
はい、それは「コードのにおい」です... c2.com/cgi/wiki?LongMethodSmell
Dan Rosenstark

23
長さが666文字を超える場合、問題があることがわかります。
Thomas Eding、2010

8
@yarの例では、「Longメソッド」の反対は「Shortメソッド」であり、これは良いことだと考えられています。したがって、それは明らかにメソッド名を参照していません。コードの行(または類似の何か)を指します。たとえば、f()は非常に短い関数ですが、それは確かに良い習慣ではありません...そして、あなたはプログラミングの数学者にそれを教える必要があります:)
sfussenegger

3
@sfussenegger、それは本当です。しかし、私はメソッド名の長さとメソッド長の間の相関に賭けています。f()素晴らしい機能ではないかもしれませんが、その$()人はJavascriptメソッドの世界のロックスターのようなものです。
Dan Rosenstark、

7
@yar、指定したリンクは、メソッド名の長さではなく、メソッドの長さを行単位で参照しました。
–ThorbjørnRavn Andersen、2010

回答:


398

メソッドの動作を同等に伝える短い名前が存在する場合、Javaまたはその他の言語の名前は長すぎます。


65
数学的にエレガント。
リケット

304
したがって、たとえば、boolean doesShorterNameExistThatEquallyConvaysTheBehaviorOfTheMethod(String s)にリファクタリングする必要がありますboolean isTooLong(String s)
z5h

6
行動を伝えたいだけでなく、プロジェクトや言語の慣習も守りたいので、私はまったく同意しません。つまり、Pythonでは言うかもしれませんeligible_items_cntが、Javaでは通常言うでしょうgetEligibleItemsCount
flybywire

17
@flybywire:過度に長い名前を書くような慣習は、疑わしい利点があります。
MAK、2010

20
@MAK @ S.LottかについてのgetLength()length()?「get」または「set」と入力した後、オートコンプリートを確認するのが大好きです。この場合は、簡潔さよりも密集を優先します。
sfussenegger、2010

202

メソッド名の長さを減らすためのいくつかのテクニック:

  1. プログラム全体、クラス、またはモジュールが「スキンケアアイテム」に関するものである場合は、スキンケアを削除できます。たとえば、クラスがと呼ばれるSkinCareUtils場合、getNumberOfEligibleItemsWithinTransaction

  2. あなたは変更することができ以内getNumberOfEligibleItemsInTransaction

  3. TransactionをTxに変更すると、に移動できますgetNumberOfEligibleItemsInTx

  4. または、メソッドがタイプのパラメータを受け入れる場合はTransaction、InTxを完全に削除できます。getNumberOfEligibleItems

  5. カウントによってnumberOfを変更します。 getEligibleItemsCount

今ではそれは非常に合理的です。そしてそれは60%短くなります。


11
さらに、5)が配置されますgetEligibleItems()と、getEligibleItemsCount()アルファベット順のリスト(たとえば、自動補完やJavadocの)中で隣同士に
sfussenegger

4
そして、通常そうであるように、短い名前は俳句の規則に適合します。
2010

2
@mercator countEligibleItemsに対してgetEligibleItemsのような標準規則を使用すると、ステートメントが曖昧になる可能性が低くなります。メソッドが何をすることになっているかについてあいまいさが少ないほど、読みやすさが向上します。メソッドをさらに詳しく調べないと、「カウント」するメソッドは、長期的に「取得」するメソッドが達成するものよりも明確ではありません。
ビル

53
私は次のように略称嫌いTxCntgrph、のように...(ところで、Tx「送信」または「トランスミッター」の略です)
Meinersbur

14
ええ、私はあなたが「Tx」を使用することを決定するまであなたに同意しました。
Ponkadoodle、

183

変更のためだけに、主観的でない答え:65536文字。

A.java:1:文字列 "xxxxxxxxxxxxxxxxxxxx ..."のUTF8表現は、定数プールには長すぎます

;-)


4
そうそう、JVMがそれを処理できないときは長すぎる:)
Anurag

35
以下のための+1 リテラルの答え。
2010

37
技術的には、Java言語仕様には識別子の長さの上限がありません。これは、JVM実装の制限です。乾杯!
uckelman、2010

13
Sunのコンパイラは明らかに仕様に準拠していません。java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.8の発言:「識別子は無制限の長さのシーケンス...」
Michael Myers

6
エラーメッセージが指摘するように、JVM仕様に上限があります。utf8の定数プール表現は、ここで指定された2 ^ 16バイトに制限されています。クラス名とメソッド名は、utf8として定数プールに格納する必要があります。
thejoshwolfe

42

私は皆に同意します:メソッド名は長すぎてはいけません。ただし、例外を1つ追加したいと思います。

ただし、JUnitテストメソッドの名前は長くなる可能性があり、文章に似ている必要があります。

どうして?

  • 他のコードでは呼び出されないためです。
  • テスト名として使用されるためです。
  • なぜなら、それらは要件を説明する文章として書くことができるからです。(たとえば、AgileDoxを使用)

例:

    @Test
    public void testDialogClosesDownWhenTheRedButtonIsPressedTwice() {
        ...
    }

このアイデアの詳細については、「ビヘイビア駆動設計」を参照してください。


5
+1私はそれに同意し、それは私がやっていることでもありますが、JUnit 4のメソッドを最初testから使用する必要はありませんが、これはのshouldような使用の可能性も開きますdialogShouldCloseWhenTheRedButtonIsPressedTwice()。または、テストクラスDialogShouldを呼び出してcloseWhenTheRedButtonIsPressedTwice()からメソッドを呼び出し、一緒に読み取ることができますDialogShould.closeWhenTheRedButtonIsPressedTwice()
stivlo

私も同意しますが、長すぎる文テストが多すぎることを示唆している可能性があることもお勧めします。
Brian Agnew 2017

17

コンテキスト「... WithinTransaction」は明白である必要があります。それがオブジェクト指向のすべてです。

メソッドはクラスの一部です。クラスが「トランザクション」を意味しない場合-そして、それが常に「WithinTransaction」と言う必要をなくすことができない場合は、問題があります。


2
ある種のトランザクションパラメータも取ることができる
willcodejavaforfood

3
上記の最高得点の回答からわかるように、オブジェクト指向のアドバイスではなくアウトバックのシンプルさを追求してください。+1
ダンローゼンスターク

@yar人々は決して間違っている。
CurtainDog 2010

12

私は名前に俳句ルールを使用する傾向があります:

 Seven syllable class names 
 five for variables
 seven for method and other names

これらは最大名の経験則です。読みやすさを向上させる場合にのみ、私はこれに違反します。recalculateMortgageInterest(currentRate、quoteSet ...)のようなものは、recalculateMortgageInterestRateまたはrecalculateMortgageInterestRateFromSetよりも優れています。レートと引用符のセットが含まれているという事実は、javadocや.NETの同等の埋め込みドキュメントからかなり明確であるためです。

注:5-7-5ではなく7-5-7であるため、実際の俳句ではありません。しかし、私はそれを俳句と呼ぶのを好む。


13
クラスの変数は7つ、変数は5つ未満、残りの変数は7つ
James

8
「最大5つの変数」(5つ未満は正確ではありません)
Jason S

名前が小さいと、コードが読みにくくなる可能性があります。
Deniss M. 2017

10

おそらくIDEには優れたオートコンプリート機能が備わっているため、Javaには長い名前を奨励する文化があります。

このサイトによると、JREで最も長いクラス名InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedStateは92文字です。

最も長いメソッド名supportsDataDefinitionAndDataManipulationTransactionsは52文字です。


20
そのクラスは、Department of Redundancy Departmentで物事に名前を付けるために、Department of Redundancy Deparmentによって雇われたネーミング人々によって命名されたようです。
Michael Madsen

1
@MichaelMadsen:それは本当に冗長ですか、それとも別のフレーム内にネストされたフレームを説明していますか?
エンドリス2012

PEP-8はそのクラス名の単語を求めています。
Mateen Ulhaq 2017

9

ちっぽけな単語で十分な場合は、長い単語を使用しないでください。

「メソッド名の長さがメソッドの長さに比例する」というあなたの論文は、本当に水を持っているとは思いません。

「getNumberOfSkinCareEligibleItemsWithinTransaction」の例を見てみましょう。これは、1つのことだけを行うように思えます。特定のカテゴリに分類されるトランザクション内のアイテムの数をカウントします。もちろん、メソッドの実際のコードを確認せずに判断することはできませんが、それは私には良い方法のように思えます。

一方、「processSale」や今まで人気の高い「doStuff」のように、多くの作業に役立つ非常に短くて簡潔な名前を持つ多くのメソッドを見てきました。

メソッド名の長さに関して厳格な規則を与えるのは難しいと思いますが、目標は、関数が何を実行するかを伝えるのに十分長く、読みやすいように十分に短くすることです。この例では、おそらく「getSkinCareCount」で十分だったと思います。問題は、何を区別する必要があるかです。スキンケア対象アイテムをトランザクションでカウントする関数と、スキンケア対象アイテムを別のアイテムでカウントする関数がある場合、「withinTransactions」は価値を追加します。しかし、トランザクションの外でそのようなアイテムについて話すことが何の意味もないのであれば、そのような余分な情報で名前を混乱させる意味はありません。

2つ目は、管理しやすい長さの名前から、関数が何を行うかを、非常に些細な場合を除いて正確に説明できると考えるのは、非常に非現実的だと思います。現実的な目標は、読者に手掛かりを与え、後で思い出せる名前を付けることです。たとえば、ワープ速度に到達するために消費する必要がある反物質を計算するコードを見つけようとしている場合、関数名を見て「calibrateTransporter」、「firePhasers」、および「calcAntimatterBurn」を見ると、かなり明らかです。最初の2つはそうではありませんが、3つ目はそうかもしれません。確認し、それが本当に探しているものであることがわかった場合、明日この問題に取り組むために戻ってきたときに、それを思い出すのは簡単です。それで十分です。

類似した3つの長い名前は、短い名前よりも混乱します。「calcSalesmanPay」と「calcGeekPay」という2つの関数がある場合、どれがどれであるかが一目でわかります。しかし、それらが「calculateMonthlyCheckAmountForSalesmanForExportToAccountingSystemAndReconciliation」および「calculateMonthlyCheckAmountForProgrammersForExportToAccountingSystemAndReconciliation」と呼ばれている場合、どちらがどれかを確認するために名前を調べる必要があります。名前の追加情報は、おそらくそのような場合には逆効果です。0.5秒の思考を30秒の思考に変えます。


苦しんでいるこの悪い答えのための+1。
Dan Rosenstark、2010

7

インターフェイスを希望どおりに設計し、実装を一致させます。

たとえば、多分私はそれを次のように書くでしょう

getTransaction().getItems(SKIN_CARE).getEligible().size()

またはJava 8ストリーム:

getTransaction().getItems().stream()
    .filter(item -> item.getType() == SKIN_CARE)
    .filter(item -> item.isEligible())
    .count();

6

私のルールは次のとおりです。名前が長すぎて、それ自体の行に表示する必要がある場合は、長すぎます。(実際には、これは20文字を超えることはめったにないということです。)

これは、コードの目に見える垂直線の数がコーディング速度/有効性と明確に相関していることを示す調査に基づいています。クラス/メソッド名が著しくそれを傷つけ始める場合、それらは長すぎます。

メソッド/クラスが宣言されている場所にコメントを追加し、その目的について長い説明が必要な場合はIDEがその場所に移動できるようにします。


私はこのようなルールが好きです。あなた/あなたのチームがそれらをランダムに作成したことを覚えている限り、それはすべて良いことです。一方、「リサーチ表示」には実際にそのリサーチへのリンク、またはそれに関する何かが必要なので、私はこれに賛成することはできません...
Dan Rosenstark

5

メソッド自体の長さは、それが多すぎるかどうかのより良い指標である可能性が高く、それでもおおまかなアイデアしか得られません。簡潔さを追求する必要がありますが、説明が重要です。短い名前で同じ意味を伝えることができない場合、名前自体はおそらく大丈夫です。


3

次回、メソッド名を書くときは、次の引用を考えてください。

"The man who is going to maintain your code is a phyco who knows where you stay"

13
彼が海苔でサイコではないのは良いことです
StingyJack

2

そのメソッド名は明らかに長すぎます。そのようなサイズのメソッド名を読んでいると、私の心はさまよう傾向があります。これは、スペースなしで文章を読むようなものです。

個人的には、メソッド内の単語はできるだけ少なくすることを好みます。パッケージとクラス名が意味を伝えることができるなら、あなたは助けられます。クラスの責任が非常に簡潔である場合、巨大なメソッド名は必要ありません。そこに "WithinTransaction"がある理由に興味があります。

「getNumberOfSkinCareEligibleItemsWithinTransaction」は次のようになります。

com.mycompany.app.product.SkinCareQuery.getNumEligibleItems();

使用中の場合、メソッドは「query.getNumEligibleItems()」のようになります。


2

変数名が長すぎると、短い名前でプログラム全体またはプログラムの重要な部分のコードが読みやすくなります。

長い名前を使用すると、値に関するより多くの情報を伝えることができます。ただし、名前が長すぎると、コードが煩雑になり、残りのコードを理解する能力が低下します。これは通常、行を折り返し、他のコード行をページから押し出すことによって発生します。

秘訣は、どちらがより読みやすくなるかを決定することです。変数が頻繁に、または短いスペースで数回使用される場合は、短い名前を付けて、コメントを明確にすることをお勧めします。読者はコメントを簡単に参照できます。変数がプログラム全体で頻繁に使用される場合、多くの場合パラメーターとして、または他の複雑な操作で使用される場合、名前を削減するか、または頭字語を読者へのリマインダーとして使用するのが最善です。意味を忘れた場合、変数宣言によってコメントを参照できます。

これは、コードリーダーが理解しようとしている可能性が高いことを考慮し、コードが時間とともにどのように変化して成長するかを考慮する必要があるため、簡単にトレードオフすることはできません。だからこそ、物事に名前を付けるのは難しい。

DescriptiveLoopCounterNameの代わりにiをループカウンターとして使用することが許容される理由は、読みやすさです。これは変数の最も一般的な使用法であるため、画面スペースを最小限にして、その存在理由を説明できます。長い名前は、ループ条件をテストしたり、配列にインデックスを付けたりする方法を理解するのを難しくして、時間を浪費するだけです。

逆に、マルチパラメーター関数呼び出しに渡されるなど、複雑な操作のように関数または変数がほとんど使用されない場合は、過度に説明的な名前を付けることができます。


1

他の言語と同じように:関数が実行する単一のアクションを説明しなくなった場合。


1

私は良い答えの組み合わせを使用し、合理的だと思います。

メソッドが何をするかを完全に、明確に、そして読みやすく説明します。

メソッド名が長すぎると思われる場合は、メソッドのリファクタリングを減らしてください。


1

メソッドの名前が別の行に折り返され、メソッドへの呼び出しがその行で唯一のものであり、マージンのかなり近くで始まる場合は、長すぎます。使用する人の画面の平均サイズを考慮する必要があります。

だが!名前が長すぎると思われる場合は、おそらく長すぎます。それを回避する方法は、コンテキスト内にあり、名前は短いが他のコンテキストでは重複するようにコードを記述することです。これは、誰かのフルネームの代わりに「彼女」または「彼」を英語で言うことができるようなものです。


1

何が何であるかを言葉で説明しすぎると長すぎます。

たとえば、これらの名前は機能的に同等です。

Java: java.sql.SQLIntegrityConstraintViolationException

Python / Djangoの場合: django.db.IntegrityError

SQL / dbパッケージで、いくつのタイプの整合性エラーを思い付くことができるか自問してみてください。;)したがってdb.IntegrityError、十分です。


あなたはいつも逆のことを主張することができます。それが何であるかについて冗長に説明するとき、それがメソッドが何をするか明らかに明らかである場合、それは混乱を引き起こし、メソッドの誤った使用を引き起こすかもしれません。
Jonas Geiregat 14年

0

Javaコンパイラーが処理できる長さを超えるID名は長すぎます。


3
何?!私がこれに反対票を投じた理由がわかりません。質問は必要な条件を求めたのではなく、十分な条件を求めました!
uckelman、2010

0

ここには2つの方法または観点があります。1つは、メソッドが何をしているかを説明するために可能な限り説明的な名前である限り、メソッド名の長さは実際には問題ではないということです(Javaベストプラクティスの基本ルール)。一方、flybywireの投稿には同意します。インテリジェンスを使用して、メソッド名をできるだけ減らすようにする必要がありますが、説明は減らしません。説明性はより重要です:)


0

名前が長すぎる場合:

  • 読むのに1秒以上かかる
  • JVMに割り当てるよりも多くのRAMを使用します
  • 不条理な名前が付けられています
  • 短い名前が完全に理にかなっている場合
  • IDEで循環する場合

正直なところ、この名前は、目的をパブリックAPIメソッドとして利用する開発者に伝えるか、離れるときにコードを維持する必要があるだけです。ただKISSを覚えておいてください(単純な愚かさを保ちます)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.