[작년 문제 풀어보기] 5기 2주차 피드백

별의개발자커비·2023년 9월 13일
0

우테코 도전기

목록 보기
7/37
post-thumbnail

✅ 예외 설명 적기


✅ 원시값 포장 2

  • ball -> balls
  • strike 수 enum으로

✅ stream 2

new 객체로 받아서, 그걸 collect 해서 new list로 받기

갯수 안정해진 가변인자변수 int...

✅ 서비스 분리와 객체에 비즈니스 로직

이 분의 코드에서 특이점을 몇가지 발견해서 나도 적용해보고자 하는데,

  1. controller 외의 service도 분리했다.
  2. service에 비즈니스 로직이 다 들어있지는 않고, 일부는 domain에 있기도 하고, controller에 있는 느낌도 받았다.

안 그래도 PR 리뷰에 해당 내용이 있어서 내가 찾은 자료와 함께 참고 링크를 첨부한다.

(추가 중...) 쭉 읽어보고 지금까지 내가 생각한 정리는

  • 그 객체에 온전히 해당하는 기능은 controller나 service가 아니라 해당 객체 내에 있어야한다. 서비스에서 setter등을 이용해 하는 것보다 유지보수에 편한 이유 등으로
  • controller에서 주요 로직을 처리하는 것처럼 보이는 메소드들은 사실 service에서 처리가 끝나서 결과값만 받아오는 정도로 구현한다.
  • 단, input을 service나 domain에서 받아 input에 대한 의존성을 가지면 mvc 패턴을 위반하는 것이다. input은 controller에서 받아서 넘겨야한다.

도메인에서 비즈니스 로직 처리

Getter Setter 를 쓰지 말아야하는 이유가 뭘까?

  • 해당 포스트에 내가 궁금했던 내용이 잘 나와있는데 '서비스단에 정보를 주지말고, 정보에 관련 된 처리를 가지고 있는 당사자가 한다'는 말이 가장 와닿았다. 그런 측면에서 setter(+getter도)를 지양할 수 있을 거고.

✅ DB 생성?!


이 분의 코드에서 영감을 받아 나도 적용해보려고 한다! 조건에 없지만 생각해서 만드는 것 재밌는 자세다!!


✅ 객체별 getInstance 메소드

나의 경우 다른 객체의 메소드를 사용하기 위해 1회성이면 new 객체().메소드 해서 쓰고, 여러번 써야하면 인스턴스 변수로 선언해두고 객체 = new ~ 로 쓰곤했다. 그런데 이 분의 코드에서 모든 객체는 아니고 일부 객체에서 객체 = new ~ 가 아니라 객체 = 객체.getInstace 로 쓰는 걸 보았다. getInstace에는 생성된 게 없으면 new 객체를 리턴하고 이미 생성된 객체가 있으면 거기에 값을 넣어 리턴하는 식이다.

db같은 경우는 이게 필요할 것 같다. 전체 프로그램을 통틀어서 한 번만 생성되고 거기에 계속 쌓여야하기 때문에! 적용해서 db 만들어봐야겠다.

✅ 싱글톤 패턴(lazyHolder 써보기)

싱글톤의 여러가지 방식

싱글톤 패턴이 필요한 이유와 실제 서비스에 적용까지

LazyHolder 기법 (Effective java 3th - Item4)

본문 발췌

  • 싱글톤 패턴이 필요한 이유

    프로그램 내 에서 어떤 객체가 단 1개만 존재해야 한다.
    프로그램 내부의 여러 부분에서 이 객체를 공유하며 사용한다.
    위와 같은 상황에서, 싱글톤 패턴은 객체가 프로그램 내부에서 단 1개만 생성됨을 보장하며 
    멀티 스레드에서 이 객체를 공유하며 동시에 접근하는 경우에 발생하는 동시성 문제도 해결해주는 디자인 패턴.

가장 많이 쓰는 LazyHolder 를 사용하는 싱글톤 패턴


✅ 정규식으로 숫자 확인해보기

이전에 배웠던 ^~$ 정규식이 아닌 matches를 활용하는 방법이 있다.

matches

matches 메서드는 Java에서 문자열과 정규식 패턴을 비교하여 두 문자열이 정확히 일치하는지 여부를 판단하는 데 사용. 이 메서드는 String 클래스에 내장되어 있으며, 다음과 같은 방식으로 사용된다.

boolean matches(String regex)
import java.util.regex.*;

public class RegexExample {
    public static void main(String[] args) {
        String input = "123"; // 여기에 검사할 문자열을 넣으세요.

        // 세 자리인지 확인
        boolean isThreeDigits = input.matches(".{3}");

        // 중복된 숫자가 없는지 확인
        boolean noDuplicateDigits = !input.matches(".*(\\d).*\\1.*");

        // 0을 포함하는지 확인
        boolean noZero = input.matches(".*0.*");

        // 숫자인지 확인
        boolean isNumeric = input.matches("\\d+");

        // 결과 출력
        System.out.println("세 자리 숫자인지 확인: " + isThreeDigits);
        System.out.println("중복된 숫자가 없는지 확인: " + noDuplicateDigits);
        System.out.println("0을 포함하지 않는지 확인: " + noZero);
        System.out.println("숫자인지 확인: " + isNumeric);
    }
}

✅ 정해져 있는 result 종류들 같은 건 enum으로!


이 분의 코드를 보고 '오호!' 싶었다. 나는 상수, static constant 클래스에 넣어놓고 썼는데 그 중에 결과 부분은 enum으로 해도 좋을 것 같다!


✅ 문자열을 변경시킨다면 String 말고 StringBuilder!

작년 피어리뷰에 있던 피드백인데 나도 생각해봐야하는 부분 같다!


✅ private을 테스트해야할 때 overiding?!


이 분의 코드를 보고 private 메소드를 테스트 해야할 때 overiding을 써봐야겠다고 생각했다!

✅ 추상화 수준


작년 피어 리뷰를 보면서 추상화 수준이라는 말이 어떤 건지 궁금해서 정리해보려고 한다.

[CleanCode] 함수의 추상화 수준이란?

  • 본문 발췌
그럼 추상화 수준이 같다는 것은 무엇인가? 책의 46페이지에 "...추상화 수준이 아주 높다. 
반면, ... 추상화 수준이 중간이다. 
그리고 ...같은 코드는 추상화 수준이 아주 낮다."라는 말이 쓰여있다. 
결국, 추상화 수준은 높음, 중간, 낮음으로 분류 할 수 있다.


 추상화 수준을 분류하는 기준은 무엇인가? 
 동일하게 46페이지에 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다고 했다. 
 함수의 추상화 수준은 다음 단계로 갈수록 낮아진다. 
 그리고 이 수준이 같아야 함수가 하나의 일을 한다고 할 수 있다.

이제 추상화 수준이 높다, 낮다는 구분이 가능해졌다. 
하지만 추상화 수준이 중간이라는 것은 무엇인가? 
높지도 않고 낮지도 않은상태인데 A-1 또는 A-1-1은 추상화 수준이 중간인가? 
아니다 A-1과 A-1-1은 추상화 수준이 높다고 할 수 있다.

 추상화 수준이 중간이라는 것은 같은 추상화 수준을 가진 함수끼리의 연관을 말한다. 
 그러니까 저자인 로버트 C 마틴은 추상화 수준이 높지도 낮지도 않은 중간은 지양한다고 말하는것 같다.
 
 결론: "추상화 수준은 높음, 중간, 낮음으로 구분 할 수 있고 
 추상화 수준을 높음으로 유지하고 추상화 수준이 중간은 지양한다. 

🆗 스터디 피드백

  • 11로 바꾸기

  • 3주차 지킬 컨벤션 사항 적어놓고 완전 지켜보기

    • indent는 1까지
    • instance변수는 2개까지만
    • 메서드의 인자는 2개까지만
    • 메서드는 10줄까지만 넣는다
    • 나올 수 있다고 생각하는 모든 경우에 예외 처리를 넣는다
    • else는 사용하지 않는다
    • 꼭 필요한 메서드만 외부로 노출하고 나머지는 전부 숨긴다
  • player<int> 이부분을 int가 아니라 ball 등의 객체로 원시값 포장하기

  • restart 1, 2 입력값 받는 것 같은 부분도 enumrestartRequest으로 객체화 할 수 있었겠구나.

  • test를 위한 것이라는데 이유가 모르는 부분이라 알아보기

  • 객체 인스턴스 변수 2개로 줄이기

0개의 댓글