model-view-controller 파이썬 - 지방 모델, 마른 컨트롤러 및 MVC 디자인 패턴




cakephp (3)

방금 MVC에 대한 설명과 함께 블로그 게시물 을 읽었습니다. 몇 달 동안 MVC 프레임 워크 (CakePHP)로 웹 애플리케이션을 개발 한 경험이 있기 때문에 기초를 얻었지만 내 논리를 어디에 두는 지에 대한 잘못된 접근법을 생각하게하는 주제가 생기기 시작했습니다.

  • 지방 모델, 스키니 컨트롤러
  • 가능한 한 많은 비즈니스 로직을 모델에 유지하십시오.

내 응용 프로그램에서 모델은 식욕 부진 및 컨트롤러 비만입니다. 컨트롤러에는 모든 비즈니스 로직이 있고 모델에는 연결 및 유효성 검사 규칙 외에는 아무것도 없습니다.

컨트롤러를 통해 스캐닝을하면 모델에 있어야 할 많은 로직을 식별 할 수 있습니다.

  • 앱에 항목이 포함 된 목록이 있으며 항목의 순위를 매길 수 있습니다. 목록을 순서대로 나열하는 정렬 논리는 컨트롤러에 있습니다.
  • 마찬가지로 항목 (항목 모델)에도 이미지 (이미지 모델)가 있습니다. 각 항목에는 기본 이미지 (items 테이블의 image_id로 지정)가있을 수 있습니다. 항목이 이미지와 함께 표시되면 기본 이미지가 먼저 나타나야합니다. 컨트롤러에서이 작업을 수행하는 논리가 있습니다.
  • 목록이 표시되면 관련 목록이 세로 막대에 표시됩니다. 관련된 목록을 결정하는 논리는 제어기에 있습니다.

이제 내 질문에 :

  1. 위에서 제시 한 예제를 통해 모델에 속한 컨트롤러에있는 로직의 인스턴스라고 생각하면 올바른 길을 가고 있습니까?
  2. 웹 애플 리케이션에 공통적 인 로직의 다른 영역은 무엇입니까?
  3. 이 문제를 확인하고 디자인 패턴을 변경하는 것이 전쟁의 절반이라고 확신합니다.하지만 위의 예를 들고 그 논리를 모델로 옮기려고해도 어디서부터 시작해야할지 몰라요. 누구든지 여기에 몇 가지 코드를 게시하거나 좋은 학습 리소스에 연결하여 올바른 방향으로 나를 가리킬 수 있습니까? CakePHP만의 도움은 훌륭 하겠지만, MVC로는 충분할 것입니다.

Answers

그들 중 일부는 프레임 워크의 특성을 다루기 때문에 (당신이 작업하고있는 것에 관계없이) "올바른"대답을주는 것은 약간 힘듭니다.

적어도 CakePHP 측면에서 :

  1. 데이터 또는 데이터 조작을 다루는 것은 모델에 있어야합니다. CakePHP의 관점에서 간단한 find () 메소드는 무엇입니까? ... 다른 곳에서 필요할 수도있는 "특별한"(즉 특정 '조건'집합) 호출을 할 수있는 기회가 있다면 이는 모델의 메서드를 둘러싸는 좋은 변명입니다.

  2. 불행히도 쉬운 대답은 없으며 코드의 리팩토링은 자연스러운 과정입니다. 때로는 그냥 일어 나기도합니다. "거룩한 마카로니가 모델에 있어야합니다!" (글쎄 어쩌면 당신은 그렇게하지 않지만, 나는 :))


내 논리가 올바른 위치에 있는지 확인하기 위해 적어도이 두 가지 '테스트'를 사용하고 있습니다.

1) unittest를 작성하면 테스트를 수행 할 '실제'객체 (생산에서 사용하는 객체)를 만들고, 값 객체를 제외하고는 다른 객체를 많이 포함하지 않는 것이 쉽습니다. 테스트를 수행하기 위해 실제 모델 객체와 실제 컨트롤러 객체를 모두 필요로하는 것은 기능을 이동하는 데 필요한 신호 일 수 있습니다.

