techbook-study / reading-after-work

Day By Day Reading a Book
0 stars 0 forks source link

2023-06-07 퇴근 후 독서 #3

Closed segyong56 closed 1 year ago

segyong56 commented 1 year ago

퇴근 후 독서

limyohwan commented 1 year ago

이펙티브 자바

  1. 메서드의 이름을 신중히 짓자 -> 같은 패키지에 속한 다른 이름들과 일관되게 짓는게 최우선 목표임

  2. 편의 메서드를 너무 많이 만들지 말자 -> 자주 쓰일 경우에만 별도의 약칭 메서드를 만들고 확신이 서지 않으면 만들지 말자

  3. 매개변수 목록은 짧게 유지하자 -> 4개 이하, 같은 타입의 매개변수 여러개가 연달아 나오는 경우는 특히 해로움 -> 여러 메서드로 쪼개기, 매개변수 여러개를 묶어주는 도우미 클래스를 만들기, 두 기법을 혼합한 빌더패턴을 메서드 호출에 응용하기

    public void calculate(int num1, int num2, int num3, int num4) {
    int sum = num1 + num2;
    int multi = sum * num3;
    // 등등
    // 매개변수 타입이 같으면 헷갈려서 실수 할 수 있음 -> 실수하면 값이 다르게 바뀜
    }
  4. 매개변수 타입으로는 클래스 보다는 인터페이스가 낫다

    //이거 보다는
    public void calculate(ArrayList<Integer> nums) {
    }
    //이게 낫다
    public void calculate(List<Integer> nums) {
    }
  5. boolean 보다는 원소 2개짜리 열거 타입이 낫다

    
    //이것 보다는
    if(x == true) {
    return 1;
    } else {
    return 2;
    }

//이렇게 하면 public enum Num {ONE, TWO} if(x == Num.ONE){ return 1; }else { return 2; } //추후 THREE가 생길 수 있음 public enum Num {ONE, TWO, THREE} if(x == Num.ONE){ return 1; }else if(x == Num.TWO){ return 2; } else { return 3; }

OikimiO commented 1 year ago

의미있는 이름

  1. 한 개념에 한 단어를 사용해라
    • 예를 들어 조회라는 개념의 메서드를 클래스마다 get, fetch, retrieve로 사용하면 혼동이 옵니다.
    • 그래서 같은 개념의 메서드는 일관성 있는 메서드를 하나로 정하여 사용하는 것이 좋습니다.
  2. 의미있는 맥락을 추가하라

    • 메서드 하나에 담긴 의미가 많을 경우 독자가 맥락을 유추해야될 경우가 생길 수 있습니다.
    • 그래서 모호한 부분을 줄이고자 메서드를 클래스로 분류해 그 의미대로 세부적인 메서드와 변수를 만들면 읽는 프로그래머(독자)들이 소스를 통해 좀 더 명확히 파악할 수 있게 됩니다.
    • 그 경우는 다음과 같습니다.
      
      private void printGuessStatics(char candidate, int count){
      String number;
      String verb;
      String pluralModifier;

    if(count == 0){ number = "no"; verb = "are"; pluralModifier = "s"; }else if(count == 1){ ... }else{ ... } ... print(); }

    - 현재 메서드에선 아무리 변수의 이름을 명확하게 짓더라도 읽는 프로그래머들의 해석이 중요해 집니다.
    - 그 이유는 변수의 명칭을 넣지만 분기별로 그 변수의 값이 매번 달라지기 때문입니다. 
    
    ```java
    public class printGuessStatics{
    String number;
    String verb;
    String pluralModifier;
    
    public String make(char candidate, int count){
      createPluralDependentMessagePart(count);
      return print();
    }
    
    public void createPluralDependentMessagePart(int count){
     if(count == 0){
    thereAreNoLetter();
     }else if(count == 1){
        thereAreOneLetter();
     }else{
        thereAreManyLetter(); 
     }
    
    }
    
    public void thereAreNoLetter(){
       number = "no";
       verb   = "are";
       pluralModifier = "s";
    }
    
    ...
    }
    • printGuessStatics을 하나의 클래스(=객체)로 보면서 그 속성과 특징을 명확하게 파악할 수 있게되었습니다.
    • 예시로 이전 코드에서는 소스를 통해 분기의 내용을 독자가 직접 파악해야 했지만 이번 코드에선 분기 조건에 따라 출력되는 변수 값을 의미있는 하나의 메서드로 만들어 당장 구현은 어떻게 되는지 모르지만 어떤 의미로 사용했는지에 대한 유추는 가능해 집니다.
    • 무작정 메서드명을 나눌 필요는 없지만 필요에 따라 한 메서드에 너무 많은 의미가 담겨 있을 경우에는 class로 분류해 변수와 메서드를 만드는 것도 좋은 방법이라 생각합니다.
DKKwag commented 1 year ago

오브젝트

  1. 다형성이란 동일한 메시지를 수신했을 때 객체의 타입에 따라 다르게 응답할 수 있는 능력 대표적인예 ) 오버라이딩, 오버로딩

  2. 합성이란 다른객체의 인스턴스를 자신의 인스턴스 변수로 포함해서 재사용하는 방법

  3. 상속은 두 가지 관점에서 안좋은 영향을 미친다.

    • 캡슐화 위반 : 부모 클래스의 구현이 자식 클래스에게 노출되기 때문
    • 설계가 유연하지 않다 : 부모와 자식 클래스의 관계를 컴파일 시점에 결정 하기때문, (실행 시점에서 객체의 종류를 변경하는 것이 불가능)

결론. 합성은 상속이 가지는 두 가지 문제점을 모두 해결한다. - 대부분의 설계에서는 상속과 합성을 함께 사용한다.