11 KiB
3日目 実装ミッション指示書
この指示書について
このミッションは、「StringCheck 詳細設計書」の完成を目指す実装課題の3日目です。1日目・2日目で main メソッド1本の中に書き並べてきた処理の一部を、今日習う「メソッド」の知識を使って、別のメソッドに整理し直します。
重要: 段階1〜3で変えるのは「コードの整理のしかた」だけです。画面の表示内容・動作は、1日目・2日目までに完成させたものから一切変えません。これは実務でいう「リファクタリング(外から見た動きを変えずに、中身の構造を整理すること)」にあたります。
今日新しく作るメソッドは、すべて main と同じ public static を付けます(main の書き方をそのまま真似て作る、と考えてください)。
今日はまだ次のことを習っていません(段階1〜5では使わないでください。段階6のみ例外です)
- 例外処理(
try/catch)※段階6でのみ、自分で調べて使用します - コレクション(
ArrayListなど) - オブジェクト指向(インスタンス、クラスからオブジェクトを作ること)
- ログ出力(
Logger)※今日のミッションでは扱いません。別日のミッションで扱います
今日使ってよいもの
- 1日目・2日目までに習った内容(基本データ型、演算子、配列、
for/while、if/switch、三項演算子) - メソッドの定義(
public static、戻り値の型、引数、オーバーロード) - 1メソッド1責務の考え方、処理内容が伝わる命名
開発環境について(Eclipse・前回のおさらい)
- コンパイルエラーの確認:エディタおよびPackage Explorer上に赤いエラーマーカーが表示されていないこと。
- 実行方法:エディタ上で右クリック →「実行(Run As)」→「Java アプリケーション(Java Application)」。
- 入力の方法:実行後、画面下部の [コンソール](Console) をクリックしてから文字を入力し、Enterキーを押す。
今日のゴール
1日目・2日目で完成させた画面の動作(プロンプト表示、未入力・文字数超過時の再入力、正常投稿)を一切変えないまま、main に書き並べていた処理の一部を、役割ごとのメソッドに整理します。
今日整理するのは次の部分です。
- 標準入力の読み込みと空白除去 →
inputStringという名前のメソッドに切り出す - 空文字判定・文字数超過判定 → それぞれ専用のメソッドに切り出す
(ログ出力の準備を行う setUpLogger は、ログ出力の仕組み自体をまだ習っていないため、今日は扱いません。別日のミッションで扱います。)
進め方(6段階)
段階1(必須):inputString() メソッドへの切り出し
次の要件を満たすように実装してください(具体的なコードの書き方はここには記載しません。今日習ったメソッド定義の文法を参考に、自分で組み立ててください)。
public static、戻り値の型はString、引数は無しのメソッドとして、inputStringという名前のメソッドを新しく定義すること(mainと同じ書き方で作ること)。- これまで
mainの中に直接書いていた「標準入力から1行読み込み、前後の空白を除去する」処理を、このメソッドの中に移動すること。 - 除去したあとの文字列を、このメソッドの戻り値として返すようにすること。
main側は、このメソッドを呼び出して結果を受け取り、これまでと同じ変数strに格納する形に書き換えること。
この段階の完了確認
- 1日目・2日目に確認した動作(8.1〜8.5の入出力例、11のテストケース9パターン)が、書き換え後もまったく同じ結果になること。
段階2(必須):判定処理をメソッドに分割する
- これまで
mainの中で比較演算子を使って求めていた「空文字判定」を、isEmptyInputという名前の新しいメソッドに切り出してください。public static、戻り値の型はboolean、引数は判定したい文字列(String)を1つ受け取る形にすること。 - 同じく「文字数超過判定」を、
isTooLongInputという名前の新しいメソッドに切り出してください。作り方は1.と同じ考え方です。 main側は、これら2つのメソッドを呼び出した結果を使って、これまでと同じようにif文で分岐すること。
この段階の完了確認
- 1日目・2日目に確認した動作(8.1〜8.5、11のテストケース9パターン)が、書き換え後もまったく同じ結果になること。
段階3(必須):命名と責務の見直し
main・inputString・isEmptyInput・isTooLongInputのそれぞれについて、「1つのメソッドが1つの役割だけを持っているか」を見直してください。たとえばinputStringが入力の取得以外の作業(画面表示や判定など)を行っていないか、isEmptyInputが判定以外の作業(メッセージ表示など)を行っていないかを確認します。- メソッド名だけを見て、処理内容が推測できるかを見直してください。可能であれば、研修生同士でメソッド名だけを見せ合い、何をするメソッドか当ててもらう、という確認方法も有効です。
この段階の完了確認
- 上記の観点で気になる点があれば、名前や責務を調整すること。
- 最終的に、8.1〜8.5、11の9パターンの動作に変化がないこと。
ここまでで、今日扱う範囲のメソッド整理が完了します。ここから先(段階4〜6)は、答えが1つに決まらない発展課題です。
段階4(発展):オーバーロードの検討
isTooLongInputを、文字数の上限を引数で指定できる形にオーバーロードしてみてください(同じ名前で、引数の数や型が異なるメソッドをもう1つ追加する)。今のところ上限は140固定ですが、「もし将来、上限が変わるとしたら」という視点で、どんな引数を追加すると便利そうか、自分で考えてください。- 追加したオーバーロードは、どこかから実際に呼び出して動作確認してください。既存の呼び出し(140文字判定)は、新しいオーバーロードを使う形に書き換えても、そのまま残しても構いません。
この段階の完了確認
- 追加・変更した場合も、8.1〜8.5、11の9パターンの動作に変化がないこと。
段階5(発展):さらなるメソッド分割の要否判断
mainに残っている「投稿完了時の表示処理」(空行を出力し、バナーを表示し、投稿内容を表示する部分)を見て、これも1つのメソッドに切り出すべきかどうかを自分で判断してください。- 「切り出すべき」と判断した場合は、適切な名前を付けて実際にメソッド化してください。「今回は
mainに残したままで良い」と判断した場合は、そのままで構いません。 - どちらを選んだ場合も、その理由をふりかえりシートに記載してください。この課題に正解はありません。
この段階の完了確認
- 変更した場合も、8.1〜8.5、11の9パターンの動作に変化がないこと。
段階6(発展・挑戦課題):入力が終了した場合への対応
この段階は、今日までに習った内容だけでは完成できません。 自分で新しい知識(例外処理)を調べて取り組む、挑戦的な課題です。段階5までを完了して提出すれば、今日のミッションとしては十分です。無理のない範囲で挑戦してください。
現在の inputString は、入力そのものが受け取れなくなった場合(たとえば、コンソールへの入力が途中で終了してしまった場合など)に、エラーメッセージ(例外のスタックトレース)を表示してプログラムが強制終了してしまいます。この段階では、そうなった場合でも、利用者にわかりやすいメッセージを表示してプログラムを終了できるようにしてください。
- 入力が受け取れなくなったときに何が起きているかを、実際に自分で再現して確認してください(ヒント:入力を1文字も与えずにプログラムの入力を終了させる方法を調べてみること)。
- Javaでは、そのような「実行中に起きた問題」を捕まえて対処するために、
tryとcatchという構文を使います。この構文の書き方を、Java SE APIドキュメントや技術記事を使って自分で調べてください。 inputStringの中で、入力を読み取る処理をtryで囲み、入力が受け取れなかった場合はcatchで受け止めて、わかりやすいメッセージ(例:「入力が受け付けられなくなったため、プログラムを終了します。」)を表示したうえで、プログラムを終了させてください。
わからない用語(try、catch、例外 など)が出てきたら、1つずつ調べながら焦らず進めてください。
提出物
- 更新した
StringCheck.java - 実装ふりかえりシート(次の項目を記載)
記載例(「点数から合格・不合格を判定する」という別課題での例です。StringCheck.javaの答えではありません。実際の提出では、必ず自分の実装・自分で考えた内容を記載してください。)
- 完了した段階:例)
1〜6(すべて完了)/1〜4のみ完了。5・6は未着手。 - 段階4:追加したオーバーロードの内容と、どんな場面を想定して設計したか
- 段階5:投稿完了時の表示処理を切り出したか・残したか、その理由
- 段階6:挑戦したかどうか。挑戦した場合は、実装できたところまでの内容と、調べた用語・参考にしたページ。挑戦しなかった場合は「未挑戦」でよい。
今日は実装しないこと(別日に扱います)
setUpLogger()の作成・実装(ログ出力の仕組み自体を、まだ習っていません)