Files
stringcheck/2日目_実装ミッション指示書.md
2026-10-08 09:14:52 +09:00

217 lines
12 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 2日目 実装ミッション指示書
## この指示書について
このミッションは、「StringCheck 詳細設計書」の完成を目指す実装課題の2日目です。1日目に作った「検証なしの正常系のみ」の `StringCheck.java` に、今日習う制御構文(ループ・条件分岐)を組み込み、仕様どおりに動く状態まで完成させます。
今日からは、1日目と異なり **6段階構成**(1〜3:必須実装、4〜6:発展課題)でミッションを進めます。4〜6は、講義や設計書にそのまま答えが書かれていない内容を、自分で試し・調べ・考えて取り組む課題です。
### 今日はまだ次のことを習っていません。使わないでください。
- 独自のメソッドを定義すること(`inputString()` や `setUpLogger()` などへの切り出しはまだ行いません)
- 例外処理(`try` / `catch`)、ログ出力(`Logger`)の実際の実装
- コレクション(`ArrayList` など)
### 今日使ってよいもの
- 1日目までに習った内容(基本データ型、算術・比較・論理演算子、配列)
- `for` 文/`while` 文/拡張for文(for-each)
- `if` 文/`switch` 文(従来型・switch式)、三項演算子
- 読みやすいコードを書くための考え方(早期リターン、ネスト削減、境界値の意識)
すべての処理は、引き続き `main` メソッド1本の中に書き並べてください。メソッドへの切り出しは、メソッドの定義方法を習った後日のミッションで行います。
## 開発環境について(Eclipse・前回のおさらい)
- コンパイルエラーの確認:エディタおよびPackage Explorer上に赤いエラーマーカーが表示されていないこと。
- 実行方法:エディタ上で右クリック →「実行(Run As)」→「Java アプリケーション(Java Application)」。
- 入力の方法:実行後、画面下部の **[コンソール](Console)** をクリックしてから文字を入力し、Enterキーを押す。
## 今日のゴール
1日目のプログラムに検証ロジックを組み込み、次のように「正しい入力が得られるまで何度でも聞き直す」動作を完成させます。
```
いまなにしてる?
何も入力されていません
いまなにしてる?
(141文字以上の文章)
投稿文が長すぎます
いまなにしてる?
ラーメンを食べています
↓↓↓↓↓↓ 投稿されました ↓↓↓↓↓↓
ラーメンを食べています
```
## 進め方(6段階)
### 段階1(必須):ループ構文のウォームアップと、正常系フローのループ化
1. **for-each練習:** 1日目に用意したメッセージの `String` 配列を、拡張for文(for-each)を使って1件ずつ画面に出力してみてください(動作確認用のミニ演習です。最終的な提出コードに残すかどうかは任意です)。
2. **無限ループ化:** `while (true)` を使い、1日目に実装した「正常系のみ」の一連の流れ(プロンプト表示 → 読み込み → 投稿完了表示)全体を無限ループで包んでください。まだ `if` 文は書かず、常に投稿が成功する状態のまま、実行するたびに何度でも投稿を繰り返せる状態にします。
**この段階の完了確認**
- Eclipseで実行し、投稿が成功した後も処理が終了せず、再び「いまなにしてる?」が表示され続けること(終了条件はまだ無いので、確認できたら停止して構いません)。
### 段階2(必須):if文による検証ロジックの実装
1日目に `str` の文字数をもとに算出していた2つの真偽値(空文字判定・文字数超過判定)を使い、`if` 文で次の分岐を実装してください。
- **空文字判定が true の場合:** 「何も入力されていません」を表示し、`continue` でループの先頭(プロンプト表示)に戻る。
- **文字数超過判定が true の場合:** 「投稿文が長すぎます」を表示し、`continue` でループの先頭に戻る。
- **どちらでもない場合:** `break` でループを抜け、投稿完了処理(空行→バナー→内容表示)に進む。
> ログ出力(`logger` の呼び出し)は今回はまだ実装しません。例外処理とあわせて別日に扱います。
**この段階の完了確認**
- 詳細設計書「9.1 メイン処理」のフローチャート、および「10. 疑似コード」の `main` 部分と同じ分岐構造になっていること。
### 段階3(必須):全テストケースでの動作確認
詳細設計書「11. テストケース一覧」の次の9パターンすべてを、実際にEclipseで実行して確認してください。
| No | 入力内容 | 期待される画面表示 |
|---|---|---|
| 1 | 「ラーメンを食べています」(1〜140文字の通常の文章) | 投稿完了メッセージとともに投稿内容が表示される |
| 2 | 何も入力せずEnterのみ | 「何も入力されていません」→再度入力待ち |
| 3 | 半角スペースのみ(例:`" "`) | 「何も入力されていません」→再度入力待ち |
| 4 | 全角スペースのみ(例:`"   "`) | 「何も入力されていません」→再度入力待ち |
| 5 | ちょうど140文字の文章 | 投稿が成功する(境界値) |
| 6 | 141文字の文章 | 「投稿文が長すぎます」→再度入力待ち |
| 7 | 大幅に140文字を超える文章 | 「投稿文が長すぎます」→再度入力待ち |
| 8 | 両端に半角・全角スペースが付いた通常の文章(例:`" 今日は晴れ "`) | 両端の空白が除去され「今日は晴れ」として投稿される |
| 9 | 不正入力(未入力・長すぎ)を数回続けた後、正しい文章を入力 | 都度エラーメッセージが表示された後、最終的に投稿が成功する |
**この段階の完了確認**
- 上記9パターンすべてで「期待される画面表示」どおりの動作になること。
---
ここまでで、詳細設計書が要求する画面上の動作は一通り完成します。ここから先(段階4〜6)は、答えが1つに決まらない発展課題です。
### 段階4(発展):早期リターン・ネスト削減によるリファクタリング
講義で扱った「早期リターン」「ネスト削減」の考え方を使い、段階2で書いた `if` 文の構造を見直してください。**挙動を変えないこと**(段階3の9パターンが書き換え後も全て同じ結果になることを必ず確認する)を条件に、コードをより読みやすい形に書き直してください。
- ふりかえりシートに、書き直す前後のコードと、なぜその形の方が読みやすいと考えたかを記載してください。
### 段階5(発展):三項演算子・switch式との比較検討
段階2で実装したロジックのうち、どこか1箇所を三項演算子または switch式 を使って書き換えてみてください(すべてを書き換える必要はありません)。
- 書き換えてみたうえで、「`if` 文のままの方が良い」「三項演算子/switch式にした方が良い」のどちらだと考えるか、理由とともにふりかえりシートに記載してください。この課題に正解はありません。実際に自分の手で試し、判断することが目的です。
### 段階6(発展):境界値・追加エッジケースの調査
詳細設計書「11. テストケース一覧」に載っていない入力パターンを、自分で最低3つ考えて実際に試してください。
- ヒント例:半角スペースと全角スペースが混在した「空白のみ」の入力、1文字だけの入力、140文字ちょうど/141文字ちょうどの境目をさらに細かく複数パターン試す、タブ文字を含む入力、など
- 試した入力内容と実際の結果を、ふりかえりシートに記録してください。想定と異なる挙動があった場合は、その原因を自分で調査し、わかったことを記載してください。
## 提出物
- 更新した `StringCheck.java`
- 実装ふりかえりシート(次の項目を記載)
以下に各項目の記載例を示します。**あくまで「どのくらいの粒度で、どんな書き方をすればよいか」を示すための別課題の例**であり、StringCheck.javaの答えではありません。段階4・5・6は、この例を参考にしつつ、必ず自分の実装・自分で考えた内容を記載してください。
### 完了した段階
**記載例**
```
完了した段階:1〜6(すべて完了)
```
```
完了した段階:1〜3は完了。4〜6は時間の都合で段階4のみ着手、5・6は未着手。
```
### 段階4:リファクタリング前後のコードと、その理由
**記載例(「点数から合格・不合格を判定する」別課題での例)**
書き直す前(ネストが深い):
```java
if (score >= 0) {
if (score <= 100) {
if (score >= 60) {
System.out.println("合格");
} else {
System.out.println("不合格");
}
} else {
System.out.println("不正な値です");
}
} else {
System.out.println("不正な値です");
}
```
書き直した後(早期リターンでネストを減らす):
```java
if (score < 0 || score > 100) {
System.out.println("不正な値です");
return;
}
if (score < 60) {
System.out.println("不合格");
return;
}
System.out.println("合格");
```
理由:「異常な値である」という一番外側の条件を先に弾いてしまうことで、本来知りたい「合格か不合格か」という分岐だけが手前に残り、ネストが浅くなって読みやすくなったため。
> 実際の提出では、上のコード例ではなく、**あなた自身がStringCheck.javaの検証ロジックに対して行った**書き直し前後のコードと理由を記載してください。
### 段階5:試した書き換え内容と、どちらが良いと考えたか・その理由
**記載例(同じく「点数判定」での例)**
if文で書いた場合:
```java
String result;
if (score >= 60) {
result = "合格";
} else {
result = "不合格";
}
```
三項演算子で書き換えた場合:
```java
String result = (score >= 60) ? "合格" : "不合格";
```
結論と理由:単純に2択の値を1つの変数に代入するだけなら、三項演算子の方が1行で完結し読みやすいと感じた。ただし、分岐の中でログ出力や複数の処理を行う必要がある場合は、三項演算子では書けない(値を返すことしかできない)ため、その場合はif文の方が適していると考えた。
> 実際の提出では、**あなたがStringCheck.javaのどの部分をどう書き換えてみたか**、そのうえでどちらが良いと感じたか・理由を記載してください。
### 段階6:自分で考えた追加テストケースの内容・結果・気づいたこと
**記載形式の例**
| 入力内容 | 実行結果 | 気づいたこと |
|---|---|---|
| (例・すでに公開されているテストケース5)ちょうど140文字の文章 | 投稿が成功した | 境界値ちょうどのケースは想定通り成功した |
| ここに自分で考えた1つ目の入力を書く | 実際に実行して観察した画面表示を書く | 期待通りだったか、意外な挙動はあったかを書く |
| ここに自分で考えた2つ目の入力を書く | | |
| ここに自分で考えた3つ目の入力を書く | | |
> 表の1行目は記載形式を示すための例(すでに公開されているテストケースの再掲)です。**あなた自身で新たに考えた入力パターンを、最低3行(3パターン)追加**してください。想定と異なる挙動があった場合は、原因を自分で調査し、わかったことも書き添えてください。
## 今日は実装しないこと(別日に扱います)
- `inputString()` や `setUpLogger()` のような独立したメソッドへの切り出し
- ログ出力(`Logger` によるファイル出力)の実際の実装