2010-08-03 8 views
8

필자에게는 기본 클래스 (작은 구체로 채워진 실제 컨테이너를 나타냄)와 파생 클래스가 있습니다. 이것은 잘 작동합니다.
내 문제는 시각화를 수행하는 방법입니다. 기본 클래스를 시각화하는 UserControl 있습니다. 각각의 파생 클래스에 대해 파생 된 UserControl을 갖는 최상의 솔루션입니까? 또는 그들 모두를 위해 단 하나의 일을하는 것이 낫습니까?
편집 :
분명히 충분히 구체적이지 않았습니다. 항상 동일한 기본 모양이 있습니다. 내부에 많은 원이있는 직사각형입니다. 클래스 간의 차이점은 컨테이너가 채워지는 방법입니다. 한 유형은 중간에 씨앗을 넣고 구조와 같은 나무에 다른 구체를 만듭니다.이 경우 부모와 자녀 사이의 연결 선을 그려야합니다.
일반적으로 파생 된 각 유형에 대해 몇 가지 전문 분야로 클래스의 시각화를 일관되게 살펴야합니다.C#에서 파생 된 클래스의 시각화

+5

당신은 젤리 빈 계수 대회에서 우승하려고합니까? –

+1

저는 이것이 소프트웨어 엔지니어링에서 매우 중요한 질문이라고 생각합니다. 비슷한 상황에 처해 있었고 올바르게 해결하는 방법을 알지 못했습니다. 지금까지 모든 대답이 그 핵심을 놓친 것은 수치 스럽습니다. – Timwi

+2

@James Curran : Sort of. 오직 참가자가없고 젤리 빈이 중공 유리 마이크로 스피어로 대체됩니다 – Lukas

답변

0

나는 당신이이 질문에 명확하게 대답 할 수 있다고 생각합니다. 주어진 서브 클래스에 대한 UI가 당신이 원하는 것일 수 있지만, 하위 클래스가 sliglly 만 다른 경우 적은 수의 사용자 컨트롤에 조건부 로직을 추가하는 것이 더 쉽습니다. 나는 이것에 대한 하나의 정답이 있다고 생각하지 않는다.

0

막연한 설명으로 말하기가 어렵습니다. 파생 된 클래스 간의 차이점은 무엇인지 최소한 알 필요가 있습니다.

는 일반적으로 제한된 지식, 나는 파생 클래스 시각화 한 다음, 서로 차이가없는 경우, 모든 수단에 의해, 파생 클래스

0

당 하나의 파생 UserControl을 갈 하나의 UserControl을 사용하십시오. 여기에서 핵심은 DRY입니다.

1

이것은 실제로 디스플레이가 얼마나 유사한 지에 따라 크게 달라집니다. 파생 클래스의 표시가 기본 클래스와 매우 유사하면 시각화를 수행하는 데 하나의 UserControl 만 있으면됩니다. OTOH, 각 파생 클래스가 고유 한 것을 표시해야하는 경우 별도의 UserControl을 사용하여 파생 클래스를 시각화하는 것이 좋습니다. 수업에 대한 구체적인 정보가 없으면 더 이상 구체적으로 표현할 수 없습니다.

편집 : 추가 정보에서 저는 사각형 컨테이너를 그리는 기본 디스플레이 클래스가 있어야하며 각 특정 유형의 내용을 그리는 UserControls를 파생 시켰습니다. 이 문제에

+0

나는 편집 된 답변에 동의합니다. 기본 클래스에서 모든 드로잉을 수행하고 클래스를 파생시키고 유형간에 변경되는 클래스를 대체합니다. 하위 클래스에서 재정의하는 '다음 그리기'메소드를 호출하는 기본 클래스에 일반 루프를 가질 수 있습니다. –

0

한 가지 방법은 MVVC 관점 다음 그것을 분해 될 것이다 : 당신은보기 하나의 UserControl이 필요합니다

.

"원이있는 상자"를 ViewModel로 처리하는 하나의 기본 Painter입니다. 파생 된 화가는 개체와 상호 연결의 서로 다른 위치 지정 논리를 구현합니다.

개체의 모양이 다를 수있는 경우 자체는 ViewModel과 같은 어댑터 패턴을 사용하여 페인터에 제공해야합니다.

마지막으로 서클, 사각형 및 이와 관련된 항목이 모델입니다.

일반적으로 :

보기 (UserControl을) -> 뷰 모델 (화가 + 파생 화가를 + ViewModels 개체) -> 모델 (원형, 사각형 등)

0

나는 완전히 문제 도메인을 이해하지 못하는 하지만 이걸 좀 더 깰 필요가 있다고 생각해. 모델을 파트로 분해하고 각 파트에 대한 뷰를 작성한 다음 다시 와이어 링할 수 있습니다.

분야별 라인보기와 모든 것을 담은 직사각형에 대한보기를 작성한 다음 각 모델이이를 정렬하고 해당하는 SphereModels 및 LineModels (그리고 그 밖의 무엇이든)을 작성해야합니다. 당신이 필요하다면) 당신의 주된 견해는 상자에 이들을 배치 할 책임이 있습니다.

항상 상속성을 선호하는 것을 기억하십시오! 문제를 작은 조각으로 나누는 데 집중하십시오.

0

은 내가 어떤 보호 원과 라인을 그리는 방법, 그리고 어쩌면 그리기 표면에 대한 몇 가지 특성 (캔버스?) 그렇게했다 기본 비주얼 클래스로 갈 것이라고 생각 행운 측정을 계산할 수 있습니다 각 구현 기반 위치 등

기본 클래스는 시각화 프로그램을 만들기 위해 필요한 모든 인터페이스 메소드/props를 구현합니다.

비주얼 라이저가 그려야 할 때 IDE에서 호출하는 전략 패턴을 사용합니다. 메서드 구현으로 캔버스를 지우고 모든 구현에 공통적 인 브러시 및 기타 사항을 지울 수 있습니다. 실제로 원/상자/선/등을 캔버스에 배치하는 기본 클래스의 추상 메서드를 호출합니다.

이렇게하면 각 특정 구현은 규칙 집합에 따라 물건을 올바르게 배치하는 논리에 대해서만 염려해야합니다. 모든 "캔버스에 그림 그리기"가 기본 클래스에 보관됩니다.

HTH

편집 : 나는 단어 "컨트롤"나는 의미 사용하는 혼란의 원인이 될 수 수정 오타 "비주얼을."

0

여러 솔루션이있는 상황처럼 들립니다.

기본 방법으로 가상 메서드를 호출하고 파생 클래스에서 재정의하도록 UserControl을 설정하는 것이 한 가지 방법입니다. 파생 클래스에서 기본 구현을 호출하여 초기에 프레임을 설정할 수 있습니다.

레이어 (컨테이너 레이어, 구형 레이어, 선 레이어 등)로 렌더링되도록 설정하고 하위 클래스에서 고유 한 레이어를 렌더링하고 순서를 결정할 수도 있습니다. 비싸지 만, 대부분의 이미지가 동일하게 유지되면 영상이 부드럽게 보일 수 있습니다.

다른 하나는 상속과 반대되는 대리인을 사용하는 것이지만, 이는 지저분 해지는 경향이 있습니다. 이것은 일반적으로 성능 저하로 인해 좋은 생각이 아닙니다. 그러나 런타임 유연성의 장점이 있습니다. 나머지 코드에 따라이 모델을 통해 중간에 스타일을 전환 할 수 있습니다. 당신이이 융통성을 이용하는 자신을 보지 못한다면 나는 다른 모델을 사용하는 것이 좋습니다.

사용하는 방법에 상관없이 일관성을 보장하기 위해 기본 클래스가 일반적인 그리기 루틴을 제공하는 것이 좋습니다.기본 클래스의 루틴은 대부분의 하위 클래스에서 사용해야하지만 모든 클래스에서 사용해야하는 것은 아닙니다. 이는 대개 관리가 쉬운 코드로 이어지고 (10000 라인 파일로 끝나지 않는 한), 버그가 적어지고 노력이 적습니다.

관련 문제