2010-03-05 7 views
2

모델 뷰 컨트롤러 디자인으로 구현하려고하는 Java 프로젝트가 있습니다. 모든 구성 요소의 중추가 확립되었습니다. 모든 것을 함께 연결하는 방법, 특히 뷰와 컨트롤러를 결정하는 데 어려움을 겪고 있습니다.적절한 모델 뷰 컨트롤러 디자인

나는 메인 뷰JFrame으로 확장되는 클래스가 있습니다. 메인 뷰을 구성하는 데 도움이되는 다양한 수업이 있습니다. 각각 JPanel입니다. 이러한 클래스의 예로는 ParameterView이 있습니다. 컨트롤러가 각 "하위보기"를 볼 수 있도록해야합니까? 아니면 컨트롤러에 MainView 만보고 거기를 통해 관리해야합니까?

모델과 마찬가지로 모델을 하나의 포괄적 인 클래스를 통해 관리해야합니까?

감사합니다.

+1

좋아하는 MVC 다이어그램 : http://java.sun.com/blueprints/patterns/images/mvc-structure-generic.gif – trashgod

답변

6

GUI (Swing-like) 응용 프로그램과 관련하여 Model-View-Controller는 구체적인 디자인보다 모호한 제안입니다. 이 "패턴"의 변형 수는 비틀 거리며 목표로 삼아야하는 "적절한"변형이 없습니다. 현재의 필요를 지원하는 변형을 선택할 수 있습니다 (앱이 발전함에 따라 자유롭게 변경할 수 있음). 모델을 분리 할 수있는 체인의 책임 귀갑 : 말했다

, 여기 당신은 (관찰자 패턴 AKA) 게시/구독 메커니즘을 사용할 수 있습니다

  • 을 설명하고있는 상황에 대한 몇 가지 포인터 (또는 그 일부)를 볼 수 있습니다.
  • 뷰의 모든 부분을 패키징하는 facade 클래스 (MainView)는 "god class"의 레시피 인 것 같습니다. 앱에서 거의 모든 변경 사항 (안티 패턴)으로 변경해야하는 클래스입니다. 뷰의 다른 부분을 노출하면 새로운 컨텍스트에서 쉽게 재사용 할 수 있습니다.
  • 마지막으로, Swing 구성 요소를 서브 클래 싱하여 모델을 구현하는 것은 좋은 생각처럼 보이지 않습니다. 그러한 디자인은 테스트하기가 매우 어렵다. 이는 매우 엄격하다는 것을 의미한다. 상속에 대한 위임을 선호합니다. 또는 JBrains이 말한 것처럼 "하위 클래스 작성을 중단하거나 새끼 고양이가 가져옵니다." Swing 메서드를 오버라이드 (override)하는 경우에만 상속을 사용하십시오. Swing에서 완전히 분리 된 객체에 모든 로직을 즉시 위임합니다. 이것은 테스트 가능성과 미래의 유연성을 촉진 할 것입니다.
+1

'MVC'의 의미는 실제로 많이 발전했습니다. http://st-www.cs.illinois.edu/users/smarch/st-docs/mvc.html 오, 그래, 좋은 조언을 위해 upvoted, Itay. –

+0

상속에 대한 위임에 대한 의견은 +1입니다. –

0

레이어 간의 연결을 최소화하는 것이 좋습니다. 컨트롤러에서 MainView 만 볼 수 있도록 허용하는 것이 좋습니다. MVC 구조를보다 명확하게 만들기 위해 MainView가 구현하는 인터페이스를 정의하는 것도 고려해야합니다. 컨트롤러는 실제로 JFrame을 처리한다는 것을 알 필요가 없습니다.

0

MVC를 잠시 무시하면 JComponent를 확장하는 모든보기 구성 요소에만 Swing 관련 코드를 넣을 수 있습니다. Swing없이 컴파일 할 수있는 클래스에 다른 모든 것을 위임하십시오. 인터페이스를 사용하여이를 도와줍니다. 귀하의 컨트롤러는 스윙 이벤트로부터 온 것인지 알지 못하고 요청을 처리 할 수 ​​있어야합니다. 모델은 Swing * Model 클래스를 참조하지 않고 시스템의 상태를 업데이트 할 수 있어야합니다. 뷰는 JComponent 클래스를 참조하지 않고 사용자에게 결과를 표시하는 방법을 설명 할 수 있어야합니다. 그렇게하면 모델, 뷰 및 컨트롤러에 위임 한 JComponent 객체를 쉽게 빌드 할 수 있습니다.

여러분을 돕기를 바랍니다.

0

MVC는 일반적으로 Observer (모델이 관찰 가능), Strategy (다른 전략을 다른보기를 처리하기 위해 컨트롤러로 스왑 됨) 및 Composite (보기는 GUI 구성 요소의 합성)입니다.

이렇게하려면 컨트롤러가 모델을 관찰하고 올바른 전략을 배포하여 뷰 합성을 업데이트해야합니다. MainView는 구성 요소에서 전달 된 복합 항목 (JPanels?)을 렌더링 할 수 있어야합니다. 반대로 컨트롤러는 UI의 이벤트를 관찰하고 이에 대응하여 적절한 전략으로 전달해야합니다.

tikeSwing을 살펴보십시오. here에 설명 된 것처럼 스윙 앱을위한 간단한 MVC 프레임 워크입니다.

1

파울러의 Presentation Model 개념을 사용하여 매우 좋은 결과를 얻었습니다. UI 개발을하는 사람은 누구나이 분야에서 시도 된 다양한 접근 방식 인 Fowler의 적용 범위 (GUI Architectures)를 읽는 것이 좋습니다. 이는 환상적인 읽기이며 각 접근 방식의 과제와 성공에 대해 큰 통찰력을 제공합니다.

관련 문제