C.W.K.
Stream
Lesson 03 of 04 · published

view 추가는 절대 model 을 안 바꿔

~11 min · invariant, views, open-closed

Level 0식은 재
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"view 가 자기를 렌더하려고 model 을 바꿔야 한다면, 문제는 view 가 아냐. model 이야."

강한 불변식

리팩터가 절대 조용히 깨면 안 되는 규칙이 있어: view 추가는 model 을 건드리지 않아. view 는 순수 projection 이야 — 모델을 읽고 그려. 필요한 기하(프렛, 건반, 비트 위치)는 모델의 기존 필드에서 끌어내고 아무것도 되쓰지 않아. 드럼 그리드는 비트 그리드를 깔려고 템포와 섹션을 읽지, 곡에 뭘 추가하지 않아.

변형 냄새

가끔 view 를 짓다가 렌더하려고 모델에 필드를 '추가해야' 하거나 노트를 손봐야 할 것 같을 때가 있어. 멈춰 — 그게 냄새고, 진단적이야. 둘 중 하나라는 뜻이야: 모델이 음악적 진실에 속하는 필드를 진짜로 빠뜨렸거나(그럼 모든 view 를 위해 의도적으로 모델에 추가해), 아니면 view 전용 상태를 공유 진실에 밀반입하려는 거야(하지 마 — view 에 둬). 절대 하면 안 되는 건 렌더러가 모델에 되써서 빈틈을 때우는 거야. 복사본과 발산이 정확히 그렇게 숨어들어.

view 엔 닫혀 있고, 새 view 엔 열려 있어

이건 음악 모자를 쓴 open-closed 아이디어야: 모델은 view 의 수정엔 닫혀 있지만, 시스템은 새 view 엔 열려 있어. bass 탭, 피아노 롤, 드럼 그리드를 영원히 더할 수 있고, 각 추가는 순수 가산이야 — 새 서브클래스, 진실 수정 0. view 추가가 모델 변경을 강제하는 날이 모델이 불완전했다는 걸 배우는 날이야. 유용한 정보지만, 그건 한 번 모두를 위해 내리는 모델 결정이지 — 절대 한 view 의 부작용이 아냐.

Code

view 는 읽어; 절대 되쓰지 않아·python
# 틀림 — 자기를 렌더하려고 model 을 변형하는 'view':
class BadDrumView(InstrumentView):
    def project(self, song):
        song.notes.append(make_kick(song.tempo))  # 모델 변형 = 부패
        return draw(song.notes)

# 맞음 — 필요한 걸 끌어내고, 아무것도 되쓰지 않아:
class DrumView(InstrumentView):
    def project(self, song):
        beats = derive_beat_grid(song.tempo, song.sections)  # 읽기 전용
        return draw(beats)

# 변형 없이 렌더 못 해? 모델이 필드를 빠뜨린 거야.
# MODEL 을 고쳐(한 번, 모든 view 를 위해) — view 말고.

External links

Exercise

데이터를 이해하는 앱을 가져와서 기존 데이터의 새 view 하나를 더한다고 상상해 봐. 밑 데이터를 전혀 안 바꾸고 더할 수 있어? 그렇다면 데이터 모델이 건강해. view 때문에 필드를 추가/수정해야 한다면, 모델의 진짜 빈틈이거나 view 상태가 진실로 새는 거야 — 어느 쪽인지 정해.
Hint
물어: '이 새 필드가 그 사물을 설명해, 아니면 이 한 view 가 그리고 싶은 방식만 설명해?' 사물 설명 -> 모델. 이 view 만 -> view 에 둬.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 피파warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.