본문 바로가기
도서/파이브 라인스 오브 코드

1부- 6장. 데이터 보호(단계 4/4)

by 패쓰킴 2023. 10. 14.
728x90
< 코드개선 4단계 >

1. 긴 함수 조각내기
2. 타입 코드 처리
3. 유사 코드 통합
4. 데이터 보호

 

데이터 캡슐화

데이터와 기능에 대한 접근을 제한하는 캡슐화에 중점을 둔다.

데이터 캡슐화란 변수와 메서드를 클래스로 옮기는 과정을 말한다. 이는 접근할 수 있는 지점을 제한하고 구조를 명확하게 하며 응집력을 더 명확하게 하는데 도움을 준다.

 

1) getter 와 setter를 사용하지 말 것

부울(Boolean)이 아닌 필드에 setter나 getter를 사용하지 말자.

문제점 ->

getter: 캡슐화를 해제하고 불변속성을 전역으로 만들어 객체를 얻은 어느 곳에서나 호출하여 수정할 수 있게 만든다.

setter: 데이터를 반환하도록 getter를 수정하고 이 데이터를 받는 곳에서도 이러한 구조를 받을 수 있도록 수정해야한다. 이러한 구조는 결합도를 높이게 된다.

이 규칙은 디미터 법칙에서 유래했다. 디미터 법칙이란 어떤 객체에 접근할 때 점(.)을 통해 2 단계이상 접근하면 안된다는 법칙이다. 보통 데이터에 직접 접근할 수 없지만 참조를 통해 얻을 수 있는데 객체지향 언어에서는 일반적으로 getter를 통해 발생하게 되어 이런 규칙이 존재 한다. 

따라서, 내부 구조를 어느 정도 알고 있어야 결합도를 낮추고 캡슐화 할 수 있다.

 

2) 공통 접사를 사용하지 말 것

코드에는 공통 접두사나 접미사가 있는 메서드나 변수가 없어야 한다. 보통 이름을 지을 때 username, startTimer 같이 이해하기 쉽도록 만들지만 재사용 및 유지보수성을 생각하면 클래스를 사용하여 캡슐화 하는 것이 더 좋은 방법이다.

func accountDeposit() {}
func accountTransfer() {}

위와 같은 메서드는 공통적으로 account를 사용한다. 만약 account와 관련된 변수나 메서드가 더 필요하거나 수정을 해야 한다면 유지보수가 복잡해지고 어려워 질 수 있다. 그래서 account를 캡슐화하여 접근하여야 한다.

class Account {
    func deposit() {}
    func transfer() {}
}

 

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

만약 map이라는 객체를 만들지 않고 map을 사용한다는건 불가능 하다. 무조건 map이 먼저 만들어 진 후 사용할 수 있는데 이것을 순서 불변속성 이라고 한다. 이는 개발자의 실수를 만들 수도 있고 객체지향 언어에서는 생성자가 항상 객체의 메서드보다 먼저 호출되어야 한다.생성자를 이용하여 불변속성을 제거하는 것을 순서 강제화 라고 한다.

class Map {
  func transform() {}
}

// 생성자를 이용하면!
class Map {
  init() {}
}

class ViewController() {
  func viewDidLoad() {
    Map()
  }
}

위와 같이 실행의 순서에 대한 불변속성을 제거하면 어떤 메서드를 먼저 호출해야하는지 기억할 필요가 없어진다.

728x90

댓글