1

클래스의 도메인 논리를 도메인 계층의 개체의 책임과 분리하는 방법이 있는지 궁금합니다.도메인 및 ui 레이어 분리 합성

예 :

// Domain classes 
interface MachinePart 
{ 
    CalculateX(in, out) 
    // Where do we put these: 
    // Draw(Screen) ?? 
    // ShowProperties(View) ?? 
    // ... 
} 

class Assembly : MachinePart 
{ 
    CalculateX(in, out) 
    subParts 
} 

class Pipe : MachinePart 
{ 
    CalculateX(in, out) 
    length, diamater... 
} 

많은 기계 부품 조립 기계 값 X를 계산하는 응용 프로그램이 있습니다. 어셈블리는 파일 표현에서로드되고 합성으로 설계됩니다. 각 구체적인 파트 클래스는 전체 어셈블리의 동작을 시뮬레이트하기 위해 CalculateX(in,out) 메서드를 구현하는 일부 데이터를 저장합니다. 응용 프로그램은 잘 실행되지만 GUI는 없습니다. 유용성을 높이기 위해 기존 구현 위에 GUi를 개발해야합니다 (기존 코드의 변경은 허용됩니다). GUI는 어셈블리의 도식적 인 그래픽 표현을 보여 주어야하며 여러 매개 변수를 편집하기위한 특정 대화 상자를 제공해야합니다.

이러한 목표를 달성하려면 응용 프로그램에서 각 기계 부품이 화면에 스키 매틱 표현을 그리고 속성 대화 상자와 기계 시뮬레이션 영역과 관련이없는 다른 사항을 표시하는 새로운 기능이 필요합니다. 각 부분에 대해 Draw(Screen) 기능을 구현하는 몇 가지 솔루션을 생각할 수는 있지만 각 요소에 만족스럽지 않습니다.

처음에 MachinePart 인터페이스에 Draw(Screen) 메소드를 추가 할 수 있지만 도메인 코드가 ui 코드와 섞여서 각 기계 부품 클래스에 많은 기능을 추가하여 도메인 모델을 읽기 어렵게 만들었습니다 이해하다.

"단순한"해결책은 모든 파트를 방문 가능하게 만들고 방문자에게 ui 코드를 구현하는 것이지만 방문자는 내가 좋아하는 패턴에 속하지 않습니다.

UI 구현을 추가하기 위해 각 기계 부품 클래스에서 UI 변형을 파생시킬 수 있지만 각 부품 클래스가 상속에 적합한 지 확인해야하고 기본 클래스의 변경에주의해야했습니다.

현재 가장 좋아하는 디자인은 각각의 구성 요소가 기계 부품을 정의하기 위해 데이터를 저장하고, UI 메소드에 대한 구현과 해당 도메인 클래스의 인스턴스를 생성하는 팩토리 메소드가있는 병렬 복합 계층을 작성하여 "변환 "도메인 어셈블리에 대한 UI 어셈블리. 그러나 생성 된 도메인 계층 구조에서 UI 계층 구조로 돌아가서 예를 들어 도면에 계산 결과를 표시하는 데 문제가 있습니다 (일부 부품은 시뮬레이션 후 스키 매틱 표현에 표시하려는 계산 중 일부 값을 저장한다고 가정).

그런 문제에 대한 입증 된 패턴이있을 수 있습니까?

답변

0

model-view-presenter (mvp)model-view-viewmodel (mvvm) 패턴을 살펴볼 수 있습니다.

파울러의 presentation model에는 두 개의 샘플 응용 프로그램이 포함되어 있습니다. 그것은 또한 당신에게 흥미있을 것입니다.

이 패턴을 조사하면 계속하는 방법에 대한 아이디어를 얻을 수 있다고 생각합니다. Mvvm은 현재 솔루션과 매우 흡사합니다. 그래서 내가 너라면 거기에서 시작 하겠어.

+0

나는 많은 MVC, MVP, MVXYZ, 수동보기 ... 기사 및 모두 내가 Ui 코드와는 별도로 busines 논리를 분리하라고 지시하지만 실세계 예제에서는 분리를 수행하는 방법이 아닙니다. 모든 gui 프로젝트의 가이드 라인을 따르지만'DrawText (mymodel.GiveMeText) '만큼 간단하지는 않지만 문제가 발생합니다. mvvm은 ms 특정 패턴 인 것 같습니다 (이것은 .NET 프로젝트가 아닙니다). 매우 기술적 인 C#/WPF 기사 만 찾을 수 있습니다. 좀 더 일반적인 패턴이 필요해. – hansmaad

+0

MVVM은 MS .net 컨텍스트에서 많이 논의되지만 완전히 "MS 특정"은 아닙니다. Java에서 MVVM은 [link 1] 전에 SO에서 토론되었습니다 (http://stackoverflow.com/questions/2984828/is-there-anything-similar-to-wpf-and-mvvm-in-java-world). [링크 2] (http://stackoverflow.com/questions/2105121/what-to-use-mvc-mvp-or-mvvm-or) – Marijn

0

@ Marjin과 동의하고 대답을 일반화합니다. 당신이 필요로하는 것은 Model-View-Controller이고 MVP와 MVVM은 변종입니다. 귀하의 의견을 이해하는 것으로 생각하지만 패턴을 구현하는 방법을 이해해야합니다. 귀하의 언어를 모르면 & 대상 아키텍처로 절대적인 특성을 부여하기가 어렵습니다. 그럼에도 불구하고, 나는 Observer 패턴으로 시작할 것입니다 (링크에는 샘플 코드가 있습니다).

당신이 다루는 문제는 UI 특정 코드를 사용하여 도메인에 장애를주지 않으면 서 도메인에서 관측 가능한 액세스를 제공하는 방법입니다. 옵서버는이를 수행 할 수있는 방법을 제공합니다. 특히 관찰자 등록과 변경 통보를 가능하게하기 위해 도메인 변경이 필요합니다. 그러나 GUI에 특이한 것이 없기 때문에 캡슐화 된 상태로 유지됩니다.

hth.

PS : 앱이 일반적인 씬 클라이언트 웹 앱인 경우 접근 방식을 수정해야합니다. 그리고 많은 웹 어플리케이션 프레임 워크는 "MVC"로 광고되지만 구현은 Observer 패턴과 구조적으로 상당히 다릅니다.

+0

도메인 클래스의 옵저버 등록에 ui가 추가되지 않는다는 것이 맞습니다 코드를 도메인에 추가하십시오. 하지만 내 주요 문제는 도메인 객체를 그릴 때가 아니라 어떻게해야하는지입니다. MachinePart 컴포지트의 클라이언트 코드는 도메인 "계산"의 추상화 만 알고 있으며 콘크리트 어셈블리를 알지 못하므로이를 그리는 방법을 알지 못합니다. 각 MachinePart는 "녹색 직사각형에 빨간색 원 그리기"라고 말할 수 있지만 도메인의 일부가 아니며이 지식으로 내 도메인 코드에 부담을주고 싶지 않습니다. – hansmaad

+0

OP 당 두 개의 계층이 필요합니다. 하나는 도메인 클래스 용이고 다른 하나는 UI 클래스 용입니다. 간단히 말해 각 도메인 클래스에는 해당 부분 유형을 그리는 방법을 알고있는 해당 UI 클래스가 있습니다. 도메인 클래스와 해당 UI 클래스는 Observer를 사용하여 연결됩니다 (UI 클래스는 도메인 대응 물을 상속받지 않습니다). 각 UI 하위 클래스는 해당 도메인 클래스에 적절한 모양을 렌더링하는'draw()'메소드를 갖습니다. 구조를 순회하는 것은'Draw() '가'Assembly.subParts'를 반복하는'Assembly'의 UI 대응 부분으로 넘어갑니다. – sfinnie

0

아마도 View Helper이 도움이 될 수 있습니다. 그것은 C++이 아니라 자바 EE 패턴이지만, 귀하의 경우 도메인 객체를 그들의 프리젠 테이션 세부 사항과 확실히 분리 할 것입니다 ...