2013-01-09 23 views
0

TruckStop有一個List(TruckClass)和一個稱爲Weigh()的方法。 TruckClass需要調用Weigh()。以下兩種設計的優點/缺點是什麼? TruckClass具有對TruckStopClass的引用並調用MyTruckStopClassReference.Weigh()Vs. TruckClass引發由TruckStopClass處理的TruckClass.Weigh事件。。網絡設計優點/缺點:彼此參照對象比。活動?

我讀過引用對象的對象不會影響GC,但它需要每個TruckClass中的額外引用。在硬幣的另一面,我讀過「事件處理程序」也是參考文獻,如果您沒有取消它們,可能會導致問題。對於這個問題的優點/缺點/最佳實踐/意見,我們將不勝感激。

+0

我想你只有一輛卡車停下來,有一個或多個磅秤和許多卡車。在可能的情況下堅持實際 - 卡車停止管理磅秤,因此您的TruckStop類必須在卡車上調用GetWeigh()。你不能相反,因爲卡車不知道是否有規模可用或不是他們的工作知道 –

+0

卡車/ TruckStop是一個製造的例子。更不用說卡車司機可能決定在決定權衡之前首先獲得燃料。我更關心的是在「子類」必須觸發某個「父類」方法調用的情況下,相互引用的對象相對於引發事件的對象的優點/缺點。 – N0Alias

+0

如果孩子不需要,孩子可以與父母聯繫在一起。他們有單獨的責任,應該這樣對待。關於垃圾收集器的討論在這一點上是過度的。 –

回答

-1

我的解決方案是在TruckStop類中包含TruckClass和Weigh()方法。喜歡的東西:

Class TruckStop 
    Class Truck 
     (private attributes) 
     (public properties) 
    End Class 

    Public Shared Function Weigh(truck) as Weight 
     (code) 
    End Function 
End Class 

和參考這樣的:

weight = thisTruckStop.weigh(thisTruckStop.Truck(truckNum)) 
0

至於這兩種方法都在關注,我會更傾向於朝兩個類是個人,而不是由事件綁在一起瘦/處理程序。在這個理論情況下,我將稱重功能位於模塊內部或卡車停止類別的共享功能中,並以卡車作爲參數。

如果你打算去事件路線,那麼讓一個類處理在一個單獨的類中引發的事件並不是一個非常好的做事方式。在我個人看來,如果我曾經這樣做過,我會感到非常骯髒,因爲這會導致兩個班級緊密結合,至少會覺得你在屠宰OOP設計。

我在過去爲了整合表單初始化而處理可以從多個位置調用相同表單的程序時所做的一切,都有可能啓動表單的事件將事件提交給一個普通的容器,無論它是一個基本表單或一個容器類,或者沿着這些行的東西,然後在該父表單/類/容器上處理來自所有孩子的每個事件。關於這一點的好處是你可以讓所有事件由一個子過程(或函數,但是你想定義它)來處理,它調用表單初始化器,並且如果你需要改變表單的創建方式並顯示它的全部內容一個地方。

本示例與您的示例並不嚴格相關,但如果稍微更改您的示例並說兩個類別都會導致某些車輛被稱重,那麼將接入點集中到卡車的稱重功能將使管理該項目這很容易。

+0

感謝您的回答。作爲後續,這是否意味着Form/Button關係也是OOP設計的屠殺?按鈕是表單的控件屬性的一部分,引發點擊事件,但是是一個單獨的類。 – N0Alias

+0

@NoAlias:我一直認爲任何控件和父窗體都是一種特殊情況,但是當你退後一步並將它們看作是獨立的類時,它確實適合這種模式。我想說,當類正在處理事件的類引發事件_depends_時,該行將被繪製。所以在按鈕和表單的情況下,他們會通過OOP測試,因爲按鈕並不在乎是否有任何東西在聆聽點擊,無論點擊什麼,點擊都會觸發它。因此,如果沒有依賴於傾聽的東西,那麼在「卡車」中提升事件並不會是壞事。 –