什麼是好的OOP方式?對象從其容器中移除本身
現在我有一個包含到其容器的引用的每一個對象,以及其鍵或索引來標識本身在該容器的一個副本。 DeleteMe()方法調用容器的Delete(key)方法。我認爲這很糟糕,因爲緊密耦合,循環引用和密鑰/索引的副本。
我想這樣做的原因是因爲每個對象在UI表示,並具有自身產生的上下文菜單中,包含「刪除」和「重命名」選項。
聽說委託或事件都可以在這裏使用,但我真的不明白他們背後的動機,如果他們只是YAGNI我。
什麼是好的OOP方式?對象從其容器中移除本身
現在我有一個包含到其容器的引用的每一個對象,以及其鍵或索引來標識本身在該容器的一個副本。 DeleteMe()方法調用容器的Delete(key)方法。我認爲這很糟糕,因爲緊密耦合,循環引用和密鑰/索引的副本。
我想這樣做的原因是因爲每個對象在UI表示,並具有自身產生的上下文菜單中,包含「刪除」和「重命名」選項。
聽說委託或事件都可以在這裏使用,但我真的不明白他們背後的動機,如果他們只是YAGNI我。
理想的情況下刪除,重命名操作不應該屬於對象,這些應該只屬於容器。
我想這樣做的原因是因爲每個對象在UI中表示,並具有自身產生的上下文菜單中,包含「刪除」,選擇「重命名」
還是關於集裝箱作業應調用像
container.Delete(Object)
container.Rename(Object, String newName)
通過創建DELETEME,重命名對象本身,你創建的對象依賴於日然後它不能用於存儲在其他容器中,如列表,字典等(或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);
上面的代碼只是大綱,您可以根據需要自定義。其他操作(如重命名)可以類似地添加。
刪除/重命名等不屬於對象,而是屬於某種使用這些對象的系統或容器。正如文件系統負責管理文件一樣,文件不會「自行刪除」。 –
你能澄清你的命令模式的例子嗎?最後一行是在被刪除對象的上下文菜單處理程序中?它從哪裏得到它的命令對象? – user1318499
此外,根據參考刪除似乎它需要一個O(N)的搜索。我更喜歡使用索引或字典鍵。 – user1318499
一個好方法?不確定。但這聽起來像是一個濫用[WeakReference]的機會(http://msdn.microsoft.com/en-us/library/system.weakreference.aspx?ppud=4)。 – HABO