2) 이러한 클래스를 사용하는 다른 방법을 추가하면 거의 복사 - 붙여 넣기 방식으로 기능을 복제해야합니까? ... 아마 그 기능을 옮길만한 좋은 이유이기도합니다.

또한 흥미로운 : http://www.martinfowler.com/bliki/AnemicDomainModel.html


JSF와 그 밖의 많은 웹 프레임 워크에서 MVC의 어느 부분에 해당하는지 많은 부분이 명확하지 않은 이유 중 일부는 원래 MVC 패턴이 원래 데스크톱 애플리케이션 용으로 고안되었다는 것입니다.

데스크톱 애플리케이션에서 노드 M, V 및 C는 최대 연결 그래프로, 각 파트가 다른 모든 파트와 통신 할 수 있음을 의미합니다. 예를 들어 모델이 변경되면이 변경 사항이 뷰로 푸시 될 수 있습니다. 데스크톱 응용 프로그램에서 여러 개의 뷰 표현이있는 경우 특히 유용합니다. 하나를 변경하고 실시간으로 다른 업데이트를 확인하십시오.

웹 응용 프로그램의 클라이언트 / 서버 및 요청 / 응답 특성으로 인해 클래식 MVC는 대부분의 웹 프레임 워크에 1 : 1을 매핑하지 않습니다.

특히, JSF에서 매핑은 다음과 같습니다.

  • 모델 - 서비스 / DAO와 생산하고 소비하는 엔티티. 이것에 대한 진입 점은 관리 빈이지만, Java EE (JSF가 일부 임)에서 이러한 산출물은 일반적으로 각각 EJB와 JPA에 의해 구현됩니다.
  • 보기 - UI 구성 요소와 그 구성을 전체 페이지로 구성합니다. 이것은 JSF의 영역에 있으며 JSF UIComponent 와 Facelets에 의해 각각 구현됩니다.
  • Controller (컨트롤러) - 사용자의 명령 및 수신 데이터를 처리하고이를 올바른 부분으로 라우트하며 표시 할보기를 선택하는 교통 경찰입니다. JSF에서는이 컨트롤러를 작성하지 않지만 이미 프레임 워크에서 제공합니다 ( FacesServlet ).

특히 마지막 부분은 자주 잘 이해되지 않습니다. JSF에서는 컨트롤러를 구현하지 않습니다. 결과적으로, Backing Bean 또는 다른 종류의 관리 Bean은 컨트롤러가 아닙니다 .

첫 번째 부분 (모델)도 항상 명확하게 이해되지는 않습니다. 비즈니스 로직은 EJB와 JPA에 의해 구현 될 수 있지만, JSF의 관점에서 가치 바인딩에 의해 참조되는 모든 것이 모델입니다. 또한 JSF 라이프 사이클 단계 중 하나의 이름이 다음에서 유래되었습니다. Update Model . 이 단계에서 JSF는 UI 컴포넌트의 데이터를 모델로 푸시합니다. 그런 점에서 (JSF) 관리 빈은 모델입니다.

JSF 자체가 개념을 명시 적으로 정의하지는 않지만 backing bean 이라고하는 관리 Bean을 자주 반복적으로 사용하는 경우가 있습니다.

JSF의 경우 backing bean은 여전히 ​​모델이지만 실제적으로 Model, View 및 Controller의 중간에있는 배관 요소입니다. 일부 컨트롤러 작업으로 볼 수있는 일부 작업을 수행하기 때문에 종종 컨트롤러로 잘못 인식됩니다. 그러나 앞에서 설명한 바와 같이 이것은 정확하지 않습니다. 또한 일부 모델 작업을 수행하고 때로는 일부 뷰 논리를 수행 할 수도 있습니다.

참조 :