SOLID 설계 원칙 중 하나 - "좋은 컴포넌트는 확장에 열려 있고 수정에 닫혀 있어야 한다."
언제나 요구사항과 디자인은 활용은 변하고 삭제되고 추가되고 예외에 생겨난다.
수정편 - 전반에 걸친 수정사항이 생겼을때
확장편 - 기존과 많은 것을 공유하나 일부만 다르게 만들어야 될때 - ex) Input Field에 기본적으로 X 버튼 기능을 선택적으로 추가 하고 싶어요
확장의 경우 기존 컴포넌트의 베리에이션인지, 타 atom과의 조합일지 고민이 필요함. (이게 이 컴포넌트에 포함되는게 맞아?)
bad example) button에 text를 변경할수 있게 하기 위해 처럼 만들어 둠.
요구사항 - 아이콘이 있는 버튼이 필요해요 → 대응 불가, 컴포넌트 스펙 변경
요구사항2 - 아이콘이 상단에 있는 디자인도 생김
→ Bad 설계 (사용시 주의 사항이 늘어남. 아이콘이 버튼의 주요 기능이 아님에도 기본 스펙이 되어버림)
Maybe good? → → Button을 컨네이터 형태의 컴포넌트로 설계했더라면 아이콘만 추가해줬을수도 있다.
근데 언제나 그렇듯 정답은 없고 균형점 어딘가를 타협하고 만족해야 함.
"Write less Do more" is Always Best!
(이론을 공부해도 현실로 오면 달라짐 저만의 작성 요령을 공유 합니다.)
일단 그냥 하드 코딩을 한다.
작성하다보면 필연적으로 복붙을 하는 경우가 생긴다. (그게 1줄 짜리 input일지라도...)
이때 wrap하고,
atoms, molecule, organisms 중 어느 폴더에 갈지 고민 하고 이름을 짓는다.
변하는 내용을 class, prop, slot중에서 택하고 replace
앞으로는 이제 만든 컴포넌트만 쓴다.
반복
1줄짜리 인라인 컴포넌트 →
wrapping 컴포넌트
레이아웃 Wapper
테마 Wapper
간격
if block
Form Element, input, button →
A, Img, Svg 등 기본 → 링크 기능도 확장이 가능하고(새고로침 없는 페이지 이동, 스크롤 위치 유지 등), Img는 데이터가 없을때 처리나, lazyLoading 혹인 점진적 로딩, 스켈레톤 loading image 등 추가 기능이 가능하다.
마크업, 그리고 컴포넌트를 설계하고 작성하고 페이지로 만드는 과정은 저보다 훨씬 더 전문가의 관점에서 더 많은 경험과 해법이 있을꺼라고 생각합니다.
반면 뭔가 더 나은 해결책이 있을 것 같은 찜찜한 작업 방식이나 해당 분야의 고질적인 문제가 여전히 산재할 수도 있을거라 생각합니다.
(가령, 디자이너와 기획자와 프론트 엔드 개발자 사이의 변화 대응에 대한 프로세스와 커뮤니케이션 문제는 왜 항상 생기는 걸까?)
(왜 프론트 개발자가 마테리얼 UI를 썼는데 모양이 이상하게 나올까? 왜 부트스트랩을 썼는데 디자인이 안될까? 등)
Functional CSS나, Atomic Design, Svelte 등이 이 문제들을 다 해결을 못할지라도 결국은 더 나은 시스템이나 프레임워크, 아키텍쳐등이 저 전보다 나은 개발환경을 만들어 줄 꺼라고 생각합니다.
해서 저는 저대로 계속 새로운 트렌드를 공유할테니 저희 셀 내부에서도 끊임없는 문제제기와 소통을 통해서 지금껏 없던 창의적인 해법이 나오기를 기대합니다 (웃음)
view를 Array와 Object로 생각하기
Array - https://developer.mozilla.org/ko/docs/Learn/JavaScript/First_steps/Arrays
Object - https://developer.mozilla.org/ko/docs/Learn/JavaScript/Objects/Basics
svelte에서 Array와 Object를 이용해서 rendering 하는 법을 배운다.
svelte #each를 익힌다.
svelte에서 Array의 변경을 업데이트 하기 위한 방법을 이해하자
타이머 2탄, setTimeout - setInterval의 1회성 버전
[고급] javascript Array Method 익히기
split, map, sort 등...
state → render를 하기 위해서 state의 형태는 어떻게 생겼을까? (혹은 반대로 HTML를 먼저 그려보고 어느 영역의 data가 state로 올라가야 할까?) 어떠한 사용자 액션이 있는가? state를 변경하기 위한 조건은 1) 어떤 액션 2) 어떤 조건이 있는가?