"자동차 만들어 주세요." 라는 요구사항을 받았다. 자연스레 데이터 중심으로 이어진다. 자동차에는 엔진이 있고, 프레임이 있고 등등.. 데이터 중심 사고로 빠지는 함정 중 하나이다. 하지만 객체를 구분 짓는 요인은 데이터가 아니라 행동이다.
- TDA(Tell, Don’t Ask)원칙을 따르자.
- 데이터 중심의 사고보다는 행동중심의 사고를 해라
// 데이터 중심
class car{
private Engine engine;
private Frame frame;
private List<Wheel> wheels;
}
// 행동 중심
class car{
public void drive() {}
public void accelerate(float speed)
..
}
- 어떤 행동(drive, acceleate)을 할 수 있는지가 곧, 역할(vihicle)을 만든다.
덕 타이핑
- 덕타이핑은 행동이 같으면 같은 클래스로 본다는 것이다.
- 행동이 역할이고, 역할이 객체를 정의한다.
'행동이 곧 클래스라는 것'의 타당성을 부여하기 위해 덕타이핑 개념을 설명했다. 동적 언어는 같은 행동을 하면 같은 클래스로 인정해주는 기능이 있다. 일종의 프로그램 세계의 허용(?)이다. 왜냐하면 소프트웨어는 보이지 않는 것을 형상화해나가는 것이다. 이때 자로 잰듯한 강한 제한을 두게 되면 유연함이 부족해진다. 그러므로 의도에 어느 정도 일치하는 행동을 한다면 같은 클래스로 인정해준다.
아래는 타입 스크립트로 짜여진 코드이다. Duck과 Dog는 서로 상속 관계가 없다. 하지만 같은 행동(함수)를 하기 때문에 상속이 가능하다.
class Duck {
walk = (): void => {
}
swim = (): void => {
}
}
class Dog {
walk = (): void => {
}
swim = (): void => {
}
}
// 상속 가능
const duck: Duck = new Dog;
행동과 구현
- 인터페이스로 행동 중심의 설계를 해라.
- 인터페이스는 약속이다. 팀원들이 구현할 때 꼭 지켜야한다. 다만, 이상하다면 설계를 바꿔야 한다.
- 행동 중심의 사고를 하다가도 구현을 신경 쓰게 되면 속성(객체의 변수)을 만들게 된다. 그렇게 되면 데이터 중심의 사고로 이어질 수 있다. 그러므로 인터페이스로 설계하며, 행동 중심의 사고를 유지해라.
// 데이터 중심적
class Car{
Double speed;
}
interface Car{
void accelate(Double speed);
}
3-3. 인터페이스
- 인터페이스와 행동은 다르다.
- 인터페이스는 ‘나를 조작하고 싶다면, 이런 메세지를 보내면 된다’ 고 알려주는 수단이다.
3-4. 행동과 역할
- 역할에 집중하면 행동이 나온다.
- (x) 자동차(데이터) 클래스를 만들자.
- (o) 탈것(역할) 클래스를 만들어보자.
- “어떤 질문을 하느냐”가 사고 방향을 정한다. 자동차라는 것을 생각했을 때는 데이터 중심의 생각을 하게 된다. ‘휠'은 어떻고 ‘프레임’은 어떻고.. 등등. 하지만 탈것(역할)으로 생각한다면, ‘탑승한다.’, '달린다’ 등 행동위주에 생각을 하게된다.
- 추상화나, 다형성 이야기는 제외했다. 행동과 역할에 집중하라는 것이 단순히 추상화를 많이 하라는 뜻이 아니다.
3-5. 메서드
- 함수와 메서드의 차이
- 함수 : 입력, 출력
- 메서드 : 해결할 방법을 서술한다.
- 명시적 함수와 암묵적 함수
- 명시적 함수
- 매개변수를 통해 직접 전달되는 입력을 말한다. 예를들어 Math.plus(1, 2) 와 같은 함수를 말한다. 1,2는 중간에 수정 과정 없이 결과값에 직접적으로 영향을 미치는 입력값이다.
- 함수에 불변성이 적용되면 ‘순수 함수’가 된다. 그리고 불변의 객체와 함수를 만드는 방식의 프로그래밍을 함수형 프로그래밍이라고 한다.
- 암묵적 함수
- 암묵적 입력 혹은 암묵적 출력을 포함한 함수이다.
- 암묵적 입력 : 명시적으로 전달되지 않는 파라미터, 인자가 없는데 결과를 반환한다. (ex. cookie조회)
- 암묵적 출력 : 반환값 이외에 함수를 실행하는 동안에 외부에 영향을 주는 행위들 (ex. Alert)
- 암묵적을 부작용이라고도 부른다.
- 암묵적 입력 혹은 암묵적 출력을 포함한 함수이다.
- 좋은 함수를 만드는 방법
- 암묵적 함수를 최소화하기.
- 명시적 함수와 암묵적 함수를 분리해 내고, 메인 함수에서 흐름을 관리한다.
- 명시적 함수
참고
- https://jojoldu.tistory.com/703
- https://jaeyeong951.medium.com/ (객체지향 바르게 이해하기 : 객체지향의 핵심)
'기술도서 > 자바스프링 개발자를 위한 실용주의 프로그래밍' 카테고리의 다른 글
자바스프링 개발자를 위한 실용주의 6. 안티패턴 (0) | 2024.11.09 |
---|---|
자바스프링 개발자를 위한 실용주의 5. 순환참조 (0) | 2024.11.09 |
자바스프링 개발자를 위한 실용주의 4. SOLID (0) | 2024.11.09 |
자바스프링 개발자를 위한 실용주의 2. 객체 종류 (0) | 2024.11.09 |
자바스프링 개발자를 위한 실용주의 1. 절차지향비교 (0) | 2024.08.11 |