## 3주차 토요스터디 ### 참여자 - vetto - harry - 리지 - 송준 - (새홍) ### 진행일시 2023.01.28 ## 👨‍🔬 실험주제 : SOLID ### SRP(Single Responsibilty Principle) 클래스가 하나의 책임을 갖도록 그 책임과 관련된 메서드들만 구현한다. ### OCP(Open/closed principle) 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. ### LSP(Liskov substitution principle) 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다 ### DIP(Dependency Inversion Principle) 상위레벨 모듈은 하위레벨 모듈에 의존하면 안된다. ### ISP(Interface segregation principle) 프로그램 객체는 사용하지 않는 메소드에 의존하면 안된다. - 인터페이스를 일반화하여 구현하지 않는 인터페이스를 채택하는 것보다 구체적인 인터페이스를 채택하는 것이 더 좋다는 원칙 ```swift! // 1. DIP 원칙 protocol Validatable { func isValid(data: String) -> Bool //func check() ; OCP 원칙을 준수하고자 ISP 원칙을 따름 } // 2. ISP 원칙 protocol Check { func check() } struct ValidName: Validatable, Check { func isValid(data: String) -> Bool {} func check() {} } struct ValidAge: Validatable { func isValid(data: String) -> Bool {} } struct ValidPhoneNumber: Validatable { func isValid(data: String) -> Bool {} } struct ValidAdress: Validatable { func isValid(data: String) -> Bool {} } class ValidateContact { var valid: [String: Validatable] = [ "이름": ValidName(), "나이": ValidAge(), "연락처": ValidNumber() ] valid["이름"].isValid() valid["나이"].isValid() valid["연락처"].isValid() } class InsertionContact { // 연락처 추가 } class SearchContact { // 연락처 검색 } class LookupContact { // 연락처 조회 } ``` #### 1. SRP 원칙 - 추상화의 범위를 좁혀서 클래스가 하나의 책임을 갖도록 그 책임과 관련된 메서드들만 구현한다. - 연락처 검증, 추가, 검색, 조회 기능을 담당하는 타입을 구현하여 SRP원칙을 준수한다. #### 2. OCP 원칙 - `Validatable`을 채택함으로써 이름, 나이, 연락처 검증뿐만아니라 다른 검증 기능이 필요한 경우에도 기능 확장에대해서 유연하게 대처할 수 있다. #### 3. DIP 원칙 - `Validatable` 프로토콜을 채택하고 있는 타입들이 모두 `Validatable`의 `isValid` 메서드에 의존 #### 4. ISP 원칙 - `Validatable` 프로토콜 안에 `check()`라는 메서드를 만들지 않고, 새로운 프로토콜에 메서드 생성 #### 5. LSP 원칙 - `Validatable` 프로토콜을 채택하고 있는 `struct`에서 추상적인 개념을 구체화 시키고 기능을 모두 수행하고 있는 측면에서 원칙을 준수한다.