プログラム読めるけど書けない人へ　１０の心得

#<font color="009F8C">**心得１　作りたいものを作る**</font>

簡単な問題集をたくさん問いても対して効果はない。
ひたすら千切りの練習を続けるようなもの。
千切りの練習よりも、<font color="red">まずくてもいいから一品</font>作ろう。

#<font color="009F8C">**心得２　できるものから作る**</font>

いきなりクラスをたくさん作ろうとか考えない。

1. とりあえずmain関数の中で書いてみる。
2. 10行くらい書いたら分けられそうな処理を探す。
3. 分けられそうな処理があったらメソッドにわけてみる。
4. 1〜3を繰り返す。
5. メソッドが増えてきたらクラスに分けられないか考える

メソッドやクラスはものが増えてきたときに整理するためのもの。
整理するものがないのにメソッドやクラスを増やしても
何を整理すればいいかわからずに混乱するだけ。

#<font color="009F8C">**心得３　自分がわかりやすい書き方で書く**</font>

```java
public class Main {

	public static void main(String[] args) {
		
		int a = 1000;
		
		// 変数aが0〜100の間におさまるような処理を書いてみる
	}
}
```


例えばこんなお題があった場合

```java

public class Main {

	public static void main(String[] args) {
		
		int a = 1000;
		
		// 変数aが0〜100の間におさまるような処理を書いてみる
		
		// aが0より小さい数の場合は0にする
		if(a < 0) {
			a = 0;
		}
		
		// aが100を超える場合は100にする
		if(100 < a) {
			a = 100;
		}
	}
}
```

まずはここまで書けるようになろう。

#<font color="009F8C">**心得４　10行超えたら整理できないか考えてみる**</font>

```java
public class Main {

	public static void main(String[] args) {
		
		int a = 1000;
		
		// 変数aが0〜100の間におさまるような処理を書いてみる
		int result = clamp(a);

	}
	
	// 整数を与えると、0から100の間におさめる。
	// 0から100で挟み込む(clampする)というイメージでclampと命名
	static int clamp(int num) {
		
		// aが0より小さい数の場合は0にする
		if(num < 0) {
			num = 0;
		}
		
		// aが100を超える場合は100にする
		if(100 < num) {
			num = 100;
		}
		
		return num;
	}
}
```

<font color="red">数値を0〜100の間になるようにするという処理</font>
これが分離できそうなので分離する。


分離した事で<font color="red">ソースコード全体の行数は増加</font>
そのかわり

- main側がスッキリした
- 数値を0〜100の間になるようにするスキルを手に入れた


#<font color="009F8C">**心得５　結果を変えずに短くできないか検討する**</font>

コードを短くすることは正義！
とは言わないが、全体的にコードが長いというのは割とストレス。(主にスクロールがめんどくさくなる)

読みにくくなるくらいなら、長くても読みやすいコードを書く方が好き党の人間だが
ちょっと読めばわかるよね程度の処理なら短くした方が美しい(と思う)

```Java

public class Main {

	public static void main(String[] args) {
		
		int a = 1000;
		
		// 変数aが0〜100の間におさまるような処理を書いてみる
		int result = clamp(a);
	}
	
	// 整数を与えると、0から100の間におさめる。
	static int clamp(int num)
	{	
		if(num < 0)   num = 0;   // 0未満にしない
		if(100 < num) num = 100; // 100は超えない
		return num;
	}
}
```

この一手間はのちに
<font color="red">人生のうちスクロールをしていた時間を劇的に短くする</font>という効果をもたらす。


#<font color="009F8C">**心得６　具体的すぎる処理は汎用的にできないか検討する**</font>

**0から100の間になるようにする**
これはとても具体的な処理だ。
具体的すぎて汎用性がない。

**0から100の間になるようにする**
ではなくて
**最小値から最大値の間になるようにする**
など

どうしたら汎用的になるかを考える。


ちなみに私は具体的なものを作ってから、汎用的にできないかと考える。
この<font color="red">汎用的にする能力</font>がとても大事。

これができたらプログラミングのいろはを習得したと言ってもいい。

さて、汎用的なものと言えばなんだろうか

はい、<font color="red">**変数**</font>です。

0 →　最小値　→ int min
100 →　最大値　→ int max

というわけで整数リテラルだったところを変数に変えましょう。

```diff
public class Main {

	public static void main(String[] args) {

		int a = 1000;

		// 変数aが0〜100の間におさまるような処理を書いてみる
-		int result = clamp(a);
+		int result = clamp(a, 0, 100);
	}

	// 整数を与えると、0から100の間におさめる。
-	static int clamp(int num)
+	static int clamp(int num, int min, int max)
	{
-		if(num < 0)   num = 0;   // 0未満にしない
+		if(num < min) num = min;   // min未満にしない
-		if(100 < num) num = 100; // 100は超えない
+		if(max < num) num = max; // maxは超えない
		return num;
	}
}
```
赤部分は元のコード
緑部分が書き直したコード

最小値と最大値を固定値から変数に変更。
さらにメソッドの引数に最小値、最大値を指定できるようにする事で汎用的になりファンタスティック。


#<font color="009F8C">**心得7　簡単な方がいいに決まっている**</font>

メソッドだけでも上手く使えばとてもシンプルに整理する事ができる。

クラス、継承、インスタンス変数、クラス変数、クラスメソッド、抽象クラス、インターフェース、パッケージ
などなど

プログラム言語には様々な道具は存在するが
使わないで済むなら使わない方が単純で簡単に決まっている。

これらは全て複雑なものを整理するための道具にすぎない。
メリットがわからない　＝　必要性がわからない

必要と思ってないのに無理に使おうとするから難しいと感じるだけである。
まずは必要になるくらいのコードを書くべし

#<font color="009F8C">**心得８　設計に正解や終わりはない**</font>

どんなに素敵なコードを書いたとしても
これで完璧というコードなんてない(と思っておこう)

より良いものを求めるからこそ実力が磨かれる。
これでいいと思ったら衰退の始まり。
注意されたし。

#<font color="009F8C">**心得９　人は忘れる生き物**</font>

人から聞いた話なんて数秒後には半分消えてる。
プログラムだって、何度書いてもすぐに忘れる。

だから人はメモをとる。
プログラムのコードも同じ。

QiitaやGitHubなど、使えそうなコードはどこかに残しておこう。
覚えることより、探せば見つかる場所に置く努力をしよう。

技術を蓄積する場所は脳みそじゃない、クラウドだ。

#<font color="009F8C">**心得１０　わかると楽しい**</font>

プログラムがわからないと殺意の波動に目覚めそうになるけど
わかるようになると非常に面白い。