質問するログイン新規登録

回答編集履歴

4

誤字の修正

2018/04/22 13:37

投稿

miyabi-sun
miyabi-sun

スコア21554

answer CHANGED
@@ -20,7 +20,7 @@
20
20
  変数巻き上げって同じスコープの下の行で宣言した変数が、
21
21
  上の行でもundefined扱いで取れてしまう意図どおりにならない変な挙動ですよね?
22
22
 
23
- 別にになるケースも殆ど無いですし、
23
+ 別にになるケースも殆ど無いですし、
24
24
  無くてもJavaScriptはチューリング完全ですので使わなくて構いません。
25
25
 
26
26
  > 高階関数のコンテキスト

3

ちゃんと質問タイトル通りに修正

2018/04/22 13:36

投稿

miyabi-sun
miyabi-sun

スコア21554

answer CHANGED
@@ -1,229 +1,42 @@
1
- 関数型プログラミング的な事をやりたいのですか?
2
- もしそうなら、まずは関数にconsole.log使う事やめてください。
1
+ > 再帰関数を引数取りそれ実行する高階関数のコンテキスト変数巻き上げを使わずに変える方法
3
- 値を返さない関数は、函数ではなくサブルーチンです。
4
2
 
5
- 関数型プログラミングは関数を使って引数から入った値を戻り値として受け取る形で値を加工します。
6
- この関数をパーツ片として、レゴを組み立てるように構築るから関数型なのです
3
+ タイトルどおりに回答していきます。
7
4
 
8
- console.logは典型的なサブルチンであり、
5
+ 質問文のコドはあくま参考資料であり、
6
+ 例えば記述してある関数は関数としての要件を満たしていませんので、
9
- 値を返さず標準出力へ文字列を出力するの計算途中込む事は出来せん
7
+ 一旦ノイズということわき追いやって、タイトルのに集中して考えていき
10
- 基本的には最後の最後で使う設計にしましょう。
11
8
 
12
- ---
9
+ > 再帰関数を引数に取り
13
10
 
11
+ 再帰関数はそれ自体が関数なので、引数に取った高階関数は用意すること自体は可能です。
14
- 次に再帰関数ループの戦略を考えていきます。
12
+ 再帰関数はそれ自体がループのような性質であり、
13
+ 間に処理を挟みたいという利用用途やケースがちょっと分かりづらいです。
15
14
 
16
- 再帰関数は間に処理が挟めません。
17
- for文をラッピング関数を用意して
15
+ ろ再帰関数自体が公開関数であるべきで
18
- 「いやー、このfor文の毎回の処理に自作の処理差し込みたいんだよね」って言ってようなものです。
16
+ 加工す関数を引数にとり受け付けるが一般的なプログラミングです。
19
17
 
20
- こうなってしまっては間に何もやりたい事を挟めないので、
21
- 「ループさせない」ようしてください。
18
+ > 変数巻き上げを使わず
22
- 再帰関数も同様で、やりたい事が完成するまでループさせないで下さい。
23
19
 
24
- そしてこれが細分化された理想的な関数のす。
20
+ 巻き上げって同じスコープ下の行宣言した変数が、
25
- 入力値があり、戻り値がある立派な関数です。
26
- っとアレ事を言えば副作用もく参照透過でもある理想的な挙動をしま
21
+ 上の行でundefined扱いで取れてしまう意図どおりにい変な挙動よね?
27
22
 
28
- ```JavaScript
23
+ 別に特になるケースも殆ど無いですし、
29
- const sharp = n => '#'.repeat(n)
30
- console.log(func(5)) // #####
24
+ 無くてもJavaScriptはチューリング完全ですので使わなくて構いません。
31
- ```
32
25
 
33
- 次に新しい機能として罫線とシャープの組み合わせの関数を考えていきます。
34
- 罫線を返すhr関数です。
26
+ > 高階関数のコンテキスト
35
27
 
