プログラミングをしていて、おのずと学んでいく事になるコーディング方法。
綺麗で見やすく分かりやすいコーディング方法ね。
知らなくても、長くやってれば自然と分かってきて、身についてきます。
でも初心者は思うでしょう。
なぜ、綺麗に分かりやすく書かなきゃいけないのか。
動けばいいじゃん。一人でやってるんだから、自分がわかればいいじゃん。
初心者は必ずそう思います。
でも、初めての方はまず動かしてプログラミングになれることも必要なわけで、
めちゃくちゃでも、始めの頃は動けば良いとも思います。
挫折するよりはね。
プログラミングにある程度慣れてきたら、わかるはずです。
自分が書いたプログラムが汚くて自分でもわかりにくい。
時間がたつほど、自分が書いたルーチンなのに、何しているのかわからなくなる。
汚いから、ミスが多くてバグフィックスばっかしている。
機能を増やそうとしたら、1からやりなおしたほうが早い。綺麗に書いておけば・・・。
そう、たとえ他人が見なくても、綺麗に書くことは大切だとわかってきます。
短いプログラムなら『どうにでもなる』、という初心者の頃とは違ってきますからね。
これに気が付いたら、一歩前進してみると、プログラミングがぐっと楽になると思います。
綺麗になるヒントは、php コーディング規約 で検索するとわかります。
phpを書いて長いですが、実は初めて見直してみました。
これら規約の内容は、あくまで基本です。
実際のプログラミングは、もっと様々なことに注意をはらわなければ、大きなソフトは作れないでしょう。
複数の規約を見ると、どれもほとんど内容は同じです。
行き着く先は、同じということです。それぞれが真似してるわけではないのです。
全てを真似る必要性はまったくありません。
異なったルールでやっているグループもあります。
一番大切なのは統一性です。
最も変化があるのは、名称ルールでしょう。
現在一般的なのは、『getBlogData』というような書き方です。
小文字から初めて、次の単語からは大文字で始めます。
昔の標準的な書き方は、『GetBlogData』でした。
自分で定義したものは大文字からはじめ、外部ライブラリは小文字というルールです。
ライブラリにある関数なのか、自作関数なのかを明確にするためです。
そうすれば、ライブラリの関数を全て覚えていなくても、他の人のソースをスムーズに読めます。
また、あるコーディングルールには、変数の型を変数名に含めるという方法もあります。
キャラクタ型なら c_abc、数値型なら i_abc という感じです。 c はchar型で、i は int型です。
でもphpには型の定義が無く、自動で変換されるのでこういった定義方法は使う事は無いでしょう。
私がよく使う関数名のルールにはこんなのもあります。
関数の置かれているソースのファイル名を頭につけて、関数の重複回避や、ソースを追うのに役に立っています。
『filename_functionName』 です。
html内に無造作に複数の独立したphpをインクルードする場合に都合が良いです。
この関数はどこのライブラリだっけ?という疑問も、関数名でわかり便利です。
全ての関数をクラス分けでもいいですが、長くなって面倒ですからね。ケースバイケースです。
ずっと疑問に思っていたことも、これら規約を見て解決したのもある。
文字列を囲むとき、『 ' 』にするか『 " 』にするか。
なんとなく『 ' 』にしていたけど、やっぱこの方が変数が無いか調べない分サーバーの負担も減るのでしょうね。
そこまでは書いてないけどね・・・・。
ただどの規約にも書いてないのは、『 " 』で変数を混ぜるのと、『' ' . $abc . ' '』のように外にだすのとで、どっちが良いのか。
文字の連結には『.』を使うようにって書いていながら、『""』で一緒に書くルールも書いてある。
おそらく文字列変数同士を連結させる場合は『.』という意味なのだろうけど。
混ぜる場合は、『" {$abc} "』 のように通常は『 {} 』でくくるよう配慮したほうが良いと思う。
どっかの規約の例では『 "あいうえ$abcおかき"』のようになっていたが、やってはいけない方法だ。
たぶん、日本語訳を書いた人のうっかりミスだろう。
これはエラーの原因になる。実行する機械から見ると、どこまでが変数名か判断しにくいからだ。
後ろに続く文字によっては、変数名と認識されてエラーになる。
たとえば、『$abcおかき』という変数名と認識されるかもしれない。(この文字では試していない)
自動認識を当てにしてはいけない。
コーディング規約を見ていて一番びっくりしたのは、 『 { } 』の扱い方です。
昔調べたときは、様々な方法が書いてあって、どれが良いのか答えがわかりませんでした。
そこで色々試した結果、行き着いた最善の書き方。
それがどのコーディング規約にも書かれていた。
関数は、『 { 』を関数の頭にそろえて書き、ifなどのルーチンでは その行の最後に書く。
昔調べたときは、どっちかに統一する書き方ばかりでした。
それで色々試した結果、別々の書き方が見やすいと結論したわけです。
と、色々試行錯誤した内容は、私がこっそり?配布しているスクリプトに現れています。
すなわち、統一性がちょっと低いという、素人じみたソースです。
その日によって、ルールを変えてやりやすさを調べていました。
理論より実践です。
さて、書き方のルールがわかったら、次はルーチンを組み方に慣れる必要があります。
だらだらと書くのではなく、関数等にわけてスマートに書くのが楽です。
これも初心者は疑問に思うでしょう。
何故、関数に分ける必要があるのか。一気に書いちゃった方が楽じゃないの。
昔から多くの人にこういった質問を受けていました。
確かに、一回しか使わないルーチンなら関数にまとめる必要は無いかもしれない。
しかし、同じ処理をする一連のルーチンを何度も書く場合はどうか。
初心者は思う。 「コピペすればいいだけじゃん。」
それでできたのが、同じ処理が数箇所に記述される長いソース。
もし、その処理にバグがあったら?
もし処理内容を改善したくなったら?
もしかしたら、その修正過程で、あるルーチンだけ記入ミスするかもしれない。
たいだい、同じ処理をしている箇所を全部探すのが大変、書き直すのが大変、長くてみにくい。
長くてみにくいと、そこにバグが生まれる。
だから一箇所にまとめて共通で使ったほうが便利。修正もその一箇所ですむ。
実際にそうすると、もっと様々な利益(効率)があることに気が付くでしょう。
オブジェクト指向はこうやって始まりまりました。
たとえその時は一回しか使わない処理内容でも、区切りのいい場所でわけて関数等にすると良い。
そうすれば、ソースが見やすくなり、どういった処理をしているのか一目でわかり、バグが発生しにくくなる。
これが、オブジェクト指向と呼ばれる考えの原点です。
各処理をオブジェクト(関数等の部品)としてつくり、それらオブジェクトを組み合わせて一連の処理を行う方法です。
これをやりやすくするために、クラスと呼ばれる物が生まれました。
長くなってきて、初心者向きでなくなってきたのでここまでにしておきましょうか。