ブールメソッドの命名の肯定と否定


43

ブール型メソッドは、否定的な形式でのみ使用される場合でも、常に肯定的な形式を取る必要がありますか?

エンティティを作成する前にエンティティが存在するかどうかを確認したかったとしましょう。私の主張は、メソッドが肯定的なフォームで使用されているかどうかに関係なく、下の最初のフォームは2番目のフォームより優れているということです。

要約すると、私はif(!affirmative)よりも読みやすいと思いますif(negative)。意見が合わない同僚がいますか?

最初のフォーム:

int entity_id = 42;
if(!entity_exists(entity_id)) create_entity(entity_id);

2番目のフォーム:

int entity_id = 42;
if(entity_not_exist(entity_id)) create_entity(entity_id);

3
C ++?どうif (not entity_exists(entity_id))
コス


to-may-to-mah-to。率直に言って、私は!何度も文字を見逃してしまったので、コードを再読するまでコードを誤解してしまいました。だから私はおそらくあなたの同僚にもっと同意するでしょう。私はあなたがそれを調べるときに真と評価されるフォームが好きです。
ベリンロリチュ

if (!exists) create()それはスレッドセーフではない傾向があるため、多くの言語/フレームワークで悪い習慣とみなされる可能性があると言うためにチャイムしたいだけです。通常、推奨されるアプローチはcreate()、エンティティが既に存在することを示す特定の例外またはリターンコードを呼び出して処理することです。もちろん、これは実際の質問に対する答えではありません(これがコメントのみの理由です)。
ジュラルゴン

回答:


61

ブール型メソッドは、否定的な形式でのみ使用される場合でも、常に肯定的な形式を取る必要がありますか?

そのようなことについてのルールを作ることは少し多いようです- ブールプロパティにネガティブな名前を使わないというコーディング標準文書のガイドラインを見たくありません。しかし、個人的なスタイルの問題として、名前をポジティブに保つことは素晴らしい理想だと思います。しかし、私はそれがスキニーで簡単に見逃される必要性を避けることも良いと思います!。多くの場合、ネガティブな名前をポジティブな名前に変える方法を見つけることができます。

  • accountHasCharges
  • accountIsClear(と同じ!accountHasCharges

明快さは最も重要な考慮事項であり、ネガティブなメソッド名を避ける正当な理由は、それらが二重のネガティブまたはより悪いことにつながる可能性があることです:

  • isComplete // はい
  • isNotComplete //!isCompleteは通常より良い
  • isIncomplete // 'incomplete'がオブジェクトの既知の状態である場合、意味があります
  • !isNotComplete //恐ろしい
  • !isNotComplete == 0 //永続的な休暇につながる可能性があります

5
「コーディング標準ドキュメントに、ブールプロパティにネガティブな名前を使用しないというガイドラインを表示したくありません。」- ここに置いておきます
...-AakashM

16
あなたは忘れてしまった!isNotIncomplete
ベン・リー

だから、の反対は考えentity_existsentity_should_be_created(代わりにentity_not_exists)?それともentity_missingダンの提案に従って?
ADTC 14

1
これは、コーディング標準文書が「すべき」または「必須」ではなく「優先」という言葉を使用できる場所です。
ウェインコンラッド

15

肯定が読みやすいことに同意します。あなたが試すかもしれません

第三フォーム

int entity_id = 42;
if (entity_is_missing(entity_id)) create_entity(entity_id);

または

第4形態

int entity_id = 42;
if (is_entity_missing(entity_id)) create_entity(entity_id);

2

また、メソッドの使用方法にも依存します。肯定的なケースと否定的なケースの両方で使用される場合、例えば

if (!entity_exists(entity_id)) create_entity(entity_id);

if (entity_exists(entity_id)) publish_entity(entity_id);

その場合、メソッド名は上記のように肯定的である必要があります。使用方法がわからない場合は、上記に固執してください。

しかし、それが否定的なケースでのみ使用される場合、以下が受け入れられます(おそらく望ましい)

if (entity_not_exists(entity_id)) create_entity(entity_id);

またはより肯定的に言い換えることをお勧めします

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