最近、いくつかの古いプロジェクトをリファクタリングしていたところ、典型的なコード ブロックをいくつか見つけました。
こういった一般的な書き方を考えると、初心者でも「制作」しやすいのではないかと思い、お話してみることにしました。
例:
ご覧のとおり、これは名前を追加および変更する前に、名前の重複を検出するために使用される関数です。
/**
* 检测标签名是否重复
* @param Id
* @param name
* @return
*/
Boolean checkLabelNameExist(Integer Id,String name);
新規追加と変更が組み合わされるため、新規追加かどうかを判断する追加 ID 入力パラメーターがあります (ID が空の場合は新規追加、空でない場合は変更)。
したがって、新規追加の場合、この名前のデータが存在することが判明した場合、そのデータは複製されることを意味します。
変更に関しては、この名前のデータを除外する必要があることを意味し、まだ存在する場合は重複とみなされます。
それでは、醜い出力を見てみましょう:
/**
* 编辑或新增前 ,判断名称是否已存在
* @param id
* @param name
* @return true 为存在 ; false 为不存在
*/
@Override
public Boolean checkLabelNameExist(Integer id, String name) {
Label label = labelService.queryOneByName(name);
if (Objects.isNull(id)){
if (Objects.isNull(label)){
return false;
}else {
return true;
}
}else {
if (Objects.isNull(label)){
return false;
}else {
if (!label.getId().equals(id)){
return true;
}else {
return false;
}
}
}
}
上記のコードを初めて見たとき、見覚えがあると思いませんか?
同様の出力を行ったことがありますか、または現在も行っていますか?
ガード ステートメント メソッドを使用した後のコードがどのようになるかを見てみましょう (はるかに単純ではありませんか)。
@Override
public Boolean checkLabelNameExist(Integer id, String name) {
Label label = labelService.queryOneByName(name);
//查出来是空的,代表肯定不存在
if (Objects.isNull(label)){
return false;
}
//如果是新增,查询出来不为空,则代表已存在
if (Objects.isNull(id)){
return true;
}
//若是编辑,仅需要判断传入的ID 和查询出来的是否一致,不一致则代表 存在
return !label.getId().equals(id);
}
当初のジャーナル コードには問題はありませんでしたが、非常に混乱しているように思えました。より高いレベルの観点から全体的な計画を立てずに、段階的に進めるだけでした。
最初は、ガードセンテンスを使用するというアイデアに慣れていませんでした。それは問題ではありません。
書き込みが完了したら、コードを 1 行ずつ読むことができます。
if の深さに埋め込む必要がなく、事前に判断できるガード条件を見つけます。
初心者は上記の 2 つのコード スニペットを見て、自分で考えてみてください。
ガード文は、元の条件を論理的に解析し、特定のキー(ガード)条件の判断を優先することでプログラムの流れを簡略化するため、ガード文と呼ばれます。