[java符号化の技術]1.コードクリーンアップ
22245 ワード
3ヶ月前に新しく入社した非専門開発者が可読性の良いコードを作るために学んだ内容です.不足や再学習のアドバイスは、文章で発見された問題をいつでも話してください.
1.ブール値は比較しないでください。
サンプル作成したばかりのコードで、条件文で値を比較する場合、boolean元の値は この比較は全く必要なく、コードの可読性や理解力が低下する 修正案 else文も使えますが、早い戻り方も使えます→文がきれいになったら不要なelse文も整理されます 条件文を書くときは、否定表現
3.ブール式を直接返す
19歳未満、名前値nullまたは名前が空の場合falseのユーザ認証コードを返す 条件文には多くのものがあり、コードが読みづらい.→インデントと分機ゲートに入って可読性が低下 条件文が3つ以上使用されている場合は簡略化することが望ましい→この場合簡略化された条件文ブロックに共通に使用されている部分がある場合は、その使用方法(関数)を抽出することが望ましい x&&y|z→(x&y)|z→演算しない場合&これより先|演算 4.条件文のnullPointExceptionを避ける
Java開発による有効性(買収検証)における最大の問題→nullPointexception この検証手順が一番重要!→上記のコードは、まずパラメータ値が使用に適しているかどうかを決定し、nullであるかどうかを決定する→この場合、パラメータ値が使用に適しているかどうかを決定する過程でnullPointExceptionが発生する可能性が高い. 検証の正確な順序は、空チェック→値の可用性(引数が望ましい) 読みやすく動作がスムーズなコードに変更 有効パラメータチェックを先にパラメータ順に行う→可読性を高める(メッセージの有効性と位置有効性条件文の位置マッチング) null検査後、その値が有効か確認 常にこのレベルのパラメータ有効性チェックを行う必要はない 主にpublic、protected、defaultで有効性検査を行う プライベートではnullを超えないほうがいい 5.switch case構文とbreak
switch case文法は本当に多くの間違いを引き起こす文法の一つ 上記のサンプルコードのうち switch文は興味のある事項の分類が難しいかも コードの読みやすさを向上させるため、カッコを省略するよりカッコを使用した方が良い 上記のコードのように、1行が終了すると括弧を省略することができます. 上記のサンプルコードは括弧を使わず、エラーのコードを誤ったインデントで理解→ 雑談、if疑問の括弧は以前から多くの議論の対象となっている→自分に合った括弧を使う. 7.リバースコード
上のコードから見ると、分岐文法は同じ注目点分類を行っていない 登録者とユーザフェルジョナを分離することでコードの対称性を達成
1.ブール値は比較しないでください。 public class ExampleService {
private int a = 10;
private int b = 20;
public int escapeBooleanCompare() {
if (compareIntA(100) == true) {
return a;
} else {
return b;
}
}
private boolean compareIntA(int param) {
return param == a;
}
}
public class ExampleService {
private int a = 10;
private int b = 20;
public int escapeBooleanCompare() {
if (compareIntA(100) == true) {
return a;
} else {
return b;
}
}
private boolean compareIntA(int param) {
return param == a;
}
}
==
と比較しない.public int escapeBooleanCompare() {
if (compareIntA(100)) {
return a;
}
return b;
}
2.否定を避ける
if(!isTrue())
比if(isTrue())
のように!加えた否定は使わないほうがいい→肯定的表現は否定的表現よりコードの理解度を高めるのに役立つ+457918、3.ブール式を直接返す public class ExampleService {
private String name;
private int age;
public boolean checkUserInfo(String name, int age) {
if (age < 19 || Objects.isNull(name) || name.trim().isEmpty()) {
return false;
} else {
return true;
}
}
}
public class ExampleService {
private String name;
private int age;
public boolean checkUserInfo(String name, int age) {
if (age < 19 || Objects.isNull(name) || name.trim().isEmpty()) {
return false;
} else {
return true;
}
}
}
public boolean checkUserInfo(String name, int age) {
return age > 19 && !Objects.isNull(name) && !name.trim().isEmpty();
}
public boolean checkUserInfo(String name, int age) {
boolean isValidAge = age > 19;
boolean isValidName = !Objects.isNull(name) && !name.trim().isEmpty();
return isValidAge && isValidName;
}
4.条件文のnullPointExceptionを避ける public void writeMessage(String message, Path location) {
if (Files.isDirectory(location)) {
throw new IllegalArgumentException("유효하지 않은 경로입니다.");
}
if (message.trim().isEmpty() || Objects.isNull(message)) {
throw new IllegalArgumentException("유효하지 않은 메시지입니다.");
}
}
public void writeMessage(String message, Path location) {
if (Files.isDirectory(location)) {
throw new IllegalArgumentException("유효하지 않은 경로입니다.");
}
if (message.trim().isEmpty() || Objects.isNull(message)) {
throw new IllegalArgumentException("유효하지 않은 메시지입니다.");
}
}
public void writeMessage(String message, Path location) {
if (Objects.isNull(message) || message.trim().isEmpty()) {
throw new IllegalArgumentException("유효하지 않은 메시지입니다.");
}
if (Objects.isNull(location) || Files.isDirectory(location)) {
throw new IllegalArgumentException("유효하지 않은 경로입니다.");
}
}
5.switch case構文とbreak public void writeMessage(int a) {
String result;
switch (a) {
case 1 :
result = "one";
case 2 :
result = "two";
break;
case 3 :
result = "three";
break;
default:
result = "other";
break;
}
}
public void writeMessage(int a) {
String result;
switch (a) {
case 1 :
result = "one";
case 2 :
result = "two";
break;
case 3 :
result = "three";
break;
default:
result = "other";
break;
}
}
case 1
ブロックに欠落しているbreak;
つまり、第1のcaseは無条件に失敗し、第2のcaseから開始する.→switch caseミスで悪名高い理由の一つ6.常にかっこを使用
public void writeMessage(int a) {
String result;
if (a == 1)
result = "one";
if (a == 2)
result = "two";
if (a == 3)
result = "three";
a++;
}
if(a == 3)
構文中a++;と7.リバースコード public void checkAuth() {
if (checkUserUnknown()) {
return;
} else if (checkSupplier()) {
System.out.println("반갑습니다. 판매자님");
} else if (checkConsumer()) {
System.out.println("반갑습니다. 고객님");
}
}
public void checkAuth() {
if (checkUserUnknown()) {
return;
} else if (checkSupplier()) {
System.out.println("반갑습니다. 판매자님");
} else if (checkConsumer()) {
System.out.println("반갑습니다. 고객님");
}
}
checkUserUnknown()
過checkSupplier()
・checkConsumer()
相互処理の関心事項が異なる→ユーザがログインするかどうかとユーザの権限設定の2つの関心事項を分離→コードの対称性を達成するために分離する.public void checkAuth() {
if (checkUserUnknown()) {
return;
}
if (checkSupplier()) {
System.out.println("반갑습니다. 판매자님");
} else if (checkConsumer()) {
System.out.println("반갑습니다. 고객님");
}
}
Reference
この問題について([java符号化の技術]1.コードクリーンアップ), 我々は、より多くの情報をここで見つけました https://velog.io/@power0080/자바-코딩의-기술-1.-코드-정리-생기초テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol