自身の備忘を兼ねて記載を行っています。
「とりあえず動いた」程度のソースなどもございますので参考程度にブラシアップ頂けると幸いです。
また、誤りやもっとよいコーディングやきれいな書き方があるなどご指摘頂けるととてもうれしいです。
今回のお題
キレイで、見やすいプログラムコードってどんな書き方だろうと日々悩んで右往左往する
まず初めに
今回は、「こうである」というような結論は出ません。
私の、現状のベストを紹介してコメントを頂ければより良いものに進んでいける。
そんな記事になっています。
では考察
今回、シンプルかつ複雑でながーくなったりもするSQLを題材として考察を進めたいと思います。
改行のポイント
改行ってどこでするのが一番良いのでしょうか・・・
例えば、
SELECT name, age, address, tel, job, luck FROM users WHERE age >= 30 AND luck > 100;
というSQLがあった場合、どのような改行をしますか?
これぐらいのSQLならシンプルなので改行しなくてもいい気がしますが、
私は、
SELECT
name
,age
,address
,tel
,job
,luck
FROM
users
WHERE
age >= 30
AND
luck > 100
;
こんなSQLを書きます。
こだわりを説明すると、
- カラム/テーブルの開始位置を合わせて縦に見やすく
- カラムの区切りを先頭に持ってくることによって入れ替えやカラムの追加時にカンマの不足や過剰を起こしにくい
- 条件もWHERE句やAND/OR句と分離することによって入れ替えをしやすく
そんなつもりです。
インデントのポイント
インデントはどうしたらいいでしょうか・・・
私は、上記のように基本的に半角スペース2個分を下げ、カンマが改行で並ぶ場合は先頭のみ半角スペース+一つ分下げてます。
また、条件句が複雑となる場合はパッとみてグループであることがわかりやすいと思い下記のように記載しています。
SELECT
name
,age
,address
,tel
,job
,luck
FROM
users
WHERE
age >= 30
OR (
luck > 100
AND job = '魔法使い'
)
;
別名のポイント
カラムやテーブルにつけることが出来る別名ですが、どのようにすると見やすいでしょうか・・・
またもや私の例ですが、
SELECT
u.name AS 名前
,u.age AS 年齢
,u.address AS 住所
,u.tel AS 電話番号
,u.job AS 職業
,u.luck AS 運
FROM
users u
WHERE
u.age >= 30
AND
u.luck > 100
;
こちらも開始位置を合わせて縦に見やすくしているつもりです。
また、この書き方のメリットとしては、テキストエディタなどで矩形選択(ブロック選択)が使える場合は開始位置や次の句が始まる位置が揃っているほうが選択しやすいというのもあります。
複雑な場合のポイント
SQL的に合っているかは置いといて、このようなケースとなるとより良い書き方を求めたくなるのがわかるかと思う。
JOIN句や条件句の優先順位などシステム開発で書くSQLはもっと複雑で長く、個数も多い。
その中で、醜いコードを書き続けることがどれだけ不具合に繋がるかを考えるとプログラマについて回る恒常的課題なのではないだろうか。
SELECT
u.name AS 名前
,u.age AS 年齢
,u.address AS 住所
,u.tel AS 電話番号
,j.job AS 職業
,s.power AS 攻撃力
,s.defense AS 防御力
,s.speed AS 俊敏
,s.luck AS 運
FROM
users u
,jobs j
LEFT JOIN
status s
ON u.id = s.user_id
WHERE
u.job_id = j.id
AND
u.age >= 30
AND (
(
s.luck > 100
AND j.job = '魔法使い'
) OR (
s.speed > 200
AND j.job = '戦士'
) OR (
s.power > 250
AND j.job = '踊り子'
)
)
下記は、以前見たことがあるSQLの再現なのだが、どうだろうか?
一見見やすいような気がするのだが、検索対象のカラムが増えた場合どうだろうか・・・
実際30近いカラムが列挙されているSQLの4カラム目にカラムの追加が必要となり、そんなSQLが何本もあったときは・・・
呪言を吐きながら修正を行ったのを未だに忘れない。
ただ条件句の優先順位箇所に関しては見やすいような気がする。私は比較的好きだ。
SELECT
u.name AS 名前,u.age AS 年齢 ,u.address AS 住所 ,u.tel AS 電話番号
,j.job AS 職業,s.power AS 攻撃力,s.defense AS 防御力,s.speed AS 俊敏
,s.luck AS 運
FROM
users u
,jobs j
LEFT JOIN status s
ON u.id = s.user_id
WHERE
u.job_id = j.id
AND
u.age >= 30
AND (
(s.luck > 100 AND j.job = '魔法使い')
OR (s.speed > 200 AND j.job = '戦士')
OR (s.power > 250 AND j.job = '踊り子')
)
まとめ
SQLに限らず、プログラムをコーディングする際気を付けなければならないのは、コーディングミスだけではない。
見やすさを意識し改修時に他のエンジニアがみてもわかりやすく、修正しやすいものを作り上げる意識を持つ必要がある。
その際に改行をいれる場所、スペース/タブの数など動作には影響しない部分にまで少しづつでも意識を向けると、きっと不具合を生みにくいプログラムとなるのではないかと思います。
お願い
みなさんはどんなコーディングをしているだろうか?
是非とも自分のこだわりや目からうろこ的なコーディング例があればコメントで教えて頂きたい。
今回はSQLを題材にしたがもちろん、別の言語でも大歓迎です。