2010-04-22 2 views
8

위키 백과는 Single Responsibility Principle이 방법을 설명합니다MVC에서 컨트롤러를 전통적인 방식으로 사용하면 Single Responsibility Principle이 위반됩니까?

원리는 모든 객체가 하나의 책임이 있어야하고, 그 책임은 전적으로 클래스로 캡슐화해야한다고 단일 책임. 모든 서비스는 그 책임과 협의해야합니다.

MVC에서 컨트롤러를 사용하면 프로그래머가이 원칙을 위반하게됩니다. 간단한 방명록 컨트롤러 및보기. 컨트롤러는 두 가지 메소드/액션을 가질 수 있습니다 : 1) Index()와 2) Submit(). Index()는 양식을 표시합니다. Submit()는 처리합니다. 이 두 가지 방법이 서로 다른 두 가지 책임을 나타 냅니까? 그렇다면 단일 책임은 어떻게 실행됩니까?

답변

8

예.

SRP를 따르려면 컨트롤러를 Dispatcher 및 작업으로 분리하십시오. Dispatcher는 해당 컨트롤에 컨트롤을 디스패치하고 컴파일 타임 (C++ 템플릿) 또는 런타임 (Java XML, 무엇이든)에서 Dispatcher 및 Actions를 작성합니다.

더 자주 보지 않겠습니까? 컨트롤러는 종종 "임시"구현이기 때문에 일반화되지 않고 서브 클래 싱되지 않는 리프 수준의 구체적인 클래스입니다. 여기서 클래스는 코드를 편리하게 그룹화하는 데 더 많이 사용되며, 액션은 거의 공개되지 않습니다 (개인용, 보호용 일 가능성이 있음). "단순히"내부 구현 세부 정보입니다.

파견 할 행동, 가능한 행동의 수 및 다양성을 결정하는 방법의 선택이 높으며 파견 및 행동은 밀접하게 결합됩니다. 따라서 실제로 코드를 한 곳에 모으는 것이 더 쉽습니다.

4

아니요.

MVC 패턴 또는 그 변형으로 인해 Single Responsibility Principle을 위반하는 것은 없습니다. 컨트롤러의 구현이 SRP를 위반했는지 여부는 캡슐화 된 동작이 패턴의 규범 적 사용을 전제로 한 것이 아니라 다른 클래스와 마찬가지로 하나 이상의 변경해야 할 이유가 있는지에 달려 있습니다.

예를 들어 설명한 예제는 컨트롤러가 단순히 주어진 모델에 대해 CRUD 작업을 제공하는 데이터 응용 프로그램에 대한 기본 양식의 하위 집합입니다. CRUD 작업은 실제로 본질적으로 응집력이 있으므로 일반적으로 SRP를 위반하지 않습니다. 단일 컨트롤러에서 여러 메서드를 사용하는 것이 의심스러운 경우는 메서드가 도메인에서 서로 다른 동작 상호 작용을 나타내는 경우입니다.

그렇다고하더라도 CRUD가 4 가지 개별적인 비 응집성 문제를 나타내는 경우에도 동일한 컨트롤러 내에서 이러한 각 작업을 쉽게 수행 할 수있는 MVC 패턴이 내재되어 있습니다.

MVC 패턴에 대한 약간의 역사뿐만 아니라 웹 개발에서 응용 프로그램에 대한 일부 논의에 대해서는 체크 Interactive Application Architecture Patterns을 참조하십시오.

+0

나는 그것이 MVC 패턴을 위반하지 않는다는 것에 동의하지만 그것은 새로운 사용자 관련 조치를 어디에 넣을 것인가? 왜, 물론 UserController에서. 조만간 그것은 통제 불능 상태에 이르며, 서로에게 의존성이없는 행동 방식으로 채워지지만 편리하기 때문에 그룹화됩니다. 저는 컨트롤러를 없애고 액션을 네임 스페이스로 그룹화하는 것에 대한 토론을하기 위해 [여기] (https://gist.github.com/mindplay-dk/5505023) 토론을 시작했습니다. –