2011-04-07 4 views
4

Java, Swing, MVC 및 SwingWorker에 대해 많이 읽었지 만 MVC에서 모델의 역할에 대해 완전히 혼란스러워합니다.MVC에서 모델은 무엇을하고 SwingWorker와 어떤 관계가 있습니까?

  1. 파일 선택
  2. 읽기 파일

로깅에 사용되는 텍스트 상자도 있습니다 :

나는 두 개의 버튼이있는 응용 프로그램을 짓고 있어요.

내가 현재하고 있어요 :

  1. 보기는 위젯하지만 논리
  2. 버튼의의 actionPerformed() 메소드 컨트롤러에 대한 메서드 호출을 포함
  3. (필요한 데이터를 가져 오는 것입니다 컨트롤러 파일 가져 오기를위한 OptionPane.showOpenDialog() 포함)
  4. 파일 참조는 모델에 저장됩니다.
  5. 모델은 새 파일의보기를 (PropertyChangeSupport, Observer 패턴) 알립니다.
  6. 보기는 '읽기 파일'버튼을 수

내 첫 번째 질문 : 나는 모델의 상태를 저장해야합니까? 즉, 작업 순서와 관련된 정보 : 먼저 파일을 선택해야 읽을 수 있습니다. 그래서 제 모델은 상태 기계가 될 것입니다.

내 두 번째 질문 : 컨트롤러에 OptionPane이 표시되도록하는 것이 맞습니까?

그러면 즐거움이 시작됩니다. 사용자가 '파일 읽기'버튼을 클릭합니다. '파일 선택'버튼과 거의 비슷하게 작업하고 있습니다. 뷰는 컨트롤러를 호출하지만 컨트롤러는 SwingWorker를 사용하여 파일을 읽습니다. EDT에서는 수행하지 않아야합니다. SwingWorker는 View (SwingWorker.process() 메서드)에 대한 참조를 통해 텍스트 상자에 추가되는 중간 로깅 메시지를 게시합니다. 컨트롤러는 SwingWorker에서 '상태'속성 변경을 수신 대기합니다. 'state'가 'DONE'일 때 컨트롤러는 'get()'함수를 호출합니다. 모든 것이 정상이면 결과가 모델에 설정됩니다. 그렇지 않은 경우 예외가 처리됩니다.

제 3의 가장 중요한 질문 : 모델에서 파일을 읽지 않아야합니까?! MVC의 모든 포인트는 모든 이점 (테스트 가능성 등)과 관심사의 분리입니다. 새보기 (예 : CLI)를 원하면 어떻게해야합니까? 그러면 내 모델은 이제 데이터 모델이 될 것입니다. 파일을 읽는 방법에 대한 단서가 없습니다! 그리고 스레딩 문제는 어떻습니까?

희망을 갖고 나에게 좋은 조언을 해줄 수 있기를 바랍니다. SwingWorker, MVC 등 인터넷에 대한 예제가 많이 있습니다.하지만 제 문제는 코드 작성 방법이 아니라 디자인 방법입니다.

답변

7

나는 당신이 꽤 잘 할거라 생각합니다. 질문에 하나씩 답하십시오 :

1. 모델에 상태를 저장해야합니까? 예. 모델에 상태를 저장할 수 있고 저장해야합니다. 모델은 해당 상태를 변경하는 상태 및 동작입니다.

2. 컨트롤러에 OptionPane이 표시되도록하는 것이 맞습니까? 예 - 응용 프로그램 디자인 (논리 흐름)은 파일의 출처를 결정합니다. 모델은 파일 이름을 가져 오는 것과 마찬가지로 읽을 파일 이름을 얻는 방법을 확실히 신경 쓰지 않습니다. 흐름은 컨트롤러의 도메인입니다.

3. 모델에서 파일을 읽지 않아야합니까? 다시 한번, 파일 읽기는 모델의 일부입니다. 컨트롤러가 스윙 작업자를 호출하더라도 스윙 작업자는 개념적으로 모델의 일부로, 적어도 스윙 작업자가 실행하는 기본 논리입니다. 이론적으로는 파일을로드하는 모든 논리가 모델 클래스에 있습니다. 컨트롤러는 스윙 작업자를 사용하여 컨트롤러를 호출하도록 조정할 수 있습니다. 컨트롤러는 파일 로딩이 백그라운드 스레드에서 일어나야한다고 결정한 후 백그라운드에서 파일을로드하도록 모델에 지시합니다. 컨트롤러의 스윙 작업자는 모델에서로드 진행률 이벤트를 받고 publish()를 호출하여 이러한 작업을 처리 한 다음 process()를 호출하여 UI를 업데이트합니다.

원칙적으로 모델을 변경하지 않고도 전체 앱을 콘솔 앱으로 다시 쓸 수 있어야합니다. 당연히 뷰가 변경되지만 스윙이 아닌 표준 출력을 사용하여 모델을 표시해야하기 때문입니다. 가장 큰 변화는 컨트롤러에서 발생합니다. 응용 프로그램 흐름은 다를 수 있습니다 (파일 선택은 프로그램 인수에서 비롯됨). 컨트롤러는 더 이상 버튼 클릭을 통해 흐름을 지시하지 않지만 고정 된 흐름을 갖거나 표준 입력을 통해 사용자와 상호 작용합니다. 그리고 컨트롤러의 스레딩 모델은 다릅니다. EDT에 대해 걱정할 필요가 없으므로 스윙 작업자가 필요 없습니다.

모델은 상태를 처리하고 그 상태를 변경하고 뷰는 상태를 표시하며 컨트롤러는 다른 모든 작업을 수행합니다. 특히 모델을 뷰에 연결합니다.

+0

MVC와 스윙에서 본 가장 간결한 게시물 중 하나입니다 - 감사합니다! –