Live-Study 대시 보드 만들기.
- 프로그래밍 언어/자바
- 2020. 12. 6. 18:05
반응형
반응형
초기 코드 : 너무 지저분하다.
public class DashBoard {
Map<String,Integer> partition = new HashMap<>();
List<Partition> partitionRates = new ArrayList<>();
public void dashBoard() throws IOException {
GitHub gitHub = new GitHubBuilder().withOAuthToken(토큰 아이디).build();
GHRepository repository = gitHub.getRepository("whiteship/live-study");
for(int i = 1;i<=18;i++) {
List<GHIssueComment> comments = repository.getIssue(i).getComments();
for (GHIssueComment comment : comments) {
String login = comment.getUser().getLogin();
if (!partition.containsKey(login)) {
partition.put(login,0);
}
if (partition.containsKey(login)) {
int cnt = partition.get(login).intValue();
partition.put(login, cnt+1);
}
}
}
for (String s : partition.keySet()) {
double rate = (partition.get(s).intValue() / (double)(18) * 100;
partitionRates.add(new Partition(s,rate));
}
for (Partition rate : partitionRates) {
System.out.println(rate.id + " : " + String.format("%.2f",rate.rate)+"%");
}
}
}
이제 리펙토링을 해보자.
제일 먼저, map을 수정해보자.
private void save(String login) {
if (!hasId(login)) {
partition.put(login,0);
}
if (hasId(login)) {
partition.put(login, partition.get(login).intValue()+1);
}
}
private boolean hasId(String login) {
return partition.containsKey(login);
}
아직 마음에 들지는 않지만 계속 해보자.
private void getComments(List<GHIssueComment> comments) throws IOException {
for (GHIssueComment comment : comments) {
save(comment.getUser().getLogin());
}
}
for문 하나를 밖으로 빼뒀다.
위 코드를 보면 18이라는 숫자가 중복이 되는 것을 확인 할 수 있다.
이것을 ISSUE_ID_COUNT라는 변수로 둬서 상수로 만들자.
이제
for(int i = 1;i<=ISSUE_ID_COUNT;i++) {
getComments(repository.getIssue(i).getComments());
}
코드가 이렇게 줄었다.
하지만 아직도 이 메소드는 하는 일이 너무 많다. 일을 줄여야 한다,
public void savePartition() {
List<Partition> partitionRates = new ArrayList<>();
for (String s : partition.keySet()) {
double rate = (partition.get(s).intValue() / (double)(ISSUE_ID_COUNT)) * 100;
partitionRates.add(new Partition(s,rate));
}
for (Partition rate : partitionRates) {
System.out.println(rate.id + " : " + String.format("%.2f",rate.rate)+"% ");
}
}
savePartition이라는 메소드로 분리시켜줬다.
이제 dashbord메소드는 단 한가지 일만 하게 되었다.
public List<Partition> savePartition() {
List<Partition> partitionRates = new ArrayList<>();
for (String s : partition.keySet()) {
double rate = (partition.get(s).intValue() / (double)(ISSUE_ID_COUNT)) * 100;
partitionRates.add(new Partition(s,rate));
}
return partitionRates;
}
public void print(List<Partition> partitionRates) {
for (Partition rate : partitionRates) {
System.out.println(rate.id + " : " + String.format("%.2f",rate.rate)+"% ");
}
}
1차 리펙토링은 다음과 같이 변경 되었다.
public class DashBoard {
Map<String,Integer> partition = new HashMap<>();
static final int ISSUE_ID_COUNT = 18;
public void dashBoard() throws IOException {
GitHub gitHub = new GitHubBuilder().withOAuthToken(토큰 아이디).build();
GHRepository repository = gitHub.getRepository("whiteship/live-study");
for(int i = 1;i<=ISSUE_ID_COUNT;i++) {
getComments(repository.getIssue(i).getComments());
}
}
public List<Partition> savePartition() {
List<Partition> partitionRates = new ArrayList<>();
for (String s : partition.keySet()) {
double rate = (partition.get(s).intValue() / (double)(ISSUE_ID_COUNT)) * 100;
partitionRates.add(new Partition(s,rate));
}
return partitionRates;
}
public void print(List<Partition> partitionRates) {
for (Partition rate : partitionRates) {
System.out.println(rate.id + " : " + String.format("%.2f",rate.rate)+"% ");
}
}
private void getComments(List<GHIssueComment> comments) throws IOException {
for (GHIssueComment comment : comments) {
save(comment.getUser().getLogin());
}
}
private void save(String login) {
if (!hasId(login)) {
partition.put(login,0);
}
if (hasId(login)) {
partition.put(login, partition.get(login).intValue()+1);
}
}
private boolean hasId(String login) {
return partition.containsKey(login);
}
}
생각해보니 중복 제거를 하지 않았다. 한 이슈에 여러번 입력이 가능할 수 도 있는데, 위 코드는 모든 댓글을 확인하게 되었다.
set을 추가해서 중복을 제거하였다.
private Set<String> getComments(List<GHIssueComment> comments) throws IOException {
Set<String> loginInfoList = new HashSet<>();
for (GHIssueComment comment : comments) {
loginInfoList.add(comment.getUser().getLogin());
}
return loginInfoList;
}
private void login(Set<String> logins) {
for (String login : logins) {
save(login);
}
}
몇몇, 함수명이 마음에 들지 않는다.
그래서 변경 시켜주었다. 변경 시킨김에 private로 해야하는 부분도 수정하였다,
package study.whiteship;
import org.kohsuke.github.*;
import java.io.IOException;
import java.util.*;
public class DashBoard {
private Map<String, Integer> partitions = new HashMap<>();
private static final int ISSUE_MAX_COUNT = 18;
private static final String ADMIN = "whiteship";
private static final String REPOSITORY = ADMIN + "/" +"live-study";
public void action() throws IOException {
GitHub gitHub = new GitHubBuilder().withOAuthToken(TOKEN).build();
GHRepository repository = gitHub.getRepository(REPOSITORY);
for (int i = 1; i <= ISSUE_MAX_COUNT; i++) {
userIdRepeat(addUserIdUsingSet
(repository.getIssue(i).getComments()));
}
}
private Set<String> addUserIdUsingSet(List<GHIssueComment> comments) throws IOException {
Set<String> UserIdList = new HashSet<>();
for (GHIssueComment comment : comments) {
UserIdList.add(comment.getUser().getLogin());
}
return UserIdList;
}
private void userIdRepeat(Set<String> userIdSet) {
for (String userId : userIdSet) {
addParticipants(userId);
}
}
private boolean hasUserId(String userId) {
return partitions.containsKey(userId);
}
private void addParticipants(String userId) {
if (ADMIN.equals(userId)) {
return;
}
if (!hasUserId(userId)) {
partitions.put(userId, 0);
}
if (hasUserId(userId)) {
partitions.put(userId, partitions.get(userId).intValue() + 1);
}
}
public List<Participant> savingUserKeySet() {
List<Participant> participantList = new ArrayList<>();
for (String userId : partitions.keySet()) {
double ratio = (partitions.get(userId).intValue() / (double) (ISSUE_MAX_COUNT)) * 100;
participantList.add(new Participant(userId, ratio));
}
return participantList;
}
public void print(List<Participant> participantList) {
for (Participant participant : participantList) {
System.out.println(participant.getId() + " : " + String.format("%.2f", participant.getRatio()) + "%");
}
}
}
더 수정해야할것 같긴한데...;;; 잘 모르겠다. ;;
그래도 최종본은 나름 깔끔해졌다.
아직 addParticipants메소드 부분을 수정시키고 싶은데... 어떻게 수정을 해야할지 감이 잡히지 않는다.
반응형
'프로그래밍 언어 > 자바' 카테고리의 다른 글
큐 구현(설명 x) (0) | 2020.12.08 |
---|---|
스택 구현(설명x) (0) | 2020.12.07 |
Junit5 (0) | 2020.12.04 |
반복문과 조건문 (0) | 2020.11.29 |
백기선님 스터디에서 배운거 2가지 (간략히 정리) (0) | 2020.11.29 |