잘못된 OO 디자인 문제 - 자바에서는 일반적인 기능이 필요하지만 구현 방법을 모르겠습니다.

StackOverflow https://stackoverflow.com/questions/125463

  •  02-07-2019
  •  | 
  •  

문제

나는 주로 개인 프로젝트 인 Java의 소규모 UML 클래스 편집기를 개발하고 있습니다. 프로젝트를 만들 시간을 찾으면 Sourceforge에서 끝날 수 있습니다.

프로젝트는 상당히 발전했습니다. 클래스를 만들고, 이동하고, 인터페이스를 만들고, 링크를 만들 수 있습니다.

내가 작업하는 것은 클래스/인터페이스 속성을 설정하고 새로운 클래스/인터페이스를 만드는 대화 상자입니다.

예를 들어, jdialog를 확장하는 수업이 있습니다. 이것은 클래스와 인터페이스를 편집하기위한 기본 "창"입니다 (음, 각각에 대한 클래스). jtabbedpane이 포함되어있어 JPANEL이 포함되어 있습니다.

이 jpanel은 실제로 맞춤형입니다. JPANEL을 연장하는 추상 클래스를 만들었습니다. 이 클래스는 구성 요소 (서브 클래스로 정의 됨)를 사용하고 jtable (jpanel에 포함)에 값을 추가합니다.

예를 들어, 클래스의 속성을 편집하려면 JPANEL에는 속성 이름을 입력하기위한 jtextfield와 유형을 입력하기위한 다른 이름을 포함합니다. 이 필드에 입력 된 데이터를 처리하기위한 버튼 세트도 있습니다. "저장"을 클릭하면 jtextFields에 입력 한 데이터가 JTable (à la Enterprise Architect)에 추가됩니다. 추상적 인 클래스를 확장하는 콘크리트 클래스는 제어를 정의하고 JTable에서 라인이 추가되거나 삭제 될 때 데이터로 무엇을하는지 결정할 책임이 있습니다. 그러나 JTable 관리는 추상 클래스의 책임입니다.

내 문제는 다음과 같습니다. OO에는 클래스에 메소드가 있고 인터페이스에도 메소드가 있습니다. 나는 나 자신에게 말했다 : 나는 클래스 또는 인터페이스의 메소드를 저장하기 위해 동일한 콘크리트 사용자 정의 jpanel (attributespanel (추상 jpanel 클래스를 확장))을 사용할 수있었습니다.

그러나 클래스는 내가 작업중인 클래스 또는 인터페이스의 사본 (속성)을 보관해야합니다. 이렇게하면 메소드가 추가되면 editedClass.addMethod () (또는 editedInterface.addMethod ())을 호출 할 수 있습니다. 문제는 수업이나 인터페이스에서 작업하는지 여부를 알 수있는 방법이 없다는 것입니다.

내가 찾은 솔루션은 Ugly입니다. 속성 편집 클래스와 속성 편집자를 속성으로 유지하십시오. 클래스 나 인터페이스를 편집하고 있는지 여부에 따라 이러한 속성 중 하나는 무효이며 다른 사람에게는 그렇지 않습니다.

당신이 나에게 물어 보면 그것은 매우 추악합니다. 사실, 나는 9 번째 지옥에서 불타고있는 동안 (실제로, 실제로 얼어 붙는) 머리 속의 소프트웨어 엔지니어링 교사들이 고통으로 비명을 지르는 소리를들을 수 있습니다.

이 설계 문제를 해결하는 빠른 방법은 "ObjectwithMethods"라는 인터페이스를 작성하는 것입니다. 이렇게하면 attributeSpanel 클래스에 객체 와이드 메드 매개 변수를 넣어야합니다.

그러나 그것은 "ObjectwithAttributes"또는 "ObjectwithBlahblah"라는 클래스를 만들어야한다는 것을 의미합니까? 여기에 좋은 "thedailywtf"잠재력이 여기에 있습니다 ... 게다가, 나는 도메인 객체 (클래스, 인터페이스, 메모, 관계 (내 UML 편집기))를 수정하거나 술을 위해 새 인터페이스를 만들어야한다고 생각하지 않습니다. 일부 UI 고려 사항 ....

어떻게 생각해?

나는 당신은 더 많은 설명이 필요합니다 (지금은 매우 피곤하고 지금은 매우 나쁘게 제대로 옳습니다 (특히 영어 - 모국어 - 프랑스어입니다)이 마음의 상태에 있습니다 ...), 그냥 물어보고 이것을 편집하겠습니다. 의문.

건배,

기 illa.

도움이 되었습니까?

해결책

내가 당신의 질문을 읽을 때 그것은 당신이 사용할 장소를 묘사하는 것처럼 보입니다. 방문자 패턴.

방문자 패턴이 여기서 작동 해야하는 이유는 이중 파견으로 알려진 아이디어입니다. UI 코드는 호출을하고 자체에 대한 참조를 전달하면 클래스 또는 인터페이스가 원래 발신자를 호출하게됩니다. 클래스 또는 인터페이스가 메소드 호출을하는 클래스 또는 인터페이스이므로 자체 유형과 해당 유형에 따라 작업을 수행하는 방법을 알고 있습니다.

물론, 내 설명은이 기술을 구현하기에 충분하지 않으므로 읽고 싶을 것입니다. 나는 그것이 잘 문서화되어 있다고 생각합니다. 예를 들어, 나는 당신이 시작해야 할 Java에서 약 2 초 안에 이것을 발견했습니다. http://www.javaworld.com/javaworld/javatips/jw-javatip98.html

다른 팁

보통, 나는 가장 간단한 일을하고 너무 많은 것을보기 시작할 때 인터페이스를 고려하는 것을 생각하기 시작합니다. if( .. instanceof ..)-내 코드의 구성. 현대적인 IDE 코드보고 기능에 비용이 많이 들지 않습니다.

특정 경우에 제공된 다이어그램 구현을 고려할 것입니다. UML 사양, 그들은 UML-Notation을 사용하여 UML을 지정하기에 너무 친절했기 때문에!

응용 프로그램이 있습니다. 그 앱에서. 귀하의 대표 및 일부 데이터를 편집합니다.

이 데이터는 프로그래밍 언어 클래스 또는 프로그래밍 언어 인터페이스를 나타냅니다.

일부 데이터에 대한 편집기를 만들면 때로는 추가 / 보완 정보를 추가해야합니다 (예 : 각 클래스 차트는 다른 줄 색상을 가질 수 있으며 클래스의 속성이나 방법과 관련이 없습니다.

클래스 나 인터페이스를 편집하고 있음을 나타내는 필드 또는 속성도 마찬가지입니다.

나는 몇 가지 일을 제안한다.

프로그램의 코드 또는 논리에서 표현 된 데이터를 분리하십시오.

다음과 같은 것이있는 경우

// all code, classes, mixed up
public class JCustomPanel:  {

    protected ChartClass Charts;
    protected ArrayList<String> MyClassAttributes;
    protected ArrayList<String> MyClassMethods;

    void PanelDoSomeThing();
    void ClassDoSomeThing();
    void InterfaceDoSomeThing();

    // ...
} // class JCustomPanel

이것으로 변경 :

// things related to a single class or interface,
// nothing to do with the chart

public class JClassRepresentation:  {

    ArrayList<String> Attributes;
    ArrayList<String> Methods;

    bool IsInterface;

    void ClassDoSomeThing();
    void InterfaceDoSomeThing();

    // ...
} // class JCustomPanel

// things related to the editor,
// contains the classes and interfaces,
// but, as separate stuff
public class JCustomPanel:  {

    ArrayList<JClassRepresentation> Classes;

    int PagesCount;

    void InterfaceDoSomeThing();

    // ...
} // class JCustomPanel

건배.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top