こんにちは!たわし系エンジニアのユウキといいます。
僕は17年以上プログラミングで飯食っているITエンジニアです。
この記事では、プログラミングを独学で始めたあなたにコメントの大切さをお伝えします。
コーディング(プログラミング)中、こんな症状になりませんか?
コードを書くってことは、日本語をプログラミング言語に翻訳していることと同じなんです。
だったら、その日本語で先にやりたいこと書けばよくね?
そう、解決策はコメントです。
コーディング(プログラミング)のコツ。それは、コメント
プログラムに後付けするコメント
プログラミング初心者のあなたは、そもそも
「コメントを書かない」
ですよね。
昔の僕もそうでした。
コメントを書くようになるのは
「後付けで説明や解説」
の意図で書くコメントが初めだと思います。
エディタが可読性を良くするためコメントとコードで色を変えてくれるじゃないですか。
コードばかりだと読みにくくて、あとでコメントで色付けする。
こんな感じですよね。
この作業も全然必要なんですが、コメントの使い方がこれだけだとコーディング中に
- 今何の処理作ろうとしたんだっけ?
- ここでこの処理しちゃうとまずくないか?
- ifが3つも入れ子になってる。。
なんて症状になっちゃいます。
プログラムに先付けするコメント
コメントの使い方を、もう1つ追加しましょう。
それは
「コードより先にコメントを書く」
です。
コーディングって大体自分のスタイルがあると思います。
- 変数宣言
- 処理の前提作業
- データを取得や、登録する
- 例外処理
ほら、もうこれをコメント化するだけで書きたいコードの道筋が見えますよね?
もうちょっと細かくしつつ、ついでにインデントも加える。
たとえば!
- 変数宣言
- 画面からのパラメータ取得
- パラメータAが○○だった場合の処理
- Bの値を▲▲にする
- パラメータAが××だった場合の処理
- Bの値を△△にする
- 登録処理開始
- トランザクション開始
- Bの値分繰り返し
- データB-nが存在するか確認する
- データB-nがない場合、登録
- データB-nがある場合、更新
- トランザクション終了
- 例外処理
- エラーメッセージを作成
- ロールバック
こんな感じです。
ここまで書けたら、あとはコード書いて完成させるだけ。
プログラミングはコメントで9割終わる
9割は言い過ぎかもしれませんが、でももうできたような気になりますよね。
コメントを先に書くことは、コーディングしたい内容を日本語で考えてそれをまず書き出している作業です。
だから、スラスラかけるんです。
玄人のかたの中には日本語以上にプログラミング言語を使いこなすかたもいますが、それは一旦例外としてください。。
日本語をプログラミング言語に訳す。
これで、体感3倍コーディング(プログラミング)が速くなりますよ!
このあとは、僕ならクエリ(SQL)を3本先に作ります。
確認用、登録用、更新用で3本用意して、それからコメントに沿ってコーディングする。
追加で説明や解説したいところがあればコメントを追加する。
そしたら気づけば、完成!
プログラミング演習!
【問題】バーコード(JAN)のチェックデジットを計算せよ
バーコード用の13桁のJANを自動生成(連番)する関数を作成せよ。
- 13桁固定のインストアコードのため前2桁は99固定とする。
- 3桁目~12桁目はシーケンス「JAN連番」から取得できる値を前0埋めで利用する
- 13桁目のチェックデジットは、計算方法はモジュラス10ウェイト3で計算すること
※シーケンスは自動で+1される前提でよい
※モジュラス10ウェイト3とは
コメントを書く
/*
* バーコード用の13桁のJANを自動生成(連番)
* 戻り値:自動生成した13桁JAN
*/
/* 変数宣言 */
// JAN前2桁固定分
// JANの元
// チェックデジット
// 各桁の合計値
/* JANを生成 */
// シーケンス「JAN連番」より値を取得する
// 頭99+0埋めした12桁のJANの元作成
// チェックデジットを計算する
// 偶数桁は3倍した値、奇数桁はそのままの値を12桁分合計し、
// 10 - 合計結果を10で割った余りの値がチェックデジット
// ただし、チェックデジットが10になる場合は、0に置き換える
// 12桁を1文字ずつ処理
// 奇数桁の場合
// 偶数桁の場合
// チェックデジット計算
// JANを生成して戻り値として返す
コメントに沿ってコーディング
みんな大好きJavaScriptで書きます。
シーケンス取得部分は、「getJanRenban()」で取得できる関数があるものとします。
文字と桁を指定して前0埋めしてくれる関数、「zeroPadding()」があるものとします。
/*
* バーコード用の13桁のJANを自動生成(連番)
* 戻り値:自動生成した13桁JAN
*/
function getJan13() {
/* 変数宣言 */
// JAN前2桁固定分
var jan_head = "99";
// JANの元
var jan_moto = "";
// チェックデジット
var jan_digit = "";
// 各桁の合計値
var sum_keta = 0;
/* JANを生成 */
// シーケンス「JAN連番」より値を取得する
// 頭99+0埋めした12桁のJANの元作成
jan_moto = jan_head + zeroPadding(getJanRenban(), 12);
// チェックデジットを計算する
// 偶数桁は3倍した値、奇数桁はそのままの値を12桁分合計し、
// 10 - 合計結果を10で割った余りの値がチェックデジット
// ただし、チェックデジットが10になる場合は、0に置き換える
// 12桁を1文字ずつ処理
for (var idx=0; idx<12; idx++) {
// 奇数桁の場合
if ((idx+1)%2 == 1) {
sum_keta = sum_keta + parseInt(jan_moto.charAt(idx),10);
// 偶数桁の場合
} else {
sum_keta = sum_keta + 3 * parseInt(jan_moto.charAt(idx),10);
}
}
// チェックデジット計算
jan_digit = 10 - (sum_keta % 10);
// JANを生成して戻り値として返す
return jan_moto + (jan_digit == 10 ? "0" : jan_digit.toString());
}
あとはテストするだけ
実際にこの記事上でコーディングしました。
テストはしてません!
バグはあるかもしれません!
ですが、コーディング自体はかなりスムーズにできるでしょ?
この演習、先付けコメントなしでコーディングだけやったらきっとわけわかんなくなるよ。
まとめ:コメントでコーディング(プログラミング)は3倍速くなる!
少しでもコメントの意識が変わればいいなと思ってこの記事を書きました。
僕自身これに気づいたのは社会人2年目の時です。
有名SIer企業Tでパートナーとして働いてたときに、そこのマネージャから2秒で教えてもらいました。
「ユウキくんさー、まずコメントから書くんだよ。」
懐かしいです。
ちなみにコメントの//か/**/は僕は、/**/派です。
今回は中立で、両方使いました。
余談として、コメントと合わせて、美しい、メンテナンスしやすいコードを書けるようになるには、プログラミングのデザインパターンを学ぶといいですよ。
デザインパターンがある程度頭にあると、少しずつ美しい、メンテナンスしやすいコードが書けるようになるので、一冊興味のあるプログラミング言語のデザインパターン本を手の届くとこに置いておきましょう。
ユウキでした。