Skip to content

Commit 0faf239

Browse files
authored
Merge pull request #492 from ut-code/update-modularization
2 parents 96d5800 + 12daa13 commit 0faf239

File tree

1 file changed

+55
-21
lines changed
  • docs/1-trial-session/09-functions

1 file changed

+55
-21
lines changed

docs/1-trial-session/09-functions/index.md

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)