こんにちは、堀井です。
今の会社に入って半年経ちました。
ようやく有給が付与されましたが、1年で5日間の取得義務があるため早めに取得予定日を教えてほしいと会社から言われています。
SESで働いているので先方が忙しくない時を狙いたいですが、果たしていつだ・・・?
さて現在のSES先では5カ月経ち、何とか先輩の喋っている内容も理解できてきました。
業界用語かIT系一般用語かも分からない単語がバンバン出てくるので、未だに分からないことだらけです。
とはいえ多少でも仕事ができるようになると徐々にお仕事が割り振られますので、ここ最近はソースコードと仕様書を並べてにらめっこする日々を送っています。
ただ、プログラミングをまともに始めて1年も経っていない私にとってはソースの解読が非常に難しい。
そんな時に役に立つのが先人の残した(遺した?)コメントです。
大規模なプロジェクトだけあって書き方もある程度統一されていて見やすいです*1。
今日はそんなコメントの書き方や分かりやすさについて少しだけ書いてみたいと思います。
訓練校で勉強をしていたころは「とにかく行数が少なく容量が1byteでも少なければ良いのではないか」だなんてことを考えていました。
確かに同じ処理を10回も20回も書くくらいならば、関数を1つ用意してそれを10回20回と呼び出せばいいです。
ですので、物によってはこの考え方は間違いないです。
ただし多人数でプログラムを書く場合や、1人で書くとしても長期間に渡りコードを編集する場合*2は、書き方を統一させるためにわざと無駄な書き方をすることもあるようです。
例えばC言語であれば
#include <stdio.h> #define LOSE ( 0 ) #define WIN ( 1 ) enum{ STONE, SCISSORS, PAPER }; unsigned char isVictory ( int left, int right ){ int num = left - right; int result; if( num == -1 || num == 2 ){ result = WIN; } return result; } int main ( int argc, char const* argv[] ){ int result; int me = STONE; int enemy = PAPER; result = isVictory( me, enemy ); result == WIN ? printf("勝ちです") : printf("勝ちではありません"); return 0; }
こんな感じでしょうか。
確かにこの程度の長さ(= 33行)でしたら簡単に読めてしまいますが、仕事で使うソースファイルは数千~数万行のファイルが数千個とありますのでとても無理です。
参考演算子は滅びていいです。
そこで適宜コメントを付けて、関数内の表記も統一するとこんな感じになります。
/**********************************************/ /* */ /* Include Declaration */ /* */ /**********************************************/ #include <stdio.h> /**********************************************/ /* */ /* Define Declaration */ /* */ /**********************************************/ #define LOSE ( 0 ) #define WIN ( 1 ) /**********************************************/ /* */ /* EnumeratedTypeDeclaration */ /* */ /**********************************************/ enum{ STONE = 0, /* グー */ SCISSORS, /* チョキ */ PAPER /* パー */ }; /**********************************************/ /* */ /* Prototype Declaration */ /* */ /**********************************************/ unsigned char isVictory ( int left, int right ); /**********************************************/ /* */ /* Main Function */ /* */ /**********************************************/ int main ( int argc, char const* argv[] ){ int result; int me; int enemy; result = LOSE; me = STONE; enemy = PAPER; result = isVictory( me, enemy ); if ( result == WIN ){ printf("勝ちです"); }else{ printf("勝ちではありません"); } return 0; } /**********************************************/ /* */ /* Function Name: */ /* isVictory */ /* Function Target: */ /* 勝ち負けを判定する */ /* Argument: */ /* left : 自分の手 */ /* right : 相手の手 */ /* Return Value: */ /* 勝敗の結果 */ /* */ /**********************************************/ unsigned char isVictory ( int left, int right ){ int num; int result; num = left - right; result = LOSE; if( num == -1 || num == 2 ){ result = WIN; } return result; }
どうでしょうか。
プログラミング言語が読めない方でも何となくアルゴリズムが分かるのではないのでしょうか。
そんなコメントの大切さを、個人で遊びながら作っているソースコードを読みながら痛感しています。
過去の自分め・・・よく分からない処理書きやがって・・・。
となっていますので、個人でしかプログラムを書かない方も読みやすさを重視したコードを書いてくださいね・・・。
それではまた次回。