2019年3月3日日曜日

タブ+オールマンのすすめ

今回はコーディングスタイルの話です。

はじめに

拙作ライブラリMayLilyソースコードを読んだことのある人がもしいたらわかるかもしれませんが、個人で書くコードは基本的に
というスタイルです。

(特にJavaScriptでは)どちらもあまり一般的ではないかもしれませんが、こういうスタイルにしている一応の理由はあるので、興味のない人もまあ読むだけ読んでやってください。

インデント文字について

タブ派 vs スペース派だと、スペース派が多いと思います。

ただ、スペース派でも「スペース2つ派」「スペース4つ派」「スペース8つ派」に分かれて内部抗争をしていたりします。

だったらタブにして、各自エディタの設定でタブを好きな幅に展開すればいいやん

という理由です。
あ、ちなみに字下げは4つにしてます。

字下げスタイルについて

オールマンスタイルとはこういうやつです。
function isLeapYear(year)
{
 if(year % 400 === 0)
 {
  // 400で割り切れる年は閏年
  return true;
 }
 if(year % 100 === 0)
 {
  // 400で割り切れず、100で割り切れる年は平年
  return false;
 }
 if(year % 4 === 0)
 {
  // 400でも100でも割り切れず、4で割り切れる年は閏年
  return true;
 }

 // それ以外は平年
 return false;
}
ブロックのブレース(中括弧)を独立させる書き方です。
一番のメリットは見やすいこと。ブロックが一目瞭然です。

K&Rスタイルを使うとやや詰まって見え、場合によっては詰まって見えるのでわざわざ空行を入れる場合もあります。
function isLeapYear(year) {

 if(year % 400 === 0) {

  return true;
 }
 if(year % 100 === 0) {

  return false;
 }
 if(year % 4 === 0) {

  return true;
 }

 return false;
}
これはただの例です。さすがにこれくらいの短いコードでわざわざ空行を入れる人はあまりいないと思いますが、else ifが続いたりすると入れたくなりませんか?

そんなところで空行を入れるくらいならオールマンスタイルを使いましょう。
オールマンならブレースを独立させることで、自動的に「ほぼ空行」が入ります。

Q&A

インデント以外でタブは使うの?

使いません。
インデント以外(行の途中)でタブを使うと、スペース4つの設定でちょうどいいけど8つにしたらガタガタになるという場合があるので、タブを使うのはインデント時のみです。

オブジェクトの定義もブレースを独立させるの?

オブジェクトの定義に使うブレースはブロックではないので、
const data = {
 a: 1,
 b: 2,
 c: 3,
};
↑こんなかんじで書いてます。
ちなみにオブジェクトの配列
const data = [
 {
  a: 1,
  b: 2,
  c: 3,
 },
 {
  a: 1,
  b: 2,
  c: 3,
 },
];
↑こんなふうにしてます。

単に追加とか削除が楽だからという理由です。

ifとかwhileの後に間違えてセミコロン入れたらどうする?

オールマンスタイルでよく指摘されるやつですね。
if(value === 1); // 間違えてセミコロンつけちゃった
{
 callSomeFunction();
}
間違えてセミコロンをつけると常にcallSomeFunction()が呼ばれる問題。

これはLintで対応しましょう。
例えばTSLintcurlyルールを設定すると、条件の後にはブレースでのブロックを強要されるので、こういう潜在バグを発見できます。

仕事ではどうやってる?

仕事で書く場合はちゃんと空気を読んでその場のスタイルに合わせてますよ。
IDEのフォーマッターを使えばショートカットキー一発で変換できます。
ちなみに今の職場はスペース4文字+K&Rスタイルです。

一番大事なことは、K&Rも言っているように、自分に合ったスタイルを一貫して使うことです。

0 件のコメント:

コメントを投稿