목록2023/05/16 (5)
Joonas' Note
정의 Dependency Inversion Principle (DIP; 의존관계 역전 원칙) 프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다. 더 자세히는 이렇게 말한다. 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 1. 상위 모듈은 하위 모듈에 의존해서는 안된다. 상위 모듈과 하위 모듈 모두 추상화에 의존해야 한다. 2. 추상화는 세부 사항에 의존해서는 안된다. 세부사항이 추상화에 의존해야 한다. 의존 관계가 많을수록 코드의 변경이 잦아지는 것은 당연하다. 변경할 곳이 많다는 의미는 코드를 파악하고 수정하는 일이 무척 어렵다는 뜻이다. 의존 관계에 신경을 쓰는 이유는 이런 부분..
정의 Interface Segregation Principle (ISP; 인터페이스 분리 원칙) 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다. 위반 사례 이 ATM기는 총 3개의 모듈을 가지고 있는데, 어떤 거래(transaction)에 대해서 입금(Deposit), 출금(Withdrawal), 송금(Transfer) 모듈을 각자 만들었다. 각 모듈은 전문화된 기능을 가지기 위해 분리되었지만, 무언가 이상하다. 입금 거래 모듈은 입금만 하면 되는데, 위 구조와 같다면 코드가 이럴것이다. public class DepositTransaction extends Transaction implements UI { @Override public void requestDepositAm..
정의 Liskov Substitution principle (LSP; 리스코프 치환 원칙) 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 어떤 모듈 S가 모듈 T의 하위 모듈이라면, 속성의 변경없이 T를 S(상위)로 교체할 수 있어야 한다고 한다. 즉, 부모 클래스와 자식 클래스가 일관되어야 한다는 뜻이다. 위반 사례 이를 위반하는 대표적인 사례로는 원-타원 문제 (또는 사각형-정사각형 문제)가 있다. class Rectangle { private int width; private int height; public void setWidth(int width){ this.width = width; } public void setHeight(int he..
SOLID 원칙들은, 소프트웨어 작업에서 프로그래머가 소스 코드를 읽기 쉽고 확장하기 쉽게 될 때 까지 리팩토링하여 코드 냄새를 없애기 위해 쓰기 좋은 지침이다. 정의 Open/Closed Principle (OCP; 개방-폐쇄 원칙) 소프트웨어 요소는 확장에는 열려 있으나, 변경에는 단혀 있어야 하다. 모듈 중 하나를 수정했는데, 그 모듈을 사용하는 모든 모듈의 코드를 수정하는 일이 있으면 안된다는 뜻이다. 조금만 떠올려봐도 얼마나 끔찍한 일인 지 알 수 있다. 확장에 대해 열려 있다. 이것은 모듈의 동작을 확장할 수 있다는 것을 의미한다. 애플리케이션의 요구 사항이 변경될 때, 이 변경에 맞게 새로운 동작을 추가해 모듈을 확장할 수 있다. 즉, 모듈이 하는 일을 변경할 수 있다. 수정에 대해 닫혀 있..
SOLID 원칙들은, 소프트웨어 작업에서 프로그래머가 소스 코드를 읽기 쉽고 확장하기 쉽게 될 때 까지 리팩토링하여 코드 냄새를 없애기 위해 쓰기 좋은 지침이다. 정의 Single Responsibility Principle (SRP; 단일 책임 원칙) 하나의 클래스나 모듈은 단 하나의 책임만 가져야 한다. 하나의 함수가 여러 개의 일을 한다는 뜻은 예측 불가능하다는 의미이다. 예시 아주 단적인 예시로, 끝 원소를 제거를 하는 함수가 삭제되는 원소를 반환할 이유는 없다. 제거만 하면 된다. Element pop() { if (size < 1) throw "Empty"; size = size - 1; return array[size + 1]; // ? } 삭제되는 값을 얻고 싶다면, pop 하기 전에 끝자..