36
- ```JavaScript
28
+ 変えたい対象は文脈から推測するに、
37
- const hr = () => '-----'
38
- console.log(hr()) // -----
29
+ 再帰関数のコンテキストではなく、高階関数のコンテキストですよね?
39
- ```
30
+ 高階関数は今から作るものなので、お好きなように変えて下さい。
40
31
 
41
- ではこの2つの関数を合成させましょう。
42
- 罫線とシャープを間髪いれずに返すhrAndSharpです(ネーミングセンス皆無)
43
-
44
- ```JavaScript
45
- const sharp = n => '#'.repeat(n)
46
- const hr = () => '-----'
47
- const hrAndSharp = ((sharp, hr) =>
48
- num => [hr(), sharp(num)]
49
- )(sharp, hr)
50
- console.log(hrAndSharp(3)) // ["-----", "###"]
51
-
52
- console.log([1, 2, 3, 4, 5].map(hrAndSharp))
53
- // [
54
- // ["-----", "#"],
55
- // ["-----", "##"],
56
- // ["-----", "###"],
57
- // ["-----", "####"],
58
- // ["-----", "#####"]
59
- // ]
60
- ```
61
-
62
- 5, 4, 3, 2, 1というのは階乗(factorial)というそうですから、
63
- そんな感じの関数をさくっと用意して…
64
-
65
- ```JavaScript
66
- const factorial = (num, result = []) => {
67
- if (num <= 0) return result
68
- result.push(num)
69
- return factorial(num - 1, result)
70
- }
71
- console.log(factorial(5)) // [5, 4, 3, 2, 1]
72
-
73
- const sharp = n => '#'.repeat(n)
74
- const hr = () => '-----'
75
- const hrAndSharp = ((sharp, hr) =>
76
- num => [hr(), sharp(num)]
77
- )(sharp, hr)
78
-
79
- console.log(factorial(5).map(hrAndSharp))
80
- // [
81
- // ["-----", "#####"],
82
- // ["-----", "####"],
83
- // ["-----", "###"],
84
- // ["-----", "##"],
85
- // ["-----", "#"]
86
- // ]
87
- ```
88
-
89
- ここまでいけばあと一息ですね。
90
-
91
- - 2次元配列を1次元配列にする
92
- - 最後に罫線を追加
93
- - まとめて出力
94
-
95
- 2次元配列を1次元配列にするのはfor文や再帰関数でもいけますが、
96
- reduceを使えば一撃です。
97
-
98
- ```JavaScript
99
- // reduceを使って2次元配列を1次元配列に修正してみた
100
- const result = factorial(5).map(hrAndSharp).reduce((arr, it) => {
101
- it.forEach(_ => arr.push(_))
102
- return arr
103
- }, [])
104
- console.log(result)
105
- // ["-----", "#####", "-----", "####", "-----", "###", "-----", "##", "-----", "#"]
106
-
107
- // 出力用関数をおもむろに準備
108
- const output = it => console.log(it)
109
-
110
- // newFuncを作るとこうなる
111
- const newFunc = ((factorial, hrAndSharp) =>
112
- num => {
113
- const results = factorial(5).map(hrAndSharp).reduce((arr, it) => {
114
- it.forEach(_ => arr.push(_))
115
- return arr
116
- }, [])
117
- results.push(hr())
118
- return results
119
- }
120
- )(factorial, hrAndSharp)
121
- newFunc(5).forEach(output)
122
- // -----
123
- // #####
124
- // -----
125
- // ####
126
- // -----
127
- // ###
128
- // -----
129
- // ##
130
- // -----
131
- // #
132
- // -----
133
-
134
- // この場合、元の関数はこういう作りになる
135
- const func = ((factorial, sharp) =>
136
- num => factorial(5).map(sharp)
137
- )(factorial, sharp)
138
- func(5).forEach(output)
139
- // #####
140
- // ####
141
- // ###
142
- // ##
143
- // #
144
- ```
145
-
146
- まぁ、細部は色々ありますが、しっかりパーツ片単位に分解していくとこんな感じがゴールになるかと思います。
147
-
148
- ん?関数作りすぎじゃない?そうかもしれませんね。
149
- 再利用するまでもないようなものは、
150
- どんどんアロー関数化したりしてくっつけていっても良いかと思います。
151
-
152
32
  ---
153
33
 
154
- おまけ: 配列操作を使う
155
-
156
- まぁ高階関数とかご大層な用意がなくても、
157
- JSの標準で用意されている高階関数的なメソッドチェーンで実現できます。
158
-
159
- ```JavaScript
160
- const result = Array(5)
161
- .fill(0)
162
- .map((_, i) => ['-----', '#'.repeat(5 - i)])
163
- .reduce((arr, it) => {
164
- it.forEach(_ => arr.push(_))
165
- return arr
166
- }, [])
167
- result.push('-----')
168
-
169
- console.log(result)
170
- // ["-----", "#####", "-----", "####", "-----", "###", "-----", "##", "-----", "#", "-----"]
171
-
172
- result.forEach(it => console.log(it))
173
- // -----
174
- // #####
175
- // -----
176
- // ####
177
- // -----
178
- // ###
179
- // -----
180
- // ##
181
- // -----
182
- // #
183
- // -----
184
- ```
185
-
186
- もし私ならコードの再利用云々以前にこれを関数に包めて`newFunc`完成です。
187
- この程度の分量なら細分化以前に必要になる度に書いてしまっても良いかなぁと思います。
188
-
189
- 因みに`func`の作り方はこれを使えばワンライナーです。
190
-
191
- ```JavaScript
192
- const result = Array(5)
193
- .fill(0)
194
- .map((_, i) => '#'.repeat(5 - i))
195
- // ["#####", "####", "###", "##", "#"]
196
- ```
197
-
198
- ---
199
-
200
- おまけ: 出力する歳のイディオム
201
-
202
- JavaScriptではつかえませんが、
203
- Node.jsでは`¥n`が改行になります。
204
- なので配列は`arr.join('¥n')`で文字列に加工してしまって一気に吐き出すと、
205
- パフォーマンス的にもかなり良くなり、普通にconsole.logを書きまくるよりも速度が上がります。
206
-
207
- ```JavaScript
208
- const result = ["-----", "#####", "-----", "####", "-----", "###", "-----", "##", "-----", "#", "-----"]
209
- console.log(result.join('¥n'))
210
- // -----¥n#####¥n-----¥n####¥n-----¥n###¥n-----¥n##¥n-----¥n#¥n-----
211
- ```
212
-
213
- ---
214
-
215
34
  まとめ
216
35
 
217
- 実際関数型プログラミングが綺麗らしいと言われますが、
218
- 動けば何でもいい、コードの綺麗さなど知ったことかという人の多くはC系統の命令型プログラミング好みますので、
36
+ > 再帰関数引数に取りそれを実行る高階関数コンテキストを変数巻き上げを使わずに変える方法
219
- 関数型プログラミングの世界に入ってこないだけの話です。
220
37
 
221
- 命令型やってた人間が、ソースの可読性をこだわりぬいた結果、
38
+ 「再帰関数を引数に取り」 → 誰も作れる
222
- 関数型プログラミグに活路見出し門戸を叩くケスも結構多いと聞きます。
39
+ 「それを実行する高階関数のコテキスト変える」 → JavaScriptはチュリング完全なので可能
40
+ 「変数巻き上げを使わず」 → むしろJavaScriptのダメな挙動なので使わない方が良い、もちろん可能
223
41
 
224
- 例え関数型プログラミングを軸にしたとしても、汚い設計やコードは簡単につくれます。
225
- 関数型プログラミングが綺麗というのは、キレイなコードを書くために試行錯誤した前人達の努力の結晶なんですね。
226
-
227
- 今回の回答文では質問文からやりたい事を満たす為のパーツ片の紹介という感じで書きました。
228
- おまけまで含めてもまだまだ考える余地は沢山あるかと思いますので、
229
- 色々と試行錯誤しキレイな形というのを模索しみて下さい
42
+ ての条件論理積で考えた場合、全可能なので可能です

2

考え方のフローを記述するよう変更

2018/04/22 13:36

投稿

miyabi-sun
miyabi-sun

スコア21554

answer CHANGED
@@ -2,111 +2,123 @@
2
2
  もしそうなら、まずは関数にconsole.logを使う事をやめてください。
3
3
  値を返さない関数は、函数ではなくサブルーチンです。
4
4
 
5
- サブルーチンは当然ながら値を返さないので更なる工夫が出来ません。
6
- 関数型プログラミングは細かい関数のパーツ片同士レゴのように組み合わせ機能完成させ手法です。
5
+ 関数型プログラミングは関数を使っ引数から入った値戻り値として受け取値を加工します。
7
- 従って値を返さず、他のパーツと組み合わせ辛いサブルーチンは締め以外は使えません
6
+ 関数をパーツして、レゴを組み立てるように構築するから関数型なの
8
7
 
9
- console.logは値を出力する処理、つまりサブルーチンです。
8
+ console.logは典型的なサブルーチンであり、
10
- ので何かとセットで使う事は難しいのです
9
+ 値を返さず標準出力へ文字列を出力するので計算途中に組み込む事は出来ません
11
- 基本的には最後の最後で使う設計にしてください
10
+ 基本的には最後の最後で使う設計にしましょう
12
11
 
13
12
  ---
14
13
 
15
- 次に再帰関数は間に処理が挟めせん
14
+ 次に再帰関数やループの戦略を考えていき
16
15
 
16
+ 再帰関数は間に処理が挟めません。
17
17
  for文をラッピングした関数を用意して、
18
- 「いやー、このfor文の毎回の処理に自作の処理を差し込みたいんだよね」って言ってるようなものです。
18
+ 「いやー、このfor文の毎回の処理に自作の処理を差し込みたいんだよね」って言ってるようなものです。
19
19
 
20
- 間に処理を挟む事は出来ませんが代替案はあります。
20
+ こうなってしまっては間に何もやりたい事を挟めないので、
21
- 分かりやすいように一つ手段を挙げるなら、
21
+ 「ループさせなようにしてください。
22
- 予め`###`の詰まっ配列を返させた後に、その配列を加工してくという手段しょう
22
+ 再帰関数も同様で、やりい事が完成するまでループさせいで下さい
23
23
 
24
- 見てくれだけ高階関数に出来なくもありませんが、
25
- それは高階関数と呼べるもかは怪しいものです。
24
+ してこが細分化された理想的な関数のです。
26
- (詳しくはおまけを参照してください)
25
+ 入力値があり、戻り値がある立派な関数です。
26
+ (もっとアレな事を言えば副作用もなく参照透過でもある理想的な挙動をします)
27
27
 
28
+ ```JavaScript
29
+ const sharp = n => '#'.repeat(n)
30
+ console.log(func(5)) // #####
28
- ---
31
+ ```
29
32
 
30
- さて、実際書いていきます。
33
+ 新しい機能として罫線とシャプの組み合わせの関数考えていきます。
34
+ 罫線を返すhr関数です。
31
35
 
32
- JavaScriptは配列の加工がわりと得意です。
36
+ ```JavaScript
37
+ const hr = () => '-----'
33
- ですので配列を返す関数を作るようにしてください。
38
+ console.log(hr()) // -----
34
- これがスタートラインです。
39
+ ```
35
40
 
41
+ ではこの2つの関数を合成させましょう。
36
- ※面倒なのでES6で書きますが、アロー関数変数宣言以外はES5のもの利用して移植は楽だと思いま
42
+ 罫線シャープ間髪れずに返hrAndSharpです(ネーミングセンス皆無)
37
- ※JSの`array.push`は破壊的なメソッドなので関数としては欠陥品なのですが、JSで毎回新しく配列を作るとパフォーマンス的な影響がデカイ為、再帰関数の最初の発火時には初期値として`[]`を新しく作る思想で書いて妥協しています。
38
43
 
39
44
  ```JavaScript
45
+ const sharp = n => '#'.repeat(n)
40
- const output = it => console.log(it)
46
+ const hr = () => '-----'
41
- const func = (n, arr = []) => {
47
+ const hrAndSharp = ((sharp, hr) =>
42
- if (n <= 0) return arr
48
+ num => [hr(), sharp(num)]
43
- arr.push('#'.repeat(n))
44
- return func(n - 1, arr)
49
+ )(sharp, hr)
45
- }
50
+ console.log(hrAndSharp(3)) // ["-----", "###"]
46
51
 
47
- console.log(func(5))
52
+ console.log([1, 2, 3, 4, 5].map(hrAndSharp))
48
- // ["#####", "####", "###", "##", "#"]
49
- func(5).forEach(output)
50
- // #####
51
- // ####
52
- // ###
53
- // ##
54
- // #
53
+ // [
54
+ // ["-----", "#"],
55
+ // ["-----", "##"],
56
+ // ["-----", "###"],
57
+ // ["-----", "####"],
58
+ // ["-----", "#####"]
59
+ // ]
55
60
  ```
56
61
 
62
+ 5, 4, 3, 2, 1というのは階乗(factorial)というそうですから、
57
- 次、配列を取る関数として作りましょう。
63
+ そんな感じの関数をさくっ用意して
58
64
 
59
65
  ```JavaScript
60
- const output = it => console.log(it)
61
- const func = (n, arr = []) => {
66
+ const factorial = (num, result = []) => {
62
- if (n <= 0) return arr
67
+ if (num <= 0) return result
63
- arr.push('#'.repeat(n))
68
+ result.push(num)
64
- return func(n - 1, arr)
69
+ return factorial(num - 1, result)
65
70
  }
66
- const newFunc = (hr, arr, result = []) => {
71
+ console.log(factorial(5)) // [5, 4, 3, 2, 1]
67
- result.push(hr)
68
- if (arr.length === 0) return result
69
- result.push(arr[0])
70
- return newFunc(hr, arr.slice(1), result)
71
- }
72
72
 
73
+ const sharp = n => '#'.repeat(n)
73
- console.log(newFunc('-----', func(5)))
74
+ const hr = () => '-----'
74
- // ["-----", "#####", "-----", "####", "-----", "###", "-----", "##", "-----", "#", "-----"]
75
+ const hrAndSharp = ((sharp, hr) =>
76
+ num => [hr(), sharp(num)]
77
+ )(sharp, hr)
78
+
75
- newFunc('-----', func(5)).forEach(output)
79
+ console.log(factorial(5).map(hrAndSharp))
76
- // -----
77
- // #####
78
- // -----
79
- // ####
80
- // -----
81
- // ###
82
- // -----
83
- // ##
84
- // -----
85
- // #
80
+ // [
81
+ // ["-----", "#####"],
82
+ // ["-----", "####"],
83
+ // ["-----", "###"],
84
+ // ["-----", "##"],
85
+ // ["-----", "#"]
86
- // -----
86
+ // ]
87
87
  ```
88
88
 
89
- ---
89
+ ここまでいけばあと一息ですね。
90
90
 
91
+ - 2次元配列を1次元配列にする
91
- おまけ: 高階関数使う
92
+ - 最後に罫線追加
93
+ - まとめて出力
92
94
 
93
- 初期のfunc関数を配列をようなもなく、単機能にしぼりしょう。
95
+ 2次元配列を1次元配列にのはfor文や再帰関数でもいけすが、
94
- ちょっとスマートさに欠ける気がしますが、色々と改良きそうではあります。
96
+ reduceを使えば一撃です。
95
97
 
96
98
  ```JavaScript
99
+ // reduceを使って2次元配列を1次元配列に修正してみた
100
+ const result = factorial(5).map(hrAndSharp).reduce((arr, it) => {
101
+ it.forEach(_ => arr.push(_))
102
+ return arr
103
+ }, [])
104
+ console.log(result)
105
+ // ["-----", "#####", "-----", "####", "-----", "###", "-----", "##", "-----", "#"]
106
+
107
+ // 出力用関数をおもむろに準備
97
108
  const output = it => console.log(it)
98
- const hr = () => '-----'
99
- const func = n => '#'.repeat(n)
100
- const newFunc = (hr, fn, n, arr = []) => {
101
- arr.push(hr())
102
- if (n <= 0) return arr
103
- arr.push(fn(n))
104
- return newFunc(hr, fn, n - 1, arr)
105
- }
106
109
 
110
+ // newFuncを作るとこうなる
111
+ const newFunc = ((factorial, hrAndSharp) =>
112
+ num => {
113
+ const results = factorial(5).map(hrAndSharp).reduce((arr, it) => {
107
- console.log(newFunc(hr, func, 5))
114
+ it.forEach(_ => arr.push(_))
115
+ return arr
116
+ }, [])
117
+ results.push(hr())
118
+ return results
119
+ }
108
- // ["-----", "#####", "-----", "####", "-----", "###", "-----", "##", "-----", "#", "-----"]
120
+ )(factorial, hrAndSharp)
109
- newFunc(hr, func, 5).forEach(output)
121
+ newFunc(5).forEach(output)
110
122
  // -----
111
123
  // #####
112
124
  // -----
@@ -118,22 +130,36 @@
118
130
  // -----
119
131
  // #
120
132
  // -----
133
+
134
+ // この場合、元の関数はこういう作りになる
135
+ const func = ((factorial, sharp) =>
136
+ num => factorial(5).map(sharp)
137
+ )(factorial, sharp)
138
+ func(5).forEach(output)
139
+ // #####
140
+ // ####
141
+ // ###
142
+ // ##
143
+ // #
121
144
  ```
122
145
 
146
+ まぁ、細部は色々ありますが、しっかりパーツ片単位に分解していくとこんな感じがゴールになるかと思います。
147
+
148
+ ん?関数作りすぎじゃない?そうかもしれませんね。
149
+ 再利用するまでもないようなものは、
150
+ どんどんアロー関数化したりしてくっつけていっても良いかと思います。
151
+
123
152
  ---
124
153
 
125
154
  おまけ: 配列操作を使う
126
155
 
156
+ まぁ高階関数とかご大層な用意がなくても、
127
- まぁ高階関数とかご大層な事しなくても、JSの標準で用意されている高階関数的なメソッドチェーンで実現できます。
157
+ JSの標準で用意されている高階関数的なメソッドチェーンで実現できます。
128
158
 
129
159
  ```JavaScript
130
- const output = it => console.log(it)
131
- const sharp = n => '#'.repeat(n)
132
-
133
- const n = 5
134
- const result = Array(n)
160
+ const result = Array(5)
135
161
  .fill(0)
136
- .map((_, i) => ['-----', sharp(n - i)])
162
+ .map((_, i) => ['-----', '#'.repeat(5 - i)])
137
163
  .reduce((arr, it) => {
138
164
  it.forEach(_ => arr.push(_))
139
165
  return arr
@@ -142,7 +168,8 @@
142
168
 
143
169
  console.log(result)
144
170
  // ["-----", "#####", "-----", "####", "-----", "###", "-----", "##", "-----", "#", "-----"]
171
+
145
- result.forEach(output)
172
+ result.forEach(it => console.log(it))
146
173
  // -----
147
174
  // #####
148
175
  // -----
@@ -156,9 +183,18 @@
156
183
  // -----
157
184
  ```
158
185
 
159
- このメソッドチェーンを適度な粒度で切り取れば、
160
- そこそこ綺麗に質問文の要望通りのものが作そうです。
186
+ し私ならコード再利用云々以前にこを関数に包めて`newFunc`完成です。
187
+ この程度の分量なら細分化以前に必要になる度に書いてしまっても良いかなぁと思います。
161
188
 
189
+ 因みに`func`の作り方はこれを使えばワンライナーです。
190
+
191
+ ```JavaScript
192
+ const result = Array(5)
193
+ .fill(0)
194
+ .map((_, i) => '#'.repeat(5 - i))
195
+ // ["#####", "####", "###", "##", "#"]
196
+ ```
197
+
162
198
  ---
163
199
 
164
200
  おまけ: 出力する歳のイディオム
@@ -179,15 +215,15 @@
179
215
  まとめ
180
216
 
181
217
  実際関数型プログラミングが綺麗らしいと言われますが、
182
- 動けば何でもいい、コードの綺麗さなど知ったことかという人はC系統の命令型プログラミングを好みますので、
218
+ 動けば何でもいい、コードの綺麗さなど知ったことかという人の多くはC系統の命令型プログラミングを好みますので、
183
219
  関数型プログラミングの世界に入ってこないだけの話です。
184
220
 
185
221
  命令型でやってた人間が、ソースの可読性をこだわりぬいた結果、
186
222
  関数型プログラミングに活路を見出し門戸を叩くケースも結構多いと聞きます。
187
223
 
188
- なので例え関数型プログラミングを軸にしたとしても、汚い設計やコードは簡単につくれます。
224
+ 例え関数型プログラミングを軸にしたとしても、汚い設計やコードは簡単につくれます。
189
- 関数型プログラミングが綺麗というのは、キレイなコードを書くために試行錯誤した前人達の努力の証だと考えています。
225
+ 関数型プログラミングが綺麗というのは、キレイなコードを書くために試行錯誤した前人達の努力の結晶なんで
190
226
 
191
227
  今回の回答文では質問文からやりたい事を満たす為のパーツ片の紹介という感じで書きました。
192
- おまけまで含めても綺麗に収まる形に収まっていないと思いますので、
228
+ おまけまで含めてもまだまだ考え余地沢山あるかと思いますので、
193
229
  色々と試行錯誤してキレイな形というのを模索してみて下さい。

1

締めの文章追加

2018/04/22 12:54

投稿

miyabi-sun
miyabi-sun

スコア21554

answer CHANGED
@@ -179,10 +179,15 @@
179
179
  まとめ
180
180
 
181
181
  実際関数型プログラミングが綺麗らしいと言われますが、
182
+ 動けば何でもいい、コードの綺麗さなど知ったことかという人間はC系統の命令型プログラミングを好みますので、
182
- バカな人間は関数型プログラミングの世界に入ってこないだけの話であり、
183
+ 関数型プログラミングの世界に入ってこないだけの話です。
183
- 関数型プログラミングを軸にしたとしても、汚い設計やコードは簡単につくれます。
184
184
 
185
+ 命令型でやってた人間が、ソースの可読性をこだわりぬいた結果、
186
+ 関数型プログラミングに活路を見出し門戸を叩くケースも結構多いと聞きます。
187
+
188
+ なので例え関数型プログラミングを軸にしたとしても、汚い設計やコードは簡単につくれます。
189
+ 関数型プログラミングが綺麗というのは、キレイなコードを書くために試行錯誤した前人達の努力の証だと考えています。
190
+
185
191
  今回の回答文では質問文からやりたい事を満たす為のパーツ片の紹介という感じで書きました。
186
-
187
192
  おまけまで含めても綺麗に収まる形には収まっていないと思いますので、
188
193
  色々と試行錯誤してキレイな形というのを模索してみて下さい。