2009-04-27 5 views
1

우선, 제목이 내가 언급 한 내용을 정확하게 설명하는지 잘 모르겠다. 그래서 이것을 무엇이라고 부르는지에 대한 의견을 남기거나, 담당자가 있다면 스스로 이름을 변경하십시오.이중 연결된 다 대다 관계를 정리하는 방법은 무엇입니까?

것은의 내가 2 개 클래스, 도서 및 라이브러리를 가지고 예를 들어 가정 해 봅시다. 라이브러리에는 소유하고있는 모든 책의 목록 인 속성이 있습니다. 책은 그것이 속한 모든 도서관의 목록이라는 속성을 가지고 있습니다. 책에

가 나는 도서관의 목록입니다에서 라이브러리를 제거하는 RemoveFromLibrary 방법이있다. 나는 또한 같은 방법으로 상대방, 즉 자신이 소유 한 도서 목록의 도서관을 정리하기를 원한다. 라이브러리의 RemoveBook 메소드도 포함되어있는 북의 라이브러리 목록을 정리합니다. 모든

첫째, 메이크업의 의미는 무엇입니까? 필자는 코드를 호출하여 정리 작업을 걱정할 필요가 없으며 하나의 논리적 작업을 수행하는 두 가지 메서드를 호출 할 필요가 없다고 생각합니다. 나는 그것이 하나의 목록에서 제거하는 것이 타당하지 않다는 것을 의미합니다. 동시에, 이것이 너무 강하게 결합되어 있다고 말할 수 있지만, 문제가된다면 나는 그것을 리팩토링하여 디커플링 할 것입니다.

구현하는 방법에 관해서는 잘 모르겠지만 정상적인 public 메서드를 호출하면 각 메서드가 무한 루프로 반복되어 호출됩니다. 클린업을하지 않는 별도의 내부 속성 (C#으로 작업)을 만들 수도 있지만 API를 다른 메서드에서 호출하기위한 메서드로 처리하고있는 것처럼 느껴집니다. 또는 기본 컬렉션을 내부로 노출 할 수 있지만 좀 더 좋지만 이상적으로 보이지는 않습니다. 더 나은 해결책이 있습니까? 아니면 그 둘 중 하나만 가지고 가야합니까?

+1

이 그냥 보인다

은 BTW

class Book { Library[] libraries; void RemoveFromLibrary(Library lib) { libraries.remove(lib); if (IsInLibrary(lib) && lib.HasBook(this)) // prevents call-loop lib.RemoveBook(this); } bool IsInLibrary(Library lib) { return libraries.Contain(lib); } } class Library { Book[] books; void RemoveBook(Book bk) { books.remove(bk); if (HasBook(bk) && bk.IsInLibrary(this)) // prevents call-loop bk.RemoveLibrary(this); } bool HasBook(Book bk) { return books.Contain(bk); } } 

편집이 (컴파일하지 않을 수 있습니다)에만 의사입니다 나에게 비린내 같은 디자인, 솔직히 말해서, 특정 성능 최적화가 중요하지 않은 경우. 나는 왜 당신이 한 책 또는 다른 책 (아마 책에서 도서관까지)에 백 링크가 필요한지 생각해보고, 당신이 그들을 없앨 수 있는지 평가할 것이다. – mquander

+0

나는 두 객체 중 주어진 관계를 제거 할 수있는 코드를 호출하는 것이 더 편리하고 자연스러운 것 같다. 나는 이것이 세계에서 가장 좋은 이유는 아니라고 생각하지만, 그것에 대해 어떤 단점도 보지 못한다. 그래서 그것은 작은 프로 대 노협처럼 보인다. 내가 틀릴 수도 있고, 내가 모르는 죄수가있을 수도있다. – Davy8

답변

1

어쩌면 작동 할 것입니다. 다른 클래스의 remove 메서드를 호출하기 전에 객체 (예 : 책)의 목록에 여전히 제거되기를 원하는 객체가 있는지 확인하십시오. 그것을 쓰는 동안 나는 졸린했다 ... 의견에 따라 코드를 고정 : P

+0

와우 ... 네가 지적한 바로는 그렇게 명백해 보인다. Btw, 로컬 제거는 다른 목록에서 확인/제거하기 전에 필요합니다. if 조건은 항상 true이기 때문에 작성한대로 무한 루프가 유지됩니다. 어쨌든 그 개념을 +1하면, 당신이 그걸 고치고 아무도 더 좋은 대답을 게시하지 않으면 받아 들일 것입니다. – Davy8

+0

또한 RemoveBook (Book bk)에서 bk.RemoveLibrary (this)를 의미 할 때 book.RemoveLibrary (this)가 있습니다. – Davy8

+0

고정 .. 어쨌든 당신은 생각을 가지고 :) – Aziz

관련 문제