2011-03-08 2 views
2

"연습"에서 MVC 패턴을 학습하는 중입니다. 즉, 특정 Java 응용 프로그램에서 MVC를 구현하는 방법에 대한 이해를 얻으려고합니다. 방금 조금 더 똑똑해졌습니다. question 방금 ​​물었습니다.MVC 패턴을 적용 할 때 컨트롤러가 뷰를 상속 할 수 있습니까?

MVC 패턴의 본질은 모델이보기도 컨트롤러도 알지 못한다는 사실입니다. 그러나 제어기와 뷰 모두는 제어기가보기를 갱신 할 필요가 있고보기가 제어기에 사용자 조치를 보내야하기 때.에 서로를 알아야합니다. 나는 일반적으로 전략 패턴을 사용하여 컨트롤러를 구현한다는 것을 이해한다. 컨트롤러가 뷰의 동작임을 의미한다. 그것이 어떻게 보이는지에 관계없이, 뷰와 컨트롤러는 오히려 서로 얽혀 있습니다.

이제 저는 상속에 비해 구성을 선호해야한다는 것을 알고 있습니다. 그러나 컨트롤러가보기를 상속하는 디자인을 만드는 것이 합리적일까요? 보기에 접근 자 및 변형 자 메서드를 많이 쓰지 않아도되지만 하위 키가 액세스 할 수 있도록 보호 된 키워드로 모든 구성 요소를 정의하는 것이 대부분입니다.

사용자 입력이 발생할 때보기가 컨트롤러에 알릴 수있는 방법을 생각할 수도 있습니다. 내 생각은 컨트롤러의 각 버튼에 해당하는 작업을 수행하는 것입니다. 그런 다음 해당 액션 (해당 하위 클래스 인 컨트롤러)을 해당 단추 (보기)에 등록해야합니다.

우려를 분리하려고합니다. 여전히 MVC 패턴이 될 것인가, 아니면 완전히 다른 무언가로 나아갈 것인가?

모든 의견을 환영합니다.

+0

귀하의 목표는 무엇입니까? MVC 프레임 워크를 직접 개발하려고합니까? – CoolBeans

+0

내 목표는 내 응용 프로그램에서 MVC 패턴을 어떻게 활용할 수 있는지 이해하는 것입니다. 예를 들어 컨트롤러를보기의 "행동"으로 설정하는 것과 관련하여 이상적인 방법이라고 생각합니다. 그러나 모든 컨트롤러가 뷰를 확장 할 수있게하는 것이 더 간단 할 것 같았습니다. 나는 그것이 게으른 것으로 인정하지만 시간과 코드 라인을 절약하는 방법으로 생각했다. (어떤 패턴이 전부가 아닌가?). 결국, "behaviour"는 원하는 경우보기를 상속하게함으로써 쉽게 변경 될 수 있습니다. – sbrattla

답변

4

컨트롤러가 뷰를 확장 할 때 Java의 의미에서 컨트롤러는 "is-a"뷰입니다. 이 경우에 당신이 mvc 패턴을 위반하고 있다고 말하는 것이 안전합니다.

0

아니, 나는 그게 좋다고 생각하지 않는다. 나에게 이것은 정말로 나쁜 것처럼 들린다. 어떤 상황에서는 도움이 될 수 있지만 MVC가 아닌 것은 확실합니다.

1

M-VCS (Model-ViewControllerSpaghetti) 아키텍처가 될 것입니다. 원칙적으로

, 내가 컨트롤러보기에 이에 속한다 (또는 이있다-A하는 GUI 층 컨트롤러에)하지 않는다 (버튼 및 기타 컨트롤을 포함하여) 해당 사용자의 입력을 말할 것보기 동안에 만 모델을 표시합니다.

컨트롤러 GUI가보기에 익숙하고 모델이 업데이트되었고 모델을 다시 표시해야한다고하는 것이 합리적입니다. 접근 자 및 변경자가 필요하지 않습니다.

+0

GUI에서 불필요한 유일한 방법은 다음과 같습니다. View가 표시하고있는 무엇이든 업데이트 할 필요가있을 때 컨트롤러가 View에서 트리거 할 수있는 stateChanged() 메소드? 방금 필드를 활성화/비활성화하고 컨트롤러의 상태를 업데이트 할 수 있도록 필드를 잠 그거나 잠금 해제하는 방법을 추가하는 예제를 많이 보았습니다. – sbrattla

+0

위의 내용이 맞으면 컨트롤러 절대로 뷰를 직접 업데이트 할 수는 없지만 뷰를 상태를 업데이트해야한다고 알립니다. 그러나 필드의 활성화/비활성화 또는 잠금/잠금 해제 "논리"가 뷰 또는 컨트롤러에 속합니까? – sbrattla

+0

모델이 컨트롤러와 변경 사항을 모두 알리는 것이 일반적입니다 (실제로 컨트롤러를 뷰와 함께 사용하는 것보다 더 나은 솔루션입니다). 그럼에도 불구하고 그러한 일반적인 경우에 대해 구체적으로 설명하는 것은 매우 어렵습니다. 모든 종류의 패턴과 마찬가지로 MVC는 기성품 인 단일 크기의 마법의 은색 망치가 아닙니다. 정확히 무엇을 달성하고 싶은지 고려한 다음 솔루션을 문제에 맞게 조정해야합니다. 죄송합니다. 막연한 내용이지만 '올바른'답변이 없습니다 (눈치 채 셨던 것처럼). – molbdnilo

1

@ 잔 갈린 스키가 맞습니다. 당신이 당신의 이전 질문에서 인용 된 examplepicture 보면, 당신은 Controller이있다-A 것을View 볼 수 있으며 는이-AModel을하여 View 그냥 가-잠시Model (고체 화살표를). Controller은 수신 대기 시간이이고 수신 대기 시간은 View이며 View수신 대기 시간은입니다. Model (점선으로 표시된 화살표).

부록 : 이런 식으로 클래스 다이어그램과 코드 사이에 일대일 대응을 볼 수 있습니다.

2

이러한 멍청한 소리를 듣지 마십시오. 나에게 좋은 계획 같아.

여기에 있습니다.

컨트롤러 "is-a"보기는 구현에 중요하지 않은 완전하고 완벽한 세부 사항입니다. 컨트롤러를 사용하는 것이 뷰로 사용되지 않는 한, 컨트롤러의 클래스 계층 구조는 누가 신경 쓰입니까?

이제보기에서 내림으로써 이론적으로 개발 환경은보기가 필요한 컨트롤러를 "실수로"사용하는 것을 "보호 할"수 없습니다. 그것은 당신에게 더 많은주의를 기울일뿐입니다.

"보기"에 컨트롤러가 더 의존적이게 되는가? "보기"관계에있는 것보다? 정렬. 나중에 다른 뷰 (보기)에도 불구하고보기에 대해 "바꾸기"가 더 어렵게 만들지 만,이 이벤트를 "is-a"관계에서 "has-a"로 리팩토링하는 동기로 사용할 수 있습니다.

아마도 이걸하면 "게으르다"는 것입니다.하지만 저는 프로그래머와 게으름에 관해 Larry Wall에게 연기합니다.

모델링의 관점에서 볼 때 솔직하게 말해서 큰 문제는 아닙니다. 운영상 아무런 차이가 없습니다.

+1

나는 "진흙 투성이의 진흙 투성이"가 아니다 ... 단지 말하게 될 필요가 있었다! –

+0

이야기의 양면을 듣는 것은 언제나 좋습니다! 내 생각은 뷰를 확장하는 두 번째 컨트롤러를 만드는 것만으로도 "동작"(컨트롤러)을 쉽게 변경/전환 할 수 있다는 것입니다. 그러나 나는 "상속에 대한 구성"을 선호해야한다는 것을 알고있다 ...그렇다고 상속이 실제로 유용하게 사용될 때 무시되어야한다는 것을 의미하지는 않습니다. 저는 "게으른"이라는 단어를 사용하는 것을 꺼려합니다. 그러나 나는 확실히 모든 코드가 작동하도록 최대한 적은 코드를 작성하고 싶습니다. – sbrattla

+0

나는 사랑스럽고 "게으름 뱅이"를 사랑스럽게 사용했습니다. :) –

관련 문제