기술 서적 정리/오브젝트

7장 객체분해

wampy 2023. 4. 9.

프로시저 추상화와 데이터 추상화

프로시저 추상화는 소프트웨어가 무엇을 해야하는지를 추상화하고, 데이터 추상화는 소프트웨어가 무엇을 알아야 하는지를 추상화한다.

프로시저 추상화와 기능 분해

기능 분해 방법을 이용한 급여 관리 시스템 구축

`급여 = 기본급 - (기본급 * 소득세율)`

  • 직원의 급여를 계산한다
    1. 사용자로부터 소득세율을 입력받는다
      • '세율을 입력하세요: ' 라는 문장을 화면에 출력한다
      • 키보드를 통해 세율을 입력받는다
    2. 직업의 급여를 계산한다
      • 전역 변수에 저장된 직원의 기본급 정보를 얻는다
      • 급여를 계산한다
    1. 양식에 맞게 결과를 출력한다
      • '이름: {직원명}, 급여 : {계산된 금액}' 형식에 다라 출력 문자열을 생성

기능 분해 방법에서는 기능을 중심으로 필요한 데이터를 결정한다. 기능이 우선이고 데이터는 기능의 뒤를 따름

public class TaxRate {
    private static String[] employees = {"유수완", "홍길동"};
    private static double[] basePays = {400, 300};

    // 직원의 급여를 계산한다
    public static void main(String[] args) {
        String name = "유수완";

        // 1. 사용자로부터 소득세율을 입력받는다.
        double taxRate = getTaxRate();

        // 2. 직원의 급여를 계산한다
        double pay = calculatePayFor(name, taxRate);

        // 3. 양식에 맞게 결과를 출력한다.
        System.out.println(describeResult(name, pay));
    }

    private static double getTaxRate() {
        // 1. '세율을 입력하세요:' 라는 문장을 화면에 출력한다.
        // 2. 키보드를 통해 세율을 입력받는다 (생략)
        System.out.println("세율을 입력하세요 : ");
        return 3.3;
    }

    private static double calculatePayFor(String name, double taxRate) {
        // 1. 전역 변수에 저장된 직원의 기본급 정보를 얻는다.
        int index = Arrays.asList(employees).indexOf(name);
        double basePay = basePays[index];
        // 2. 급여를 계산한다.
        return basePay - (basePay * taxRate);
    }

    private static String describeResult(String name, double pay) {
        return "이름 : " + name + ", 급여 :" + pay;
    }

}

문제점

  • 시스템은 하나의 메인 함수로 구성돼 있지 않다
  • 기능 추가나 요구사항 변경으로 인해 메인 함수를 빈번하게 수정해야 한다
  • 비즈니스 로직인 사용자 인터페이스와 강하게 결합된다
  • 하향식 분해는 너무 이른 시기에 함수들의 실행 순서를 고정시키기 때문에 유연성과 재사용성이 저하된다
  • 데이터 형식이 변경될 경우 파급효과를 예측할 수 없다

-> 변경에 취약한 설계를 낳는다

  •  

모듈

  • 시스템의 변경을 관리하는 기본적인 전략
    • 함꼐 변경되는 부분을 하나의 구현 단위로 묶고
    • 퍼블릭 인터페이스를 통해서만 접근하도록 만듦
    • 변경의 방향에 맞춰시스템을 분해
  • 기능 분해가 하나의 기능을 구현하기 위해 필요한 기능들을 순차적으로 찾아가는 탐색의 과정이라면,
  • 모듈 분해는 감춰야 하는 비밀을 선택하고 비밀 주변에 안정적인 보호막을 설치하는 보존의 과정이다
  • 시스템을 모듈 단위로 분해하는 방법? -> 시스템이 감춰야 하는 비밀을 찾자 -> 외부에서 내부의 비밀에 접근하지 못하도록 인퍼테이스를 만들자
    • 감춰야 하는 비밀
      • 복잡성 : 간단한 인터페이스 생성
      • 변경 가능성 : 하나의 모듈만 수정하면 되도록 변경 가능한 설계를 모듈 내부로 감춤

모듈의 장점과 한계

  • 장점
    • 모듈 내부의 변수가 변경되더라도 모듈 내부에만 영향을 미침
    • 비즈니스 로직과 사용자 인터페이스에 대한 관심사를 분리
    • 전역 변수와 전역 함수를 제거함으로써 네임스페이스 오염을 방지

데이터 추상화와 추상 데이터 타입

  • 클래스 - 추상 데이터 타입?
    • 클래스 : 상속과 다형성을 지원
    • 추상 데이터 타입 : 지원 x

'기술 서적 정리 > 오브젝트' 카테고리의 다른 글

8장 의존성 관리하기  (0) 2023.04.24
6장 메시지와 인터페이스  (0) 2023.04.03
오브젝트 스터디 2회, 3회 회고  (0) 2023.03.29
5장 책임 할당하기  (0) 2023.03.26
오브젝트 스터디 1회 회고  (0) 2023.03.18

댓글