@@ -143,44 +143,78 @@ 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- - ブロックあたりのコードが短くなるので、読みやすい
150+ 長い処理をパーツに分割すると、次のようなメリットがあります。
151+
152+ - 考えるべきことが少なくなるので、読みやすい
152153- パーツごとにテストができるので、デバッグがしやすい
153- - 汎用性のあるパーツなら、使いまわしができる
154+ - パーツの使いまわしができる
154155
155- 以下の例では、階段を表示する操作の中の、文字列を繰り返す操作を ` repeat ` 関数というパーツに分けています 。
156+ 次の例は、 ` totalTicketCount ` 枚のうち ` hitTicketCount ` 枚の当たりがあるくじから ` drawnTicketCount ` 枚を引いたときに、当たりが少なくとも 1 枚出る確率 ` winningProbability ` を、 ` ■■■□□□□□□□ ` のようなグラフ形式で表示するプログラムです 。
156157
157158``` 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;
159+ const totalTicketCount = 10 ;
160+ const hitTicketCount = 5 ;
161+ const drawnTicketCount = 3 ;
162+
163+ let losingProbability = 1 ;
164+ for (let i = 0 ; i < drawnTicketCount; i += 1 ) {
165+ losingProbability *=
166+ (totalTicketCount - hitTicketCount - i) / (totalTicketCount - i);
167+ }
168+ const winningProbability = 1 - losingProbability;
169+
170+ for (let p = 0 ; p < 1 ; p += 0.1 ) {
171+ if (p < winningProbability) {
172+ document .write (" ■" );
173+ } else {
174+ document .write (" □" );
163175 }
164- document .write (result);
165- document .write (" <br>" );
166176}
167177```
168178
179+ このプログラムを、<Term type =" javascriptFunction " >関数</Term >を用いて確率を計算する部分とグラフとして表示する部分に分割すると、次のようになります。先頭の 9 行を読むだけでプログラム全体の処理の流れが追えるようになりました。
180+
169181``` javascript
170- function repeat (stringToRepeat , count ) {
171- let result = " " ;
172- for (let j = 0 ; j < count; j += 1 ) {
173- result += stringToRepeat;
182+ const totalTicketCount = 10 ;
183+ const hitTicketCount = 5 ;
184+ const drawnTicketCount = 3 ;
185+ const winningProbability = calculateWinningProbability (
186+ totalTicketCount,
187+ hitTicketCount,
188+ drawnTicketCount,
189+ );
190+ showProbabilityAsGraph (winningProbability);
191+
192+ function calculateWinningProbability (
193+ totalTicketCount ,
194+ hitTicketCount ,
195+ drawnTicketCount ,
196+ ) {
197+ let losingProbability = 1 ;
198+ for (let i = 0 ; i < drawnTicketCount; i += 1 ) {
199+ losingProbability *=
200+ (totalTicketCount - hitTicketCount - i) / (totalTicketCount - i);
174201 }
175- return result ;
202+ return 1 - losingProbability ;
176203}
177204
178- for (let i = 0 ; i < 10 ; i += 1 ) {
179- document .write (repeat (" ☆" , i));
180- document .write (" <br>" );
205+ function showProbabilityAsGraph (probability ) {
206+ for (let p = 0 ; p < 1 ; p += 0.1 ) {
207+ if (p < probability) {
208+ document .write (" ■" );
209+ } else {
210+ document .write (" □" );
211+ }
212+ }
181213}
182214```
183215
216+ このように、大きなプログラムを意味的に独立した小さなまとまりに分割する操作を、** <Term type =" javascriptModularization " >モジュール化</Term >** と呼ぶ場合があります。
217+
184218---
185219
186220## 基礎課題
0 commit comments