2012-05-16 3 views
0

좋은 OOP 방법은 무엇입니까?개체가 컨테이너에서 자신을 제거합니다.

이제 컨테이너에 대한 참조를 포함하는 모든 개체와 해당 컨테이너에서 자신을 식별 할 수있는 키 또는 인덱스의 복사본이 있습니다. DeleteMe() 메서드는 컨테이너의 Delete (key) 메서드를 호출합니다. 나는 이것이 단단한 커플 링, 순환 참조 및 키/색인의 중복 사본 때문에 좋지 않다고 생각합니다.

각 개체가 UI에 표시되고 "삭제"및 "이름 바꾸기"와 같은 옵션이 포함 된 상황에 맞는 메뉴가 있으므로이 작업을 수행하려는 이유가 있습니다.

대표자 또는 이벤트를 여기에서 사용할 수 있다고 들었지만, 그이면의 동기와 실제로 YAGNI인지 이해하지 못합니다.

+0

좋은 방법이 있습니까? 확실하지 않다. 그러나 [WeakReference] (http://msdn.microsoft.com/en-us/library/system.weakreference.aspx?ppud=4)를 악용 할 수있는 기회 인 것처럼 들립니다. – HABO

답변

2

이상적으로 삭제, 이름 바꾸기 작업이 개체에 속해서는 안되며 컨테이너에만 속해야합니다. 각 개체는 UI 표현 자체에 의해 생성 된 상황에 맞는 메뉴를 가지고 있기 때문에

내가 이렇게 할 이유는

"이름 바꾸기" "삭제"와 같은 옵션이다

가 여전히 컨테이너 작업 DeleteMe을 만들면

container.Delete(Object) 
    container.Rename(Object, String newName) 

처럼 호출해야, 개체 자체에서 이름 바꾸기를, 당신은 일에 따라 개체를 만드는 컨테이너 등의 다른 컨테이너에 저장하는 데 사용할 수 없습니다. (또는 DeleteMe가 실패합니다.)

이제 삭제 핸들러가 컨테이너에서 객체를 삭제해야하는 요구 사항의 경우 command pattern . 예 :

DeleteCommand command = new DeleteCommand(); // Create new Command 
CommandManager.Register(command); // Create CommandManager class that will have mechanism of registering command, and has reference to object container. method is something like command.Set(Object container) 
command.Execute(this); // pass instance as parameter, and in the Execute it will be similar to container.Remove(parameter); 

위 코드는 개요에 불과하며 요구 사항에 따라 사용자 지정할 수 있습니다. 다른 작업 (예 : 이름 바꾸기)은 비슷하게 추가 할 수 있습니다.

+0

삭제/이름 바꾸기 등의 +1은 개체에 속하지 않지만 이러한 개체를 사용하는 일종의 시스템이나 컨테이너에 속합니다. 파일 시스템이 파일 관리를 담당하는 것처럼 파일도 "스스로 삭제"하지 않습니다. –

+0

명령 패턴 예제를 명확히 할 수 있습니까? 마지막 줄은 삭제되는 개체의 컨텍스트 메뉴 핸들러에 있습니까? 어디서 명령 객체를 얻을 수 있습니까? – user1318499

+0

또한 O (N) 검색이 필요한 것처럼 참조에 따라 삭제하는 것 같습니다. 색인 또는 사전 키를 사용하는 것을 선호합니다. – user1318499

관련 문제