pei’s blog

情報系の大学を出たSE1年生。主にプログラミング(機械学習寄り)の話題を書いていきます。

読みやすい・短いコードを書くための工夫(初心者向け)

お久しぶりです。

今回は初心者にがより読みやすく・短くなるコードを書くための4点の工夫について書いていきます。

新卒で入った企業でプログラミングの研修をしている時に周りの未経験者に教えたらコードが短く読みやすくなった手法についていくつか書いていきます。


boolean型はflag = !flagでひっくり返す

if (true == flag) {
  flag = false;
} else {
  flag = true;
}

は以下の一行でかけます。

flag = !flag;


定数と変数の比較は 定数 == 変数 の方が良い

なぜかというと、間違えて == を = にして代入文になってしまった時、定数が左だとコンパイル時にエラーが出るため、実行前にエラーがわかるからです。

もし変数が左だと値が代入されて意味不明な挙動になってしまう、そもそも = と == の間違えを見つけるのが大変なため、エラーが見つけにくくなります。

void dispArray(int[]numList) {
  // こっちよりも
  if (numList.length == 0) {
  }

  // こっちの方がいい
  if (0 == numList.length) {
  }


三項演算子使ってみよう

このような配列の最大値を探すような処理は

int max = -1;
for (int i = 0; i < numArray.length; i++) {
  if (numArray[i] > max) {
    max = numArray[i];
  }
}

このようにかけます。

int max = -1;
for (int i = 0; i < numArray.length; i++) {
  max = max < numArray[i]? numArray[i] : max; 
}

三項演算子

条件式? 条件式がtrueのときの値 : 条件式がfalseのときの値;

という書き方です。return文でも使うことができます。


if句でreturnやthrowしたあとの処理はelse句じゃなくていい

研修の時未経験の人は、if文で引数チェックをしてifブロックでエラー時の処理をし、else句で正常な引数のときの処理を記述することが多いと感じました。

例えばこのような処理は

void setWidth(int width) {
  if (0 > width) {
    エラーを投げる処理
  } else {
    this.width = width;
  }
}

以下のように書くとブロックが減り、スッキリします。

void setWidth(int width) {
  if (0 > width) {
    エラーを投げる処理
  }
  this.width = width;
}

エラーを投げる処理をした時点でその関数が終了するため、正常時の処理はelseでなくても良いです。