Live-Study 대시 보드 만들기.

반응형
반응형

초기 코드 : 너무 지저분하다.

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

댓글

Designed by JB FACTORY