팀 프로젝트의 코드를 보면서 OOP를 제대로 지키지 못한 상황들이 많았다는 생각이 든다. 물론 그때도 여러 생각을 하고 있었지만, 원칙을 따르기보다 우선 구현을 우선시 했다. 그래서인지 올바른 (best practice) 코드를 구성하지 못했는데, 개선을 하면서 조금씩 바꿔보고자 한다!
특히 Law of Demeter 관련해서 관심이 커지는 상황이었는데, 현재 프로퍼티를 접근하는 방식이 아래와 같기 때문이다.
private func switchToTextfield(_ textField: UITextField) {
let email = registrationView.emailTfView.textfield.text!
let password = registrationView.pwTfView.textfield.text!
switch textField {
case self.registrationView.nicknameTfView.textfield:
self.registrationView.emailTfView.textfield.becomeFirstResponder()
case self.registrationView.emailTfView.textfield:
checkIdPattern(email) ? self.registrationView.pwTfView.textfield.becomeFirstResponder() : self.registrationView.emailTfView.textfield.becomeFirstResponder()
case self.registrationView.pwTfView.textfield:
validPasswordPattern(password) ? self.registrationView.doublecheckPwView.textfield.becomeFirstResponder() : self.registrationView.pwTfView.textfield.becomeFirstResponder()
case self.registrationView.doublecheckPwView.textfield:
self.registrationView.doublecheckPwView.textfield.resignFirstResponder()
default:
self.registrationView.doublecheckPwView.textfield.resignFirstResponder()
}
}
이렇게 객체를 접근해서 값을 직접 변경하고 있는게 맞을까 싶은 마음이 너무 컸다. 따라서 오늘 다시 한번 OOP에 대해서 정리를 해보고자 한다.
기본은 빛 바래지 않도록 계속 다듬어야 하니까!
OOP의 기본 소양이라 불리는 '솔리드 원칙'을 따르고 나면 추가로 고민하면 좋을 원칙들은 많이 존재하는 것 같다. 여러 원칙들 중, Law of Demeter(LoD)를 개인적으로 중요할 것 같아서 먼저 적어본다.
LoD는 하나의 유닛이 다른 유닛의 '속' 상황에 대해서 알면 안된다는 점이다. 더 간단하게 이야기를 하자면 커피를 주문하는 고객 입장에서 카페의 커피빈 갯수, 커피 머신 상태 등에 대해 알면 안된다는 점이다. 고객은 단지 "주문"을 통해 커피를 부탁할뿐, 카페 속사정은 알 필요가 없다는 점이다.
참고로 dot syntax로 데이터를 접근한다고 하면 단 한번만 허락된다고 한다. 결국 위에 작성한 내 코드는 위배를 한 줄마다 3번이나 한 셈이다!
직접 프로퍼티를 접근하지 않으면서 데이터를 가질 수 있는 방법은...
1. 함수, 메서드로 호출
2. delegate로 데이터 전달 받기
지금은 위 두가지 밖에 생각나지 않는다.
이전에도 적었던 것 같지만... 초반에는 이 LoD 법칙을 따르기 위해서는 메서드 혹은 함수를 생성해서 A에서 B로 데이터를 넘겨주거나 전달하는 구조를 만들면 해결되는 줄 알았다.
하지만, 파이널을 하면서 느낀 점은 그렇게 직접적으로 코드를 전달하는 구조는 올바른 데이터 전달 방식이 아니었다. 물론 표면적으로 LoD 원칙을 따르는 구성이었겠지만 말이다.
textfield같은 경우도 하나하나 객체의 textfield를 접근해서 프로퍼티를 직접 적용하고 있다는 점에서 많은 고민이 생겼다.
어떻게 해결할 수 있을까!
Dependency Injection 말고 또 있을까?