回答編集履歴
2
流れや文章を少しずつ修正しました
answer
CHANGED
@@ -6,8 +6,13 @@
|
|
6
6
|
文章として読んだ時にそれが最も自然でシンプルなあるべき姿なのでしょうか?
|
7
7
|
もしYesと言い切れるのなら変える必要はありません。
|
8
8
|
|
9
|
+
ですが……そのコードは自然でシンプルなのですか?本当に?何を根拠に言ってるの?
|
10
|
+
こういう風に詰められるとだんだん不安になってきますね。
|
11
|
+
|
9
12
|
どうすれば良いかの勘所は[リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)という書籍を読めば身につきます。
|
13
|
+
どんなにロジカル人のコードでもこれを読んでない人のコードは品質がバラツキます。
|
10
14
|
この書籍を読んだ人のコードはとても読みやすく、共通部品を取り出すとはなんなのかが分かりますので、長いエンジニア人生で一番役に立つ書籍となるだろうと言っても過言ではありません。
|
15
|
+
ただし序盤はともかく終盤は難解ですので、まずは読める範囲までで良いので繰り返し読んでくださいね。
|
11
16
|
|
12
17
|
---
|
13
18
|
|
@@ -21,36 +26,43 @@
|
|
21
26
|
|
22
27
|
---
|
23
28
|
|
24
|
-
まず、プログラミングは
|
29
|
+
まず、オブジェクト指向に限らず、プログラミングに於いては以下の流れを守ってください。
|
25
30
|
|
26
31
|
1. 入力(必要な情報の収集) + 加工(入力値を処理しやすくする)
|
27
32
|
2. 処理
|
28
33
|
3. 出力(結果を画面なりファイルなりへ書き出す)
|
29
34
|
|
30
|
-
この
|
35
|
+
この一連の流れは全てが終わるまで、絶対に次へ行かないでください。
|
31
36
|
質問文のコードが「共通・非共通・共通・非共通・共通」の流れになってしまうのは、
|
32
|
-
|
37
|
+
殆どのケースに於いて1→3の流れを守れずに小出しにしているからです。
|
33
38
|
|
39
|
+
また「少しの情報を受け取って処理することを繰り返す」のも、
|
34
|
-
全ての
|
40
|
+
「全ての情報を受け取ってまとめて処理する」のも全体的な処理時間は変わりません。
|
35
|
-
ただし、この手順を崩さなければ処理速度面で困るケースが発生することもあります。
|
36
|
-
|
41
|
+
例外が出たらその時はその時で悩んでください。
|
37
42
|
|
43
|
+
---
|
44
|
+
|
38
45
|
次にコードに対して大まかな名前を付けてください。
|
39
|
-
まずゴール(あるべき姿)はなんですか?そのまま名称にして、クラス名や関数名として利用
|
46
|
+
まずゴール(あるべき姿)はなんですか?そのまま名称にして、クラス名や関数名として利用できます。
|
40
|
-
次に達成条件を箇条書きにしてください。
|
41
47
|
|
48
|
+
達成条件も箇条書きにしてください。
|
49
|
+
これらの達成条件も個別に関数名やクラスのメソッド名等に使えます。
|
42
|
-
達成条件はどんなケースでも達成しなければならないのでしょうか?
|
50
|
+
また、達成条件は「どんなケースでも達成しなければならないのでしょうか?」
|
43
|
-
|
51
|
+
「スイッチをONにした時だけ達成出来れば良いのですか?」なども予め考えて置くと捗ります。
|
44
52
|
|
53
|
+
---
|
54
|
+
|
55
|
+
ここでやってオブジェクト指向プログラミングのターンです。
|
56
|
+
|
45
57
|
情報の収集・加工が済んだら処理に必要なデータを、クラスに投げ込んでインスタンスを作ってください。
|
46
58
|
別の処理を挟みたいなら、オプショナルな条件のメソッドを用意してONにするようにしてください。
|
47
59
|
全てのデータを投げ込み終わったら、作ったインスタンスのstartメソッドを叩いて結果を待ちましょう。
|
48
60
|
|
61
|
+
---
|
62
|
+
|
49
63
|
この流れで統一するようにすれば、
|
50
|
-
何をまとめられそうか、何をまとめるのが無理そうかが一目で区別出来るようにな
|
64
|
+
何をまとめられそうか、何をまとめるのが無理そうかが一目で区別出来るようになってきます。
|
51
65
|
|
52
|
-
---
|
53
|
-
|
54
66
|
最初は何千行もの神クラスを作り込んだりして酷いコードになると思います。
|
55
67
|
[オブジェクト指向プログラミング](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91)の腕が上がってくれば、比例して読みやすく抽象化された素晴らしいコードが書けるようになるはずです。
|
56
68
|
|
1
校正しました
answer
CHANGED
@@ -2,25 +2,18 @@
|
|
2
2
|
コードは、機械が逐次処理をしていく命令文の羅列であると同時に、人間が読んで修正するべき文章です。
|
3
3
|
この後者の部分は意識してください。
|
4
4
|
|
5
|
-
長ったらしい変なコードの羅列は、何かタイトルを付けてインデックス付きでどっか別の箇所に飛ばしてください。
|
6
|
-
これをサブルーチン化、関数化と呼びます。
|
7
|
-
歌詞の「*繰り返し」と同じようなもんです。
|
8
|
-
|
9
5
|
質問文の共通、非共通と並んでいる箇所ですが、
|
10
6
|
文章として読んだ時にそれが最も自然でシンプルなあるべき姿なのでしょうか?
|
11
|
-
もしYesと言い切れるのなら
|
7
|
+
もしYesと言い切れるのなら変える必要はありません。
|
12
8
|
|
13
|
-
|
14
|
-
この書籍
|
9
|
+
どうすれば良いかの勘所は[リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)という書籍を読めば身につきます。
|
10
|
+
この書籍を読んだ人のコードはとても読みやすく、共通部品を取り出すとはなんなのかが分かりますので、長いエンジニア人生で一番役に立つ書籍となるだろうと言っても過言ではありません。
|
15
11
|
|
16
|
-
--
|
12
|
+
---
|
17
13
|
|
18
14
|
さて、上記前提を元に今回の質問文を更に掘り下げていきます。
|
19
15
|
|
20
|
-
2軸の別々の事をやるプログラムに対して、
|
21
|
-
共通化できそうな所を上手く抽出するのがプログラミングや設計の腕の見せどころです。
|
22
|
-
|
23
|
-
|
16
|
+
質問文を見返すと、「共通・非共通・共通・非共通・共通」となってますね。
|
24
17
|
1行1行の処理に着目しすぎのように思えます。
|
25
18
|
|
26
19
|
オブジェクト指向プログラミングで解決出来そうなので、
|
@@ -30,27 +23,35 @@
|
|
30
23
|
|
31
24
|
まず、プログラミングは出来る限り以下の流れを守ってください。
|
32
25
|
|
33
|
-
1. 入力(必要な情報の収集)
|
34
|
-
|
26
|
+
1. 入力(必要な情報の収集) + 加工(入力値を処理しやすくする)
|
35
|
-
|
27
|
+
2. 処理
|
36
|
-
|
28
|
+
3. 出力(結果を画面なりファイルなりへ書き出す)
|
37
29
|
|
30
|
+
この1〜3の流れは常に全て終わった後に次のフェイズへ移行してください。
|
38
31
|
質問文のコードが「共通・非共通・共通・非共通・共通」の流れになってしまうのは、
|
39
|
-
多くのケースに於いて1→
|
32
|
+
多くのケースに於いて1→3の流れを守れずに小出しにしているからです。
|
33
|
+
|
40
34
|
全てのデータが出揃うまで処理や出力は遅延させるようにしてください。
|
35
|
+
ただし、この手順を崩さなければ処理速度面で困るケースが発生することもあります。
|
36
|
+
多くの場面では1〜3にした位で遅くなる事はありません、その時になって初めて悩んでください。
|
41
37
|
|
42
|
-
次にコードに
|
38
|
+
次にコードに対して大まかな名前を付けてください。
|
43
|
-
まずゴールはなんですか?
|
39
|
+
まずゴール(あるべき姿)はなんですか?そのまま名称にして、クラス名や関数名として利用してください。
|
44
40
|
次に達成条件を箇条書きにしてください。
|
45
41
|
|
46
42
|
達成条件はどんなケースでも達成しなければならないのでしょうか?
|
47
43
|
それとも、スイッチをONにした時だけ達成しなければならないのでしょうか?
|
48
44
|
|
49
|
-
集
|
45
|
+
情報の収集・加工が済んだら処理に必要なデータを、クラスに投げ込んでインスタンスを作ってください。
|
50
46
|
別の処理を挟みたいなら、オプショナルな条件のメソッドを用意してONにするようにしてください。
|
51
|
-
全てのデータを投げ込み終わったら、作ったインスタンスのstartメソッドを叩いて結果を待
|
47
|
+
全てのデータを投げ込み終わったら、作ったインスタンスのstartメソッドを叩いて結果を待ちましょう。
|
52
48
|
|
49
|
+
この流れで統一するようにすれば、
|
50
|
+
何をまとめられそうか、何をまとめるのが無理そうかが一目で区別出来るようになるでしょう。
|
51
|
+
|
52
|
+
---
|
53
|
+
|
53
|
-
最初は何千行もの神クラスを作り込んだりして酷いコードになる
|
54
|
+
最初は何千行もの神クラスを作り込んだりして酷いコードになると思います。
|
54
55
|
[オブジェクト指向プログラミング](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91)の腕が上がってくれば、比例して読みやすく抽象化された素晴らしいコードが書けるようになるはずです。
|
55
56
|
|
56
57
|
例えばDIコンテナという、ある程度の情報を格納しておいたインスタンスをプロパティとして保存するテクニックがあります。
|