TITLE[研修アイデア]リーダブルコード
書籍「リーダブルコード」を読んだうえで、リファクタリングを体験します。
テーマ
あなたはプログラミングを勉強中の新入社員です。 先輩からプログラミング練習のためにじゃんけんゲームの作成課題が出されました。
課題は、次のようなものでした。
- 雛形として提供されたJankenクラスをもとにじゃんけんを実装します
- プレイヤーが勝つか負けるまでゲームは続きます
- プロンプト例を再現します
プロンプト例
1=Rock, 2=Paper, 3=Scissors... [1/2/3]: 2
Chose by You: 2=Paper
Chose by COM: 2=Paper
1=Rock, 2=Paper, 3=Scissors... [1/2/3]: 1
Chose by You: 1=Rock
Chose by COM: 1=Rock
1=Rock, 2=Paper, 3=Scissors... [1/2/3]: 1
Chose by You: 1=Rock
Chose by COM: 3=Scissors
You win!
1=Rock, 2=Paper, 3=Scissors... [1/2/3]: 1
Chose by You: 1=Rock
Chose by COM: 2=Paper
You lose.
あなたは課題に取り組み、なんとか動作するものを完成させました。 ところが、ソースコードの出来はひどいもので、リファクタリングするように指示されました。
https://github.com/yo1000/unreadable-code-janken
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
public class Janken {
private final InputStream in;
private final PrintStream out;
public Janken(InputStream in, PrintStream out) {
this.in = in;
this.out = out;
}
public void play() {
String s="-1";
long i=-1;
while (s.equals(""+i)) {
s="";
out.print("1=Rock, 2=Paper, 3=Scissors... [1/2/3]: ");
try {
char c;
while (!("1".equals(s) || "2".equals(s) || "3".equals(s))) {
s = "";
while ((c = (char) in.read()) != '\n'&& c!='\0') {
s = ""+c;
}
;
}
out.println();
out.println("Chose by You: " + ("1".equals(s) ? "1=Rock" : "2".equals(s) ? "2=Paper" : "3=Scissors"));
// String c = s.next();
// System.out.println(c);
i = (System.currentTimeMillis()) % 3+1;
out.print("Chose by COM:");
out.println("1".equals(""+i) ? " 1=Rock" : "2".equals(""+i)? " 2=Paper":" 3=Scissors");
// System.out.println("[" +s+"]");
// System.out.println("["+i+"]");
} catch (IOException e) {
throw new RuntimeException(e);
}
// System.out.println("Shoot!");
// Scanner s = new Scanner(System.in);
// s.nextLine();
}
out.println();
if((Integer.parseInt(s) - Integer.parseInt(""+i)+3)%3 ==1){
out.println("You win!");
}else out.println("You lose.");
}
}
リファクタリング要件
リファクタリングするにあたり、以下の条件に従います。
- Jankenクラスのplayメソッドをリファクタリングすること
- じゃんけんゲームの要件を引き続き満たすこと
- 付属のテストコードがパスできること
また、リファクタリング演習の成果物として以下を作成してください。
- リファクタリング後の実装
- リファクタリング前の実装における問題点の一覧
取組みにあたっての留意事項
- 書籍「リーダブルコード」を必ず最後まで読んでから取り組んでください
- プログラミングを目的としているので、AIを使用した実装は禁止します
- 既存実装を読み取ったうえで、良い実装について自身で考えることを目的としているので、AIを使用したレビューは禁止します
- AIにレビューを依頼してしまうと、自ら問題点を発見できないため
- AIが親切すぎて、ヒントではなく答えまで提示してしまい、学習機会を奪われてしまうため


