Edited at

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

More than 1 year has passed since last update.


心得1 作りたいものを作る

簡単な問題集をたくさん問いても対して効果はない。

ひたすら千切りの練習を続けるようなもの。

千切りの練習よりも、まずくてもいいから一品作ろう。


心得2 できるものから作る

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


  1. とりあえずmain関数の中で書いてみる。

  2. 10行くらい書いたら分けられそうな処理を探す。

  3. 分けられそうな処理があったらメソッドにわけてみる。

  4. 1〜3を繰り返す。

  5. メソッドが増えてきたらクラスに分けられないか考える

メソッドやクラスはものが増えてきたときに整理するためのもの。

整理するものがないのにメソッドやクラスを増やしても

何を整理すればいいかわからずに混乱するだけ。


心得3 自分がわかりやすい書き方で書く

public class Main {

public static void main(String[] args) {

int a = 1000;

// 変数aが0〜100の間におさまるような処理を書いてみる
}
}

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


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;
}
}
}

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


心得4 10行超えたら整理できないか考えてみる

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;
}
}

数値を0〜100の間になるようにするという処理

これが分離できそうなので分離する。

分離した事でソースコード全体の行数は増加

そのかわり


  • main側がスッキリした

  • 数値を0〜100の間になるようにするスキルを手に入れた


心得5 結果を変えずに短くできないか検討する

コードを短くすることは正義!

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

読みにくくなるくらいなら、長くても読みやすいコードを書く方が好き党の人間だが

ちょっと読めばわかるよね程度の処理なら短くした方が美しい(と思う)


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;
}
}

この一手間はのちに

人生のうちスクロールをしていた時間を劇的に短くするという効果をもたらす。


心得6 具体的すぎる処理は汎用的にできないか検討する

0から100の間になるようにする

これはとても具体的な処理だ。

具体的すぎて汎用性がない。

0から100の間になるようにする

ではなくて

最小値から最大値の間になるようにする

など

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

ちなみに私は具体的なものを作ってから、汎用的にできないかと考える。

この汎用的にする能力がとても大事。

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

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

はい、変数です。

0 → 最小値 → int min

100 → 最大値 → int max

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

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;
}
}

赤部分は元のコード

緑部分が書き直したコード

最小値と最大値を固定値から変数に変更。

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


心得7 簡単な方がいいに決まっている

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

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

などなど

プログラム言語には様々な道具は存在するが

使わないで済むなら使わない方が単純で簡単に決まっている。

これらは全て複雑なものを整理するための道具にすぎない。

メリットがわからない = 必要性がわからない

必要と思ってないのに無理に使おうとするから難しいと感じるだけである。

まずは必要になるくらいのコードを書くべし


心得8 設計に正解や終わりはない

どんなに素敵なコードを書いたとしても

これで完璧というコードなんてない(と思っておこう)

より良いものを求めるからこそ実力が磨かれる。

これでいいと思ったら衰退の始まり。

注意されたし。


心得9 人は忘れる生き物

人から聞いた話なんて数秒後には半分消えてる。

プログラムだって、何度書いてもすぐに忘れる。

だから人はメモをとる。

プログラムのコードも同じ。

QiitaやGitHubなど、使えそうなコードはどこかに残しておこう。

覚えることより、探せば見つかる場所に置く努力をしよう。

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


心得10 わかると楽しい

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

わかるようになると非常に面白い。