App.java에 몰려있는 기능들 중 Quotation과 관련된 기능들을 컨트롤러로 분리
action에 따라 어떤 메서드를 실행 할 것인지에 대한 권한을 App이 아닌 Controller에게 넘겨준다.
public class QuotationController {
private final Scanner scanner;
final List<Quotation> quotations;
long lastQuotationId;
public QuotationController (final Scanner scanner) {
this.scanner = scanner;
quotations = new ArrayList<>();
lastQuotationId = 0;
}
public void actionRemove(Rq rq) {
final long id = rq.getParameterAsLong("id", 0);
quotations
.stream()
.filter(quotation -> quotation.getId() == id)
.findFirst()
.ifPresentOrElse(
quotation -> {
quotations.remove(quotation);
System.out.println("%d번 명언이 삭제되었습니다.".formatted(id));
},
() -> System.out.println("%d번 명언은 존재하지 않습니다.".formatted(id))
);
}
public void actionModify(Rq rq) {
final long id = rq.getParameterAsLong("id", 0);
quotations
.stream()
.filter(_quotation -> _quotation.getId() == id)
.findFirst()
.ifPresentOrElse(
quotation -> {
System.out.println("명언(기존) : %s".formatted(quotation.getContent()));
System.out.print("명언 : ");
final String content = scanner.nextLine().trim();
System.out.println("작가(기존) : %s".formatted(quotation.getAuthor()));
System.out.print("작가 : ");
final String author = scanner.nextLine().trim();
quotation.setContent(content);
quotation.setAuthor(author);
System.out.println("%d번 명언이 수정되었습니다.".formatted(id));
},
() -> System.out.println("%d번 명언은 존재하지 않습니다.".formatted(id))
);
}
public void actionWrite() {
System.out.print("명언 : ");
final String content = scanner.nextLine().trim();
System.out.print("작가 : ");
final String author= scanner.nextLine().trim();
final long id = ++lastQuotationId;
Quotation quotation = new Quotation(id, content, author);
quotations.add(quotation);
System.out.println("%d번 명언이 등록되었습니다.".formatted(id));
}
public void actionShowList() {
System.out.println("번호 / 작가 / 명언");
System.out.println("----------------------");
quotations
.reversed()
.forEach(
quotation -> System.out.println(
"%d / %s / %s".formatted(
quotation.getId(),
quotation.getAuthor(),
quotation.getContent()
)
)
);
}
public void dispatch(Rq rq) {
switch(rq.getAction()) {
case "삭제" -> actionRemove(rq);
case "수정" -> actionModify(rq);
case "목록" -> actionShowList();
case "등록" -> actionWrite();
}
}
}
public class App {
private final Scanner scanner;
public App(final Scanner scanner) {
this.scanner = scanner;
}
public void run() {
System.out.println("== 명언 앱 ==");
final QuotationController quotationController = new QuotationController(scanner);
while (true) {
final String cmd = scanner.nextLine().trim();
final Rq rq = new Rq(cmd);
switch (rq.getAction()) {
case "삭제", "수정", "등록", "목록" -> quotationController.dispatch(rq);
case "종료" -> {
return;
}
}
}
}
}