→ 각 분야별로 시스템을 모듈화 할 것이며, 서로 이를 공유해야한다. 이 때 시스템들이 비슷한 수준의 추상화를 이룬다면 협업이 더 수월해질 것이다. 코드를 깨끗이 유지한다면 낮은 추상화 수준에서 관심사를 분리하기 쉬워진다.
예시로 제일 잘 볼 수 있는 부분은 관심사 분리 부분 및 메인 분리 부분이다. 특히 관심사 분리는 본문에서 다루고 있는 제작과 사용의 분리를 어플리케이션, 함수 뿐 아니라 웹/앱에서 스타일에도 적용이 가능하다.
function Chip({ isSelected, name, itemClicked }: ChipProps) {
...
return (
<div
className={
isSelected
? isHovered
? "selected-hovered"
: "selected"
: isHovered
? "unselected-hovered"
: "unselected"
}
onClick={buttonClicked}
onMouseEnter={() => {
setIsHovered(true)
}}
onMouseLeave={() => {
setIsHovered(false)
}}
>
{name}
</div>
)
}
위 함수에서 스타일로 사용하고 있는 css를 따로 파일로 뽑아서 아래와 같이 관리한다.
.selected {
display: inline-block;
border: 1px solid var(--primary-color);
border-radius: 100px;
text-align: center;
padding-top: 5px;
padding-bottom: 5px;
padding-left: 7px;
padding-right: 7px;
margin: 3px;
background-color: white;
color: var(--primary-color);
font-size: 0.8em;
/* 글자 스크롤 방지 */
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.selected-hovered {
...
}
이렇게 관리한다면, 함수는 스타일이 어떻게 생성되었는지 과정을 알 수 없으며, 오로지 사용만 하게 된다. 이 역시도 관심사 분리에 해당된다.
function ChipSelector({ title, initialSelectedMember, memberList, setMember }: ChipSelectorProps) {
...
return (
<div className="menu-container">
...
<div className={"chip-container"}>
{currentChips &&
currentChips.map((item) => {
return (
<Chip
index={item.index}
key={item.index}
isSelected={item.isSelected}
name={item.name}
itemClicked={() => itemSelectStateToggle(item.index)}
/>
)
})}
</div>
</div>
)
}
칩을 만들어주는 함수도 칩을 골라서 사용하는 함수에 사용되는데, 이 때에도 이 칩이 어떻게 생성되는지는 칩 사용 함수가 알 수가 없게 된다. 이렇게 거슬러 올라라면 메인에서도 특정 함수 및 컴포넌트의 사용 및 생성이 분리되어 적용할 수 있게 된다.
그리하면 코드를 조금 더 서사적으로 작성이 가능하다. 또한 관점도 분리할 수 있게 되므로, 코드를 이해하는 데에 있어 더욱 수월할 것이다.
댓글