@@ -143,44 +143,65 @@ increment();
143143
144144:::
145145
146- ## パーツに分割する
146+ ## 処理の分割
147147
148- 複雑な操作を複数の<Term type =" javascriptFunction " >関数</Term >ブロックに分解することで、コードの可読性を上げることができます。この操作を <Term strong type =" javascriptModularization " >モジュール化</Term > と呼びます。
149- パーツに分割すると、次のようなメリットがあります。
148+ <p ><Term type =" javascriptFunction " >関数</Term >は、複数回使用する処理を簡便に記述するためだけでなく、複雑で長い処理の一部を切り出し、プログラム全体の見通しを良くするために用いることもできます。</p >
150149
151- - ブロックあたりのコードが短くなるので、読みやすい
152- - パーツごとにテストができるので、デバッグがしやすい
153- - 汎用性のあるパーツなら、使いまわしができる
154-
155- 以下の例では、階段を表示する操作の中の、文字列を繰り返す操作を ` repeat ` 関数というパーツに分けています。
150+ 次の例は、` totalTicketCount ` 枚のくじから ` hitTicketCount ` 枚を引いたときに、当たりが少なくとも 1 枚出る確率 ` winningProbability ` を、` ■■■□□□□□□□ ` のようなグラフ形式で表示するプログラムです。
156151
157152``` javascript
158- const stringToRepeat = " ☆" ;
159- for (let i = 0 ; i < 10 ; i += 1 ) {
160- let result = " " ;
161- for (let j = 0 ; j < i; j += 1 ) {
162- result += stringToRepeat;
153+ const totalTicketCount = 10 ;
154+ const hitTicketCount = 5 ;
155+ const drawnTicketCount = 3 ;
156+
157+ let losingProbability = 1 ;
158+ for (let i = 0 ; i < drawnTicketCount; i++ ) {
159+ losingProbability *=
160+ (totalTicketCount - hitTicketCount - i) / (totalTicketCount - i);
161+ }
162+ const winningProbability = 1 - losingProbability;
163+
164+ for (let p = 0 ; p < 1 ; p += 0.1 ) {
165+ if (p < winningProbability) {
166+ document .write (" ■" );
167+ } else {
168+ document .write (" □" );
163169 }
164- document .write (result);
165- document .write (" <br>" );
166170}
167171```
168172
173+ このプログラムを、<Term type =" javascriptFunction " >関数</Term >を用いて確率を計算する部分とグラフとして表示する部分に分割すると、次のようになります。先頭の 2 行を読むだけでプログラム全体の処理の流れが追えるようになりました。
174+
169175``` javascript
170- function repeat (stringToRepeat , count ) {
171- let result = " " ;
172- for (let j = 0 ; j < count; j += 1 ) {
173- result += stringToRepeat;
176+ const winningProbability = calculateWinningProbability (10 , 5 , 3 );
177+ showProbabilityAsGraph (winningProbability);
178+
179+ function calculateWinningProbability (
180+ totalTicketCount ,
181+ hitTicketCount ,
182+ drawnTicketCount ,
183+ ) {
184+ let losingProbability = 1 ;
185+ for (let i = 0 ; i < drawnTicketCount; i++ ) {
186+ losingProbability *=
187+ (totalTicketCount - hitTicketCount - i) / (totalTicketCount - i);
174188 }
175- return result ;
189+ return 1 - losingProbability ;
176190}
177191
178- for (let i = 0 ; i < 10 ; i += 1 ) {
179- document .write (repeat (" ☆" , i));
180- document .write (" <br>" );
192+ function showProbabilityAsGraph (probability ) {
193+ for (let p = 0 ; p < 1 ; p += 0.1 ) {
194+ if (p < probability) {
195+ document .write (" ■" );
196+ } else {
197+ document .write (" □" );
198+ }
199+ }
181200}
182201```
183202
203+ このように、大きなプログラムを意味的に独立した小さなまとまりに分割する操作を、** <Term type =" javascriptModularization " >モジュール化</Term >** と呼ぶ場合があります。
204+
184205---
185206
186207## 基礎課題
0 commit comments