他にJavaのコーディング規則であれば、いくつかの削減についての講演

序文

しばらく前に他の人が書いたコードを読みながら、私は、ビジネス関連の数がされたin vivo法のいくつか見つかったif-elseネストされたステートメントの例を。まず、私は個人的に記述しないで提唱していないif-else文を、何回も言っていました使用されているいくつかの書き込みロジックにif-else決意を行うために、またはコード非常に簡単に見えますが、虐待を受けた場合if-else、または形成ネストされたが、いずれの場合には、さらにロジックを大量に含み、形成され、読みやすくするためにケース、使用if-else良いよりも少し害を。時には、あまり必要ないかもしれないif-else、または削減を達成するために、他の符号化方式を使用することがif-else効果を。

削減if-else方法は、のレベルなど、多くのデザインパターンがあります使用戦略パターンChain of Responsibilityパターンは、あなたと一緒に頻繁に使用されるいくつかの個人的な日々の符号化プロセスを共有するために、ここでは比較的簡単です。そして、コーディング習慣のレベルから道、不要な数減らすためにif-else使用する。私はほんの少しの新人だったので、あなたが場所を書かれていない場合、私は批判を懇願。

いくつかの削減エンコーディングのif-else

一つの方法:事前のリターン

コード例の最初の部分は示しています。

if (condition1) {
    if (condition2) {
        return getSomething();
    } else {
        return 0;
    }
} else {
    return 0;
}
复制代码

修正されたコードを次のように

//这里最好对这个flag所判断的逻辑补充注释进行描述
boolean flag = !condition1 || (condition1 && !condition2)
if(flag) {
	return 0;
}

if (condition1 && condition2) {
    return getSomething();
} 
复制代码

特定の条件下では、固定論理値を返す必要があることが知られている場合、この部分は、論理的に独立した存在として抽出することができif-else block、そして他方が配置されているif-else blockことを直接前方の、特定の条件を満たしたときに、前にreturnこの固定値。最も直接的な効果が減少することであるif-elseネストの数を。


第二の方法:使用して三項演算子

最初の例では、ここでは一例として、ビジネスシナリオにあります:

リストの見直しについての画像URLのクエリ(存在する場合、画像のURLリストがテーブルにJSON文字列形式の配列をコメント欄にコメントを保存します)

変更前のコードは次のよう:

Comment comment = getById(commentId);

if (Objects.isNull(comment)) {
    throw new RuntimeException("评论不存在或已被删除");
}

String imgListStr = comment.getImgList();
if(StringUtils.isEmpty(imgListStr)) {
    return null;
}

return JSON.parseArray(imgListStr, String.class);
复制代码

更新:

Comment comment = getById(commentId);

if (Objects.isNull(comment)) {
    throw new RuntimeException("评论不存在或已被删除");
}

String imgListStr = comment.getImgList();
return StringUtils.isEmpty(imgListStr)) ?
    null : JSON.parseArray(imgListStr, String.class);
复制代码

三つの方法:アサートアサーションを使用して

ビジネス・コードを調製する際に、ある特定の条件のために必要に応じて決定され、条件がない場合に満足ニーズが例外をスローする。このシナリオでは、うち三オペレータ以外は上記の例を使用してif方法、ことができ、またSpringフレームワークを使用するを提供してくれるAssertツールクラス。

一般的に使用されているAPIは以下のとおりです。

  • isTrue(ブール式、文字列メッセージ) : ときexpressio == false時間は、例外がスローされ、例外は、message上院へ秒でした。
  • ボイドnotNullを(@Nullable Objectオブジェクト、文字列メッセージ): ときに、上記のようにobject == null時間が例外をスローします。
  • 空notEmpty(@Nullableコレクション<?>コレクション、文字列のメッセージ): 上記のように、オブジェクトがコレクションであるとき、nullまたはコレクション要素が空の場合、例外がスローされます。
  • .....

あなたが解決するために、直接ソースコードを見ることができます他の多くの方法がありますが、当然のことながら、実際には、isTrue()あなたがより多くの意味的な必要がある場合は、対応するAPIを使用することができ、十分に良いされています。

前にコードを変更します。

if (Objects.isNull(comment)) {
    throw new RuntimeException("评论不存在或已被删除");
}
复制代码

コードを変更した後:

 Assert.isTrue(Objects.nonNull(comment),"评论不存在或已被删除");
 Assert.notNull(comment,"评论不存在或已被删除");
复制代码

現在、Assertメソッドは珍しいのためにのみ単一のツールを投げることができjava.lang.IllegalArgumentExceptionますがスローされた例外をカスタマイズする必要がある場合は、その後、方法が適用されません。


4つの方法:使用オプション

任意java8は、に対応するオブジェクトの新しい機能である容器用メインオブジェクトnullチェックの値、及びチェーンは、後続の動作チェック、等行った後に行うことができる:例外がスローされ、null交換等が挙げられます。

どの私は個人的にいくつかのメソッドを使用しました:

  • 静的<T>オプション<T> ofNullable(T値): 使用オプションは、オブジェクトをラップ。
  • OrElse T(T OTHER):オプションのオブジェクトはnull、基準オブジェクトにリターン。
  • OrElseGet T(<?T延び> OTHERサプライヤ):オプションのオブジェクトはnull戻り、Supplier値が提供されます。
  • OrElseThrow T(サプライヤーexceptionSupplier <Xを拡張- ?>):オプションのオブジェクトがnullスローされsupplier提供されるカスタム例外

コード例:

Message message1 = Optional.ofNullable(getById(messageId))
    .orElseThrow(() -> new RuntimeException("消息不存在!"));

Message message2 = Optional.ofNullable(getById(messageId))
    .orElse(new Message());

Message message3 = Optional.ofNullable(getById(messageId))
    .orElseGet(Message::new);
复制代码

私はもっ​​と日常する必要があるため、データベースのクエリからのデータは、クエリの結果がSpirngブート2.xのとは異なり、MyBatisのを使用して永続化フレームワークので、私の会社。NULL値判断する必要がある場合シーンは価値判断が完了したヌルデフォルトのバージョンとしてJPA DAO層メソッドは、クエリ結果のパッケージ上に挙げた最初のメソッドを使用する手動でのみ、オプションが必要な場合は、戻り値はので、ここで、オプションでサポートしています。

以下に示すようにもちろん、IDEAはすでに、ホットキーのパッケージを提供してくれています。

Animation.gif

エピローグ

いくつかの個人が軽減if-elseここで共有慣行をコーディングし、このいくつかの方法で、私は個人的に最も明白な効果が最初であることを感じて、事前の復帰、何度も、かなり前リターンのコードの一部の複雑さを軽減することができます。

あなたは多くの使用する必要がある場合はもちろん、if-elseロジックを制御するための時間を、コメントがすべての条件では非常に良い習慣だったものを示しています。

おすすめ

転載: juejin.im/post/5d64e4c6e51d45621320313c