- 追加された行はこの色です。
- 削除された行はこの色です。
ここでは,プログラミングの作法について述べます.
* 意味のある変数名を付けましょう! [#hd5b3ac0]
プログラミングを始めたばかりのときには,適当に変数名を付けてしまいがちです.
プログラム言語としては,コンパイルエラーにならない限りは自由に変数名を付けることは可能です.
しかし,プログラムは,人が見ること(見てもらうこと)もありますし,自分で見直すこともよくあります. あまり,適当に付けるとあとで,その変数に何が入っているのかわからなくなり,
デバッグなどのプログラムの不具合をさがすときに,問題発見に時間が掛かってしまう原因となります.
会社などでは,一人でプログラムを書くことはめったになく,チームで開発しますし, 数年〜数10年と保守が続くこともあります.
私が,これまで見た中で,一番びっくりしたのは,自分の好きな歌手の名前が変数名の プログラムでした.
コメントを見るまでは,本人に聞くまでその変数が何の役目をしているのかさっぱりわかりません.
命名規則はいろいろあり,会社などでも決まっている場合もあります.
下記はJava言語の命名規則がでています.
真似て名前を決めてみるのもいいとおもいます. [[Java言語の命名規則: http://qiita.com/konnobu/items/1b30daf83854fecbb814]]
真似て名前を決めてみるのもいいとおもいます. [[Java言語の命名規則:http://qiita.com/konnobu/items/1b30daf83854fecbb814]]
* インデントを付けましょう! [#a81bac80]
プログラムを書くときには,読みやすいようにインデント(字下げ)をします.
インデントは,簡単にいうと「{」と「}」の対応関係です.
インデントは無くても,プログラムはコンパイル出来ますし,ちゃんと動きます.
しかし,プログラムは,人が見ること(見てもらうこと)もありますし,自分で見直すこともよくあります. インデントがないと,ちょっと複雑なプログラムは,if文やfor文などの範囲がわからなくなり,
例えば,デバッグなどのプログラムの不具合をさがすときに,問題発見に時間が掛かってしまう原因となります.
↑
わかりにくい例 †
public class Hello {
public static void main(String[] args) {
System.out.println("Hello");
}
}
** わかりにくい例 [#qe0101f3]
↑
わかりやすい例 †
public class Hello {
public static void main(String[] args) {
System.out.println("Hello");
}
}
public class Hello {
public static void main(String[] args) {
System.out.println("Hello");
}
}
** わかりやすい例 [#f0cb3ce1]
public class Hello {
public static void main(String[] args) {
System.out.println("Hello");
}
}
あんまりさ差が分かりませんね.
それでは,もう少し,大きなプログラムの一部を示します.
↑
わかりにくい例 †
public void mouseClicked(MouseEvent e) {//ボタンをクリックしたときの処理
if(myTurn == myColor) {
JButton theButton = (JButton)e.getComponent();//クリックしたオブジェクトを得る.型が違うのでキャストする
String theArrayIndex = theButton.getActionCommand();//ボタンの配列の番号を取り出す
Icon theIcon = theButton.getIcon();//theIconには,現在のボタンに設定されたアイコンが入る
int index = Integer.parseInt(theArrayIndex);
if(theIcon == boardIcon) {
int y = index / 8; //ボタンの基準位置
int x = index % 8;
if(judgeButton(y, x)) { //配置可である場合
//送信情報を作成する(受信時には,この送った順番にデータを取り出す.スペースがデータの区切りとなる)
String msg = "PLACE "+theArrayIndex+" "+myColor;
//サーバに情報を送る
out.println(msg);//送信データをバッファに書き出す
out.flush();//送信データをフラッシュ(ネットワーク上にはき出す)する
repaint();//画面のオブジェクトを描画し直す
} else {
System.out.println("そこには配置できません");
}
} else if(index == 64) {
myPass++;
String msg = "PASS "+myColor;
out.println(msg);
out.flush();
repaint();
}
} else {
System.out.println("相手のターンです");
}
}
** わかりにくい例 [#c22eae0c]
public void mouseClicked(MouseEvent e) {//ボタンをクリックしたときの処理
if(myTurn == myColor) {
JButton theButton = (JButton)e.getComponent();//クリックしたオブジェクトを得る.型が違うのでキャストする
String theArrayIndex = theButton.getActionCommand();//ボタンの配列の番号を取り出す
Icon theIcon = theButton.getIcon();//theIconには,現在のボタンに設定されたアイコンが入る
int index = Integer.parseInt(theArrayIndex);
if(theIcon == boardIcon) {
int y = index / 8; //ボタンの基準位置
int x = index % 8;
if(judgeButton(y, x)) { //配置可である場合
//送信情報を作成する(受信時には,この送った順番にデータを取り出す.スペースがデータの区切りとなる)
String msg = "PLACE "+theArrayIndex+" "+myColor;
//サーバに情報を送る
out.println(msg);//送信データをバッファに書き出す
out.flush();//送信データをフラッシュ(ネットワーク上にはき出す)する
repaint();//画面のオブジェクトを描画し直す
} else {
System.out.println("そこには配置できません");
}
} else if(index == 64) {
myPass++;
String msg = "PASS "+myColor;
out.println(msg);
out.flush();
repaint();
}
} else {
System.out.println("相手のターンです");
}
}
↑
わかりやすい例 †
** わかりやすい例 [#qca51863]
public void mouseClicked(MouseEvent e) {//ボタンをクリックしたときの処理
if(myTurn == myColor) {
JButton theButton = (JButton)e.getComponent();//クリックしたオブジェクトを得る.型が違うのでキャストする
String theArrayIndex = theButton.getActionCommand();//ボタンの配列の番号を取り出す
Icon theIcon = theButton.getIcon();//theIconには,現在のボタンに設定されたアイコンが入る
int index = Integer.parseInt(theArrayIndex);
if(theIcon == boardIcon) {
int y = index / 8; //ボタンの基準位置
int x = index % 8;
if(judgeButton(y, x)) { //配置可である場合
//送信情報を作成する(受信時には,この送った順番にデータを取り出す.スペースがデータの区切りとなる)
String msg = "PLACE "+theArrayIndex+" "+myColor;
//サーバに情報を送る
out.println(msg);//送信データをバッファに書き出す
out.flush();//送信データをフラッシュ(ネットワーク上にはき出す)する
repaint();//画面のオブジェクトを描画し直す
} else {
System.out.println("そこには配置できません");
}
} else if(index == 64) {
myPass++;
String msg = "PASS "+myColor;
out.println(msg);
out.flush();
repaint();
}
} else {
System.out.println("相手のターンです");
}
}
この例くらいだと,どの部分がif文の範囲かが,インデントを付けると分かりやすくなっていると思います.
インデントの付け方は,何種類かありますが,上記の例が一般的でしょうか.
また,タブのサイズ(空白何文字分かが,言語によって推奨?があります)
Javaの場合は,インデントは空白4文字分が多いようですね.
インデントの書き方.key.png
#ref(インデントの書き方.key.png,,25%)
Google Java Styleコーディング規約
↑
意味のあるコメントを書きましょう! †
[[Google Java Styleコーディング規約:https://kazurof.github.io/GoogleJavaStyle-ja/]]
* 意味のあるコメントを書きましょう! [#w31eb7e4]
コメントは,プログラムの説明です.自分で書いたプログラムなら説明がなくても大丈夫だと思っていませんか?
あるいは,見れば(読めば)わかるプログラムに,わざわざ説明を付けるのは冗長だと思っていませんか?
コメント文はプログラムと無関係なので,コメントが無くても問題なくプログラムは実行できます.
しかし,プログラムは,人が見ること(見てもらうこと)もありますし,自分で見直すこともよくあります. コメントがないと,ちょっと複雑なプログラムは,なぜそのような書き方をしているかなどがわからなくなります.
例えば,デバッグなどのプログラムの不具合をさがすときに,問題発見に時間が掛かってしまう原因となります.
人が書いたプログラムはもちろん,自分が書いたプログラムでさえ,なぜそのようなことを書いているのかが,
分からなくなります. 私自身のことですが,1998年時に書いたコードをいまだに,改良することがあります.
実は,コメントには,良いコメントと悪い?(役に立たない)コメントがあります.
↑
悪いコメント?の例 †
System.out.println("Hello");//Helloを出力
** 悪いコメント?の例 [#h523333e]
System.out.println("Hello");//Helloを出力
Helloを出力しているということは,コードをみればわかります. わざわざ日本語に翻訳する必要はないかもしれません.
ただし,講義や演習などでは,教育目的で,そのようなコメントを書くこともありますので,
「絶対悪いコメント」というわけではないとは思います.
一般的には,そのコードが何をしているか(What)は不要な場合が多いです.
コメントには,自分や他人へのメモ的な使い方のコメントがあります.
↑
コメントの例 †
//●●を使うのは勝手にエンコーディグされないようにするため
** コメントの例 [#b17027c6]
//●●を使うのは勝手にエンコーディグされないようにするため
通常は,別のもっと簡単な方法があるのに,わざわざこの書き方をしている理由を説明しています.
//もし,1文字目に「っ」が含まれていたら特殊なので注意する
//もし,1文字目に「っ」が含まれていたら特殊なので注意する
ぱっと見たときに意味が分からない処理をしてい場合に,この書き方をしている理由を説明しています.
//なぜかこれを追加したことでうまくいった
//なぜかこれを追加したことでうまくいった
将来の自分宛?他人宛のメモとして,残す場合の例です.
//高速化できるはず
//高速化できるはず
自分の書いたコードの問題点を残しておくなど,将来的なメモなどにも使います.
コメントの書き方には,明確にきまったルールはないのですが, 上記を参考にしながら,将来の自分?や他人に向けたコメント書きましょう!
↑
分かりやすいコードを書きましょう! †
* 分かりやすいコードを書きましょう! [#j5b1a5e0]
プログラムは繰り返しが得意です. 繰り返し作業があったら,for や whileなどをつかったり,
関数で纏めたりしたほうが,修正がらくになり,
不具合などの問題も減ります.
下記の2つの例は同じ結果がでますが,同じコード繰り返し書いているので,冗長(ムダ)です.
もし,出力の形式を[No.]ではなくて,[番号] に変更するなどを考えたときに,
「わかりにくい例」は4カ所の修正が必要ですが,「わかりやすい例」は1カ所の修正ですみます..
↑
わかりにくい例 †
class NoLoopTest {
public static void main(String[] args) {
int i = 0;
System.out.print("No.");
System.out.println(i);
i=1;
System.out.print("No.");
System.out.println(i);
i=2;
System.out.print("No.");
System.out.println(i);
i=3;
System.out.print("No.");
System.out.println(i);
i=4;
System.out.print("No.");
System.out.println(i);
}
}
** わかりにくい例 [#feb512bb]
↑
わかりやすい例 †
class NoLoopTest {
public static void main(String[] args) {
int i = 0;
System.out.print("No.");
System.out.println(i);
i=1;
System.out.print("No.");
System.out.println(i);
i=2;
System.out.print("No.");
System.out.println(i);
i=3;
System.out.print("No.");
System.out.println(i);
i=4;
System.out.print("No.");
System.out.println(i);
}
}
class ForLoopTest {
public static void main(String[] args) {
for (int i=0; i<=4; i++) {
System.out.print("No.");
System.out.println(i);
}
}
}
** わかりやすい例 [#j9408da5]
class ForLoopTest {
public static void main(String[] args) {
for (int i=0; i<=4; i++) {
System.out.print("No.");
System.out.println(i);
}
}
}
よく言われるのが,似ようなプログラムを書く場合には, 関数として1つにできないかなどを検討します.