동일한 객체와 "관계가 있는" 두 개 이상의 클래스를 설계/구현하는 올바른 방법은 무엇입니까?

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

  •  01-07-2019
  •  | 
  •  

문제

다음과 같은 디자인이 있다고 가정해 보겠습니다.

객체 GUI에는 두 가지 객체가 있습니다:aManager 객체와 bManager 객체는 서로 통신하지 않습니다.

aManager와 bManager 모두 속성(또는 cManager에 대한 포인터)으로 객체 cManager를 갖습니다.따라서 aManager가 cManager를 수정하면 bManager의 cManager에도 영향을 미칩니다.

내 질문은 이것을 설계/구현하는 올바른 방법은 무엇입니까?

저는 cManager를 GUI의 속성으로 만들려고 생각했는데, GUI는 aManager와 bManager를 구성할 때 cManager에 대한 포인터를 전달합니다.하지만 IMHO, GUI는 cManager와 아무 관련이 없는데 왜 GUI가 cManager를 속성으로 가져야 할까요?

여기서 사용해야 하는 특정 디자인 패턴이 있습니까?

도움이 되었습니까?

해결책

가능한 한 간단하게 해석하겠습니다. 귀하의 질문에 답변하지 못한 경우 사과드립니다.

이 질문에 대한 답을 실제로 얻었을 때, 이것이 객체 지향적으로 생각하는 첫 번째 단계입니다.

OO에서는 두 개체가 모두 다른 개체를 "가지고" 있으면 두 개체가 다른 개체를 참조하는 것이 완벽하게 허용됩니다.OO의 비결은 객체에 고유한 생명력이 있고 유동적이며 객체가 필요한 사람은 누구나 객체에 대한 참조를 유지할 수 있다는 것입니다.객체는 그 자체로 "유효"를 유지해야 하며 다른 많은 객체에서 사용될 때 안정성을 유지해야 합니다.(이것이 String과 같은 불변 객체가 매우 훌륭한 이유이며, 항상 생성된 순간만큼 유효합니다.)

한 가지 예외는 C++로 코딩하는 경우 실제로 개체를 수동으로 해제해야 하기 때문에 각 개체의 수명 주기를 모니터링할 수 있는 소유자를 의미하므로 C++의 OO에서 "생각"하기가 정말 어렵습니다.

[추가] 포인터를 언급하고 계시기 때문에 C++로 프로그래밍하고 계시다고 생각합니다.그렇다면 당신 말이 맞습니다.한 명의 관리자가 공유 객체의 라이프사이클을 "소유"하게 만듭니다.다른 모든 참조가 사라질 때까지 해당 개체가 죽도록 놔두어서는 안 됩니다.

참조 카운팅을 사용할 수도 있습니다.누군가가 개체에 대한 참조를 얻을 때마다 "addReference" 등을 호출하고, 완료될 때마다 참조를 제거합니다.개수가 1일 때 누구든지 RemoveReference를 호출하면 객체가 스스로 정리될 수 있습니다.이는 아마도 C++에서 진정한 OO 스타일 할당/해제에 가장 가깝습니다.하지만 오류가 발생하기 쉽습니다.

제가 믿는 이런 종류의 일을 할 수 있는 라이브러리가 있습니다.

다른 팁

GUI 개체 생성자에서 매개 변수로 cManager를 전달하는 것이 좋지만 참조는 유지하지 마세요(여기에는 Java 코드가 있지만 이해가 되실 것입니다).

public GUI(CManager cManager)
{
    this.aManager = new AManager(cManager);
    this.bManager = new BManager(cManager);
    // don't bother keeping cManager as a field
}

나는 싱글톤이나 팩토리가 여기에 적합하지 않다고 생각합니다.

싱글톤은 주의해서 사용하세요. (쉬운 테스트를 원한다면 전혀 사용하지 마세요!)

필요에 따라 aManager와 bManager 모두에서 cManager에 대한 참조를 요청하기 위해 팩토리 패턴을 사용할 수 있습니다.

http://msdn.microsoft.com/en-us/library/ms954600.aspx

모델 및 구현에서 GUI를 분리하는 방법을 살펴봐야 합니다.

앱 전체에 cManager가 하나만 있어야 하는 경우 cManager를 싱글톤으로 만들 수 있습니다.

달성하려는 목표에 대한 논의 없이 답변하기가 까다롭습니다.그러나 나는 당신이 말한 대로 GUI가 aManager와 bManager에 포인터를 넘겨주도록 하라고 말하고 싶습니다.

GUI를 만들려고 하는데 데이터를 가져오거나 내보내는 방법이 궁금하다면 다음을 추천할 수 있습니다.http://codebetter.com/blogs/jeremy.miller/archive/2007/07/25/the-build-your-own-cab-series-table-of-contents.aspx

나는 이것이 주로 C# 사용자를 위해 작성되었다고 생각하지만 다른 언어에도 적용될 것입니다.나는 이것이 첫 번째 OO 애플리케이션에 필요한 것보다 더 발전된 것일 수 있다고 생각합니다.내 생각엔 당신이 OO 디자인에 관한 책을 구해서 그 책과 함께 저녁 시간을 보내야 할 것 같아요.

멍청한 놈으로서 처음부터 가장 완벽하고 올바른 방법으로 모든 일을 하려고 애쓰지 말고 그냥 뭔가 제대로 작동하도록 하는 것이 좋습니다.다양한 기준에 따라 솔루션이 다른 솔루션보다 나은 이유가 무엇인지 시간을 두고(그리고 많이 읽으면서) 배우게 될 것입니다.귀하의 질문에 대한 정답은 없습니다.

일반적으로 언제든지 변경 가능한 객체에는 명확하게 정의된 소유자가 정확히 한 명 있어야 합니다(객체는 일반적으로 수명 동안 여러 소유자를 가지며, 그 중 첫 번째 소유자는 생성자이며, 그런 다음 소유권을 호출한 코드에 전달합니다). 등) 객체에 대한 참조를 보유하는 다른 모든 항목은 해당 참조를 다른 사람이 소유한 객체에 대한 참조로 간주해야 합니다.

C++에서 Java 또는 .net으로 전환할 때 "이봐 멋지군. 더 이상 객체 소유권에 대해 걱정할 필요가 없어"라고 생각할 수도 있지만 사실은 아닙니다.변경 가능한 객체의 소유권은 GC가 아닌 시스템에서와 마찬가지로 GC 기반 시스템에서도 관련이 있습니다.어떤 수단도 부족하다. 표현하다 소유권은 누가 무엇을 소유하는지 알아야 하는 의무로부터 프로그래머를 해방시키지 않습니다.단지 그 의무를 이행하는 것이 더 어려워질 뿐입니다.

cManager가 변경 가능한 경우 aManager가 하나를 소유하고 bManager가 이에 대한 참조를 보유해야 하며 대상에 대한 모든 변경 사항이 aManager의 cManager에 영향을 미치는 것으로 생각하거나 bManager가 하나를 소유해야 합니다(aManager가 참조를 보유하는 등). 다른 엔터티는 하나를 소유해야 하며, aManager와 bManager는 모두 자신의 변경 사항이 다른 엔터티의 소유에 영향을 미치는 것으로 생각합니다.

소유권 개념을 인식하지 못하는 언어나 프레임워크를 사용하더라도 가변 객체를 다룰 때는 항상 그러한 관점에서 생각하십시오.그렇지 않으면 혼란과 재난을 불러일으킬 것입니다.

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