ex ) 구현을 외부에 노출 / 구현을 숨김
public interface Vehicle {
double getFuelTankCapacityInGallons();
double getGallonsOfGasoline();
}
public interface Vehicle {
double getPercentFuelRemaining();
}
기차 충돌 - 객체가 한 줄로 이어진 기차처럼 보이는 코드 (디미터 법칙 어김)
**final** String outputDir **=** ctxt**.**getOptions**().**getScratchDir**().**getAbsolutePath**();**
구조체 감추기 - 객체를 함수 내에서 줄줄이 호출하는 형식
Option options = foo.getOption();
File files = options.getFile();
자료 추상화에 대한 예시를 가져와 보았다.
기존 코드는 모델 자료형에 대해 다음과 같이 정의하였다.
export interface BookListModel {
No: number
일련번호: string
도서명: string
저자: string
출판사: string
대출가능여부: boolean
대출인: string
}
이는 책에 따르면 외부에 구현을 노출한 예시가 된다. 구현을 숨기기 위해서는 추상화를 진행해야 하는데, 바꾸자면 다음과 같이 바꿀 수 있다.
export interface BookListModel {
whoBorrow : string
bookId : string
writerAndPublisher : string
}
최대한 기존 변수들을 추상화 하였다. 이러면 구현에 대한 것을 외부에 숨길 수는 있으나, 사실 구체성이 떨어지기 때문에 properity로 사용하기에 적합한가는 많이 어렵다. 또한 props보다 직관성이 떨어지기 때문에 추상화를 하기 위해서는 작명에 보다 신중해야 할 것이다.
다음은 reactjs-popup의 구현 일부이다.
export interface PopupProps {
trigger?: JSX.Element | ((isOpen: boolean) => JSX.Element);
open?: boolean;
disabled?: boolean;
nested?: boolean;
defaultOpen?: boolean;
on?: EventType | EventType[];
children: React.ReactNode;
position?: PopupPosition | PopupPosition[];
offsetX?: number;
offsetY?: number;
arrow?: boolean;
modal?: boolean;
lockScroll?: boolean;
closeOnDocumentClick?: boolean;
closeOnEscape?: boolean;
repositionOnResize?: boolean;
mouseEnterDelay?: number;
mouseLeaveDelay?: number;
onOpen?: (event?: React.SyntheticEvent) => void;
onClose?: (event?: React.SyntheticEvent | KeyboardEvent | TouchEvent | MouseEvent) => void;
contentStyle?: React.CSSProperties;
overlayStyle?: React.CSSProperties;
arrowStyle?: React.CSSProperties;
className?: string;
keepTooltipInside?: boolean | string;
}
이 역시 구현을 추상화 하였다고 보기에는 다소 어렵다. 만약 이 코드가 추상화를 하였다고 하더라도 그 정도에 대해서는 코드를 작성하는 이에게 전적으로 맡겨야 할 일이다. 따라서, 추상화에 대한 정도는 사실 모호하기 때문에 코드를 작성하는 이에게 그 정도를 맡겨야 하지만, 구현을 외부에 숨기기 위해서 아예 날 것의 구현을 표현하는 것은 삼가야 한다.
다음으로, 본문에 대한 예시를 찾기 전에 생각했던 바로 기차 충돌 및 getter, setter를 구조에 섞은 것이 많을 것이라고 예상하였다. 하지만 다행히 이에 대한 코드는 작성하지 않아, 클린 코드를 어느 정도는 지키고 있다는 안도감이 들었다.
댓글