스터디/Five Lines of Code

Five Lines of Code 6장. 데이터 보호

마디니 2023. 10. 29. 14:47
반응형

getter 없이 캡슐화 하기

[규칙] "getter 와 setter 를 사용하지 말 것"

정의

  • 부울(boolean)이 아닌 필드에  setter나 getter를 사용하지 말 것

설명

  • 부울이 아닌 필드를 직접 할당하거나 반환하는 메서드를 사용하지 말 것.
  • getter: 캡슐화를 해제하고 불변속성을 전역적으로 반들게 된다. (객체를 얻은 어느곳에서나 public 메서드를 호출할 수 있으며 예상하지 못한 방식으로 수정할 수 있기 때문에)
  • setter: setter를 통해 내부 데이터 구조를 변경하고 getter를 통해 이 변경된 데이터 구조를 반환시키므로 강한 결합을 만들게 된다.??
pull 기반(pull-based)의 아키텍처
기능을 수행하는 메서드 는 없고, 수동적인 데이터 클래스들과 여기저기서 데이터를 혼합해서 모든 작업을 수행하는 클래스로 이루어진 아키텍처
push 기반(push-based)의 아키텍처
데이터를 가져오는 대신 인자로 데이터를 전달하는 아키텍처로 모든 클래스가 자신의 기능을 가지고 있다.

풀 기반 vs 푸시 기반

스멜

  • "디미터의 법칙"에서 유래
디미터 법칙이란?
디미터 법칙(Law of Demeter)은 데메테르 법칙이라고도 불리며 줄여서 LoD라고도 불립니다. 이 법칙은 "최소한의 지식 원칙(The Principle of Least Knowledge)으로 알려져 있으며, 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 것을 의미합니다.
실제로 Demeter라는 프로젝트를 진행하던 개발자들은 어떤 객체가 다른 객체에 대해 지나치게 많은 정보를 알고 있다 보니, 서로에 대한 결합도가 높아지고 이로 인해 좋지 못한 설계를 야기한다는 사실을 발견하게 됩니다. 그래서 이를 개선하고자 다른 객체에게 어떠한 자료(내부 구조)를 가지고 있는지 숨기고 함수를 통해 공개하게 만들었는데 이것이 바로 디미터 법칙입니다.
즉, 간단하게 말하면 여러개의 .(dot)을 최대한 사용하지 말라는 법칙으로 말할 수 있으며, 디미터 법칙을 준수하게 되면 캡슐화를 높여 객체의 자율성과 응집도를 높일 수 있습니다. 한번 직접적인 예시를 통해 좀 더 자세히 알아보겠습니다.
(참고 블로그 - JuHyeong.dev)

의도

  • 해당 객체를 가져오는 방식과 강한 커플링이 되어있다.
  • 객체 사용자는 객체 소유자의 내부 구조를 어느정도 알고 있어야 하고, 필드 소유자는 이전 데이터 구조를 획득하는 방법을 계속 지원하지 않는 한 데이터 구조를 변경할 수 없다.
  • 푸시 기반 아키텍처에서는 서비스와 같은 메서드를 노출하므로 객체 사용자는 사용하는 메서드 내부 구조에 대해 신경쓰지 않아도 된다.

[리팩터링 패턴] getter와 setter 제거하기

설명

  • 코드를 데이터에 더 가깝게 이동 시켜 불변속성을 지역화 시킨 후 getter와 setter를 제거한다.

절차

  1. getter 또는 setter가 사용되는 모든 곳에서 오류가 발생하도록 비공개로 설정한다.
  2. 클래스로의 코드 이관으로 오류를 수정한다.
  3. getter 또는 setter는 클래스로의 ㅗ드 이관의 일부로 인라인화된다. 따라서 사용하지 않으므로 삭제해서 다른 사람이 사용하지 않게 한다.

간단한 데이터 캡슐화하기

[규칙] 공통 접사를 사용하지 말것

정의

  • 코드에는 공통 접두사나 접미사가 있는 메서드나 변수가 없어야 한다.

설명

  • 코드에는 공통 접두사나 접미사가 있는 메서드나 변수가 없어야 한다.

스멜

  • 코드에는 공통 접두사나 접미사가 있는 메서드나 변수가 없어야 한다.

의도

 

[리팩터링 패턴] 데이터 캡슐화

설명

  •  

절차

  1. 클래스 만들기
  2. 변수를 새로운 클래스로 이동하고 let을 private로 바꾸기. 변수의 이름을 단순한 것으로 정하고 변수에 대한  getter와 setter 만들기
  3. 변수가 더 이상 전역 범위에 없기 때문에 컴파일러가 오류를 발생시켜 모든 참조를 찾을 수 있게 해준다. 아래 다섯 단계를 통해 오류를 수정한다.
    1. 새 클래스의 인스턴스에 적합한 변수 이름을 선택
    2. 접근을 가상의 변수에 대한  getter 또는 setter로 변경
    3. 2개 이상의 다른 메서드에서 오류가 발생한 경우 이전의 변수명을 가진 매개변수를 첫 번째 매개변수로 추가하고 동일한 변수를 첫 번째 인자로 호출하는 쪽에 넣기
    4. 한 메서드에서만 오류가 발생할 때까지 반복한다.
    5. 변수를 캡슐화했다면 변수가 선언된 지점에서 새로운 클래스를 인스턴스화한다. 그렇지 않으면 오류가 발생한 메서드에 인스턴스화하는 부분을 만든다.

순서에 존재하는 불변속성 제거하기

[리팩터링 패턴] 순서 강제화

설명

  •  

절차

  1. 마지막으로 실행되어야 하는 메서드에 데이터 캡슐화를 적용
  2. 생성자가 첫 번째 메서드를 호출하도록 한다.
  3. 두 메서드의 인자가 연결되어 있으면 이러한 인자를 필드로 만들고 메서드에서 제거

열거형을 제거하는 또 다른 방법

비공개 생성자를 통한 열거

숫자를 클래스에 다시 매핑하기

반응형