序文
しばらく前に他の人が書いたコードを読みながら、私は、ビジネス関連の数がされた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はすでに、ホットキーのパッケージを提供してくれています。
エピローグ
いくつかの個人が軽減if-else
ここで共有慣行をコーディングし、このいくつかの方法で、私は個人的に最も明白な効果が最初であることを感じて、事前の復帰、何度も、かなり前リターンのコードの一部の複雑さを軽減することができます。
あなたは多くの使用する必要がある場合はもちろん、if-else
ロジックを制御するための時間を、コメントがすべての条件では非常に良い習慣だったものを示しています。