10

例外をスローするメソッド(同様のシグネチャを持つ)とそうでないメソッドを区別するために、「Ex」のようなサフィックスを追加したいと思います。

そのような慣習はありますか?

4

11 に答える 11

21

はい、そうでないメソッドと同じ名前を付けます。

例外仕様は十分ではありませんか?

編集:スローする/スローしない同様のメソッドがある場合は、Parse/TryParseパターンをお勧めします(Parse操作に置き換えられます)。.NET Frameworkはそれを頻繁に使用します(、、、Dictionary<T,K>.TryGetValueなどMonitor.TryEnterint.TryParse

編集:コーディングホラー:TryParseと例外税

于 2009-07-23T01:46:08.193 に答える
16

そうしないでください。

これは、「2つの文字列をパラメータとして受け取るメソッドの命名規則はありますか」と尋ねるようなものです。

Javaは例外をチェックしました。つまり、とにかくそれらを宣言する必要があります。したがって、例外がスローされるかどうか、およびどのタイプの例外がスローされるかを簡単に確認できます。例外処理コードを追加せずにメソッドを呼び出すコードをコンパイルすることもできません。

更新:特定の条件が真であるかどうかをチェックするメソッドを用意することを意図しているようですが、偽だけを返したくはありませんが、条件が満たされない場合は例外をスローして、説明メッセージを伝えることもできます(例外で)。「assert」または「ensure」のプレフィックスは理にかなっていると思います。

 // instead of
 if (! isAuthenticated())
    throw new NotAuthenticatedException("not sure why at this point...");

 // you do
 assertAuthentication();
 // which will throw NotAuthenticatedException("proper explanation") inside
于 2009-07-23T01:47:15.493 に答える
8

なぜJavaでそのようなことをするのですか?言語にはすでに例外指定子が組み込まれています。コンパイラーは、例外を処理または伝播させるためのアクションを実行せずに、明示的に例外をスローするメソッドを呼び出さないようにしますか?

于 2009-07-23T01:46:15.260 に答える
3

これらの方法を区別する必要がある場合は、接尾辞などを使用せずに名前を付けることができると確信しています。これは(他の人が指摘しているように)かなり恐ろしいことです。

なぜ持っている:

boolean authenticate(String username, String password);

そして、言います)

void authenticateEx(String username, String password) throws WhateverException;

実際の意図を伝えることで、実際に名前の意味のある部分にすることができる場合:

void ensureCanAuthenticate(String username, String password);

// or

void assertValidCredentials(...);

// or

void authenticateOrDie(...);

...または、紛らわしい接尾辞に頼るのではなく、実際に意図を伝える他の(おそらくより良い)名前。

于 2009-07-23T10:50:50.273 に答える
2

例外はJavaのメソッドシグネチャの一部であるため、このような命名規則は冗長になります。

于 2009-07-23T01:47:29.517 に答える
2

例外をスローするメソッドのハンガリアン記法?クエルホラー!

チェックされた例外またはチェックされていない例外を意味しますか?一体なぜあなたはそれをしたいのですか?

それについて考えるときは、すべてのメソッドに規則を追加する必要があります。これは、エラーやNPE、またはその他の問題が発生する可能性が常にあるためです。

例外をチェックした場合は「throws」句で十分であり、チェックされていない例外について神の緑の地球には良い目的はありません。

しないでください。お願いします。

于 2009-07-23T01:54:27.310 に答える
1

慣例はなく、exを追加すると、名前が読みにくくなり、平均的なJavaプログラマーを探すのが醜くなります。

しかし、例外をスローする可能性のあるメソッドに試行を追加すると、コードがより理解しやすくなることが時々想像できます。特にチェックされていない場合。

メンバーに_nameまたはmNameを使用したり、整数にiValueを使用したりする多くのc / c ++プログラムで見られるような、醜いものである必要はありません。しかし、Javaにはいくつかの規則もあります。メソッドが接頭辞is...setの整数を返す場合、このために最もよく使用される例はgetとtestです。これらはすべて、戻り型のアノテーションなどを介してメソッドヘッダーに文書化されています。ただし、関数名に1つの単語を追加すると、読みやすく、理解しやすくなります。

コードを読んでいるプログラマーに、このメソッドが例外をスローする可能性があるという潜在意識のヒントを与えてみてはどうでしょうか。tryWriteFileの代わりにtryCopyFileのように。

于 2009-07-23T02:14:36.113 に答える
0

たまに、次のようなメソッド名を付けることが理にかなっているgetSafely()場合があります(実際の値をあまり気にしないコードの場合、実際の値が無効な場合はデフォルト値を返しますvsプレースホルダー)またはその逆getOrBlowUp()(値が欠落している可能性があるが、値を設定するはずのコードのバグを示しているフェイルファストコードの場合)。

ただし、ここでのポイントは、「メソッド2は例外をスローし、メソッド1は例外をスローしない」ということではありません。前述のように、どのコードでも。をスローする可能性RuntimeExceptionがあるためです。重要なのは、2つのメソッドには、異なるユースケースに固有の異なるエラー処理セマンティクスがあり、それがメソッド名がキャプチャしようとするものであるということです。

それでも、どちらかの動作を回避してメソッドを呼び出すことができれば、通常、コードはよりクリーンになりますget()

ここで役立つ類似点は、ハンガリー語表記におけるSystemsHungarianとAppsHungarianの違いかもしれません。(Joel on Softwareのコーディング規約に関するこの記事も参照してください。)

  • Systems Hungarianは変数のタイプを通知するだけなので、整数countはになりiCountます。これはハンガリアン記法の最も一般的な形式であり、IMHOは、(1)最新のIDEではかなり無意味であり、(2)誰かが変数の名前を変更せずに型宣言を変更すると、誤解を招く可能性があります。
  • Apps Hungarianは変数の目的を教えてくれるのでindex、データ行を表す整数(または短い、または順序IDオブジェクトなど、誰が気にしますか?)はになり、注釈列drIndexindex表すとはになりacIndexます。これははるかに便利で、問題を引き起こす可能性がはるかに低くなります。

メソッドの呼び出しgetEx()はSystemsHungarianです。

于 2009-07-23T09:44:50.967 に答える
0

私が知っているものはありません。

私の意見では、そのようなことが理にかなっているのは、単体テストケース(例:testFooExpectingException())だけです。しかし、それはあなたが話していることではありません。

于 2009-07-23T02:17:07.607 に答える
0

宣言するかどうかに関係なく、すべてのメソッドが例外をスローする可能性があるため、このような規則はありません。また、IDEツールチップの時代では(もちろんIDEを使用していない場合を除いて)、多少冗長です。

しかし、なぜあなたがそのような命名規則を使いたがっているのか知りたいです。

于 2009-07-23T08:09:26.933 に答える
0

通常、メソッド名には追加しないでください。

代わりにスローを追加してください。

int parseInt(String s, int radix) throws NumberFormatException

しかし、個人的に私はゲッターが好きです。

    getFieldsOrThrow(java.lang.String key)
    getFieldsOrDefault(java.lang.String key, Value defaultValue)

https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/Struct

于 2021-02-19T10:31:49.443 に答える