뚱뚱한 모델, 마른 컨트롤러 및 MVC 디자인 패턴
방금 은행 업무 비유로 MVC를 설명 하는 블로그 게시물 을 읽었습니다 . 저는 MVC 프레임 워크 (CakePHP)를 사용한 웹 애플리케이션 개발에 대해 몇 달의 경험을 가지고 있으므로 기본 사항을 얻었지만 제 논리를 넣는 위치에 결함이있는 접근 방식을 취하고 있다고 생각하게 만드는 테마를보기 시작했습니다.
- 뚱뚱한 모델, 마른 컨트롤러
- 모델에 가능한 한 많은 비즈니스 로직을 유지하십시오.
내 앱에서 모델은 식욕 부진이고 컨트롤러는 비만입니다. 컨트롤러에는 모든 비즈니스 논리가 있고 모델에는 연결 및 유효성 검사 규칙 외에는 없습니다.
컨트롤러를 살펴보면 이제 모델에 포함되어야하는 많은 로직을 식별 할 수 있습니다.
- 앱에는 항목이 포함 된 목록이 있으며 항목의 순위를 지정할 수 있습니다. 목록을 순위 순으로 정렬하는 정렬 논리는 컨트롤러에 있습니다.
- 마찬가지로 항목 (항목 모델)에도 이미지 (이미지 모델)가 있습니다. 각 항목에는 기본 이미지가있을 수 있습니다 (item 테이블에서 image_id로 지정됨). 항목이 이미지와 함께 표시되면 기본 이미지가 먼저 표시되어야합니다. 컨트롤러에서이 작업을 수행하는 논리가 있습니다.
- 목록이 표시되면 관련 목록이 사이드 바에 표시됩니다. 관련된 목록을 결정하는 논리는 컨트롤러에 있습니다.
이제 내 질문에 :
- 위에서 제시 한 예를 사용하여 모델에 속한 컨트롤러에 현재 논리의 인스턴스라고 생각하는 것이 올바른 방향입니까?
- 모델에 포함되어야하는 웹 앱에 공통적 인 로직의 다른 영역은 무엇입니까?
- 이 문제를 파악하고 디자인 패턴을 변경하는 것이 전투의 절반이라고 확신하지만 위에서 제시 한 예제를 사용하여 논리를 모델로 옮기려고해도 어디서부터 시작해야할지 모르겠습니다. 누군가 여기에 코드를 게시하거나 좋은 학습 리소스에 연결하여 올바른 방향으로 나를 가리킬 수 있습니까? CakePHP 특정 도움말은 훌륭 할 것이지만 MVC로 충분할 것이라고 확신합니다.
일부는 프레임 워크의 세부 사항을 다루기 때문에 "올바른"답변을 제공하는 것은 약간 어렵습니다.
적어도 CakePHP의 관점에서 :
예
데이터 또는 데이터 조작을 다루는 모든 것은 모델에 있어야합니다. CakePHP의 관점에서 간단한 find () 메소드는 어떻습니까? ... 다른 곳에서 필요할 수있는 "특별한"(즉, 특정 '조건'집합을 회상하는) 작업을 수행 할 가능성이있는 경우 모델의 메서드 내부를 감싸는 좋은 변명입니다.
안타깝게도 쉬운 답은 없으며 코드 리팩토링은 자연스러운 과정입니다. 가끔 일어나서 "성스러운 마카로니 ... 모델에 있어야합니다!" (글쎄, 당신은 그렇게하지 않을 수도 있지만 나는 :))
내 논리가 올바른 위치에 있는지 확인하기 위해 적어도이 두 가지 '테스트'를 사용하고 있습니다.
1) 단위 테스트를 작성하면 테스트를 수행 할 하나의 '실제'개체 (= 프로덕션에서 사용중인 개체) 만 만들고 값 개체를 제외하고는 다른 개체를 많이 포함하지 않는 것이 쉽습니다. 테스트를 수행하기 위해 실제 모델 객체와 실제 컨트롤러 객체가 모두 필요한 것은 기능을 이동하는 데 필요한 신호일 수 있습니다.
2) 스스로에게 질문하십시오. 이러한 클래스를 사용하는 다른 방법을 추가하면 거의 복사-붙여 넣기와 같은 방식으로 기능을 복제해야합니까? ... 그것은 아마도 그 기능을 옮겨야 할 좋은 이유 일 것입니다.
또한 흥미로운 : http://www.martinfowler.com/bliki/AnemicDomainModel.html
참고 URL : https://stackoverflow.com/questions/467113/fat-models-skinny-controllers-and-the-mvc-design-pattern
'Programing' 카테고리의 다른 글
x, y = zip (* zip (a, b))이 파이썬에서 작동하는 이유는 무엇입니까? (0) | 2020.10.20 |
---|---|
Android의 Clojure (0) | 2020.10.20 |
Windows 용으로 좋은 SSH 서버는 무엇입니까? (0) | 2020.10.20 |
.NET- "모든 예외 처리기 잡기"를 구현하는 가장 좋은 방법은 무엇입니까? (0) | 2020.10.20 |
django 프로덕션 서버에 virtualenv를 권장합니까? (0) | 2020.10.20 |