3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

きれいなコーディングってどんな書き方だろう

Last updated at Posted at 2019-09-25

自身の備忘を兼ねて記載を行っています。
「とりあえず動いた」程度のソースなどもございますので参考程度にブラシアップ頂けると幸いです。
また、誤りやもっとよいコーディングやきれいな書き方があるなどご指摘頂けるととてもうれしいです。

今回のお題

キレイで、見やすいプログラムコードってどんな書き方だろうと日々悩んで右往左往する

まず初めに

今回は、「こうである」というような結論は出ません。
私の、現状のベストを紹介してコメントを頂ければより良いものに進んでいける。
そんな記事になっています。

では考察

今回、シンプルかつ複雑でながーくなったりもする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を題材にしたがもちろん、別の言語でも大歓迎です。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?