refactoring : long function - replace function with command
This commit is contained in:
@@ -0,0 +1,23 @@
|
|||||||
|
package com.example.refactoring._03_long_function._10_replace_function_with_command;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public record Participant(String username, Map<Integer, Boolean> homework) {
|
||||||
|
public Participant(String username) {
|
||||||
|
this(username, new HashMap<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getRate(double total) {
|
||||||
|
long count = this.homework.values().stream()
|
||||||
|
.filter(v -> v == true)
|
||||||
|
.count();
|
||||||
|
return count * 100 / total;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHomeworkDone(int index) {
|
||||||
|
this.homework.put(index, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package com.example.refactoring._03_long_function._10_replace_function_with_command;
|
||||||
|
|
||||||
|
import org.kohsuke.github.GHIssue;
|
||||||
|
import org.kohsuke.github.GHIssueComment;
|
||||||
|
import org.kohsuke.github.GHRepository;
|
||||||
|
import org.kohsuke.github.GitHub;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
public class StudyDashboard {
|
||||||
|
|
||||||
|
private final int totalNumberOfEvents;
|
||||||
|
|
||||||
|
public StudyDashboard(int totalNumberOfEvents) {
|
||||||
|
this.totalNumberOfEvents = totalNumberOfEvents;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws IOException, InterruptedException {
|
||||||
|
StudyDashboard studyDashboard = new StudyDashboard(15);
|
||||||
|
studyDashboard.print();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Participant findParticipant(String username, List<Participant> participants) {
|
||||||
|
Participant participant = null;
|
||||||
|
if (participants.stream().noneMatch(p -> p.username().equals(username))) {
|
||||||
|
participant = new Participant(username);
|
||||||
|
participants.add(participant);
|
||||||
|
} else {
|
||||||
|
participant = participants.stream().filter(p -> p.username().equals(username)).findFirst().orElseThrow();
|
||||||
|
}
|
||||||
|
return participant;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void print() throws IOException, InterruptedException {
|
||||||
|
GitHub gitHub = GitHub.connect();
|
||||||
|
GHRepository repository = gitHub.getRepository("whiteship/live-study");
|
||||||
|
List<Participant> participants = new CopyOnWriteArrayList<>();
|
||||||
|
|
||||||
|
ExecutorService service = Executors.newFixedThreadPool(8);
|
||||||
|
CountDownLatch latch = new CountDownLatch(totalNumberOfEvents);
|
||||||
|
|
||||||
|
for (int index = 1 ; index <= totalNumberOfEvents ; index++) {
|
||||||
|
int eventId = index;
|
||||||
|
service.execute(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
GHIssue issue = repository.getIssue(eventId);
|
||||||
|
List<GHIssueComment> comments = issue.getComments();
|
||||||
|
|
||||||
|
for (GHIssueComment comment : comments) {
|
||||||
|
Participant participant = findParticipant(comment.getUserName(), participants);
|
||||||
|
participant.setHomeworkDone(eventId);
|
||||||
|
}
|
||||||
|
|
||||||
|
latch.countDown();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new IllegalArgumentException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
latch.await();
|
||||||
|
service.shutdown();
|
||||||
|
|
||||||
|
new StudyPrinter(this.totalNumberOfEvents, participants).execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package com.example.refactoring._03_long_function._10_replace_function_with_command;
|
||||||
|
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 함수를 독립적인 객체로 만들어서 사용 (복잡한 기능을 구현 할 때 여러 메소드를 추가하여 사용할 수 있다.)
|
||||||
|
*/
|
||||||
|
public class StudyPrinter {
|
||||||
|
|
||||||
|
private final int totalNumberOfEvents;
|
||||||
|
|
||||||
|
private final List<Participant> participants;
|
||||||
|
|
||||||
|
public StudyPrinter(int totalNumberOfEvents, List<Participant> participants) {
|
||||||
|
this.totalNumberOfEvents = totalNumberOfEvents;
|
||||||
|
this.participants = participants;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void execute() throws IOException {
|
||||||
|
try (FileWriter fileWriter = new FileWriter("participants.md");
|
||||||
|
PrintWriter writer = new PrintWriter(fileWriter)) {
|
||||||
|
this.participants.sort(Comparator.comparing(Participant::username));
|
||||||
|
|
||||||
|
writer.print(header(this.participants.size()));
|
||||||
|
|
||||||
|
this.participants.forEach(p -> {
|
||||||
|
String markdownForHomework = getMarkdownForParticipant(p);
|
||||||
|
writer.print(markdownForHomework);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String getMarkdownForParticipant(Participant p) {
|
||||||
|
return String.format("| %s %s | %.2f%% |\n", p.username(), checkMark(p, this.totalNumberOfEvents),
|
||||||
|
p.getRate(this.totalNumberOfEvents));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* | 참여자 (420) | 1주차 | 2주차 | 3주차 | 참석율 |
|
||||||
|
* | --- | --- | --- | --- | --- |
|
||||||
|
*/
|
||||||
|
private String header(int totalNumberOfParticipants) {
|
||||||
|
StringBuilder header = new StringBuilder(String.format("| 참여자 (%d) |", totalNumberOfParticipants));
|
||||||
|
|
||||||
|
for (int index = 1; index <= this.totalNumberOfEvents; index++) {
|
||||||
|
header.append(String.format(" %d주차 |", index));
|
||||||
|
}
|
||||||
|
header.append(" 참석율 |\n");
|
||||||
|
|
||||||
|
header.append("| --- ".repeat(Math.max(0, this.totalNumberOfEvents + 2)));
|
||||||
|
header.append("|\n");
|
||||||
|
|
||||||
|
return header.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* |:white_check_mark:|:white_check_mark:|:white_check_mark:|:x:|
|
||||||
|
*/
|
||||||
|
private String checkMark(Participant p, int totalEvents) {
|
||||||
|
StringBuilder line = new StringBuilder();
|
||||||
|
for (int i = 1 ; i <= totalEvents ; i++) {
|
||||||
|
if(p.homework().containsKey(i) && p.homework().get(i)) {
|
||||||
|
line.append("|:white_check_mark:");
|
||||||
|
} else {
|
||||||
|
line.append("|:x:");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return line.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user