這個問題的背景是基于一個實際示例,我想從一對用于管理對共享資源的讀/寫鎖定訪問的類中刪除“ friend”依賴項。這是該方案的原始結構設計的抽象:用紅色標記,我要從設計中刪除這種難看的“ friend”依賴項。簡而言之,為什么我要在這里放東西:ClassAProvider共享對ClassA多個并發訪問Client實例的引用Client實例應ClassA僅通過ClassAAccessor管理內部的助手類進行訪問ClassA隱藏所有打算使用的方法,使其處于ClassAAccessor受保護狀態。這樣ClassA可以確保Client需要使用ClassAAccessor實例如果要確保操作失?。ɡ缬捎谖床东@的異常)ClassA,則在確保將實例保留在定義的狀態時,這種模式非常有用Client??紤] ClassA提供類似lock()/ unlock()或open()/的(內部可見的)配對操作close()。在任何情況下都應調用(狀態)反轉操作,尤其是當客戶端由于異常而崩潰時??梢酝ㄟ^ClassAAcessor的生命周期行為來安全地處理此問題,析構函數的實現可以確保這一點。下面的序列圖說明了預期的行為:另外,僅使用C ++范圍塊,Client實例就可以實現對ClassA輕松訪問的精細控制:// ...{ ClassAAccessor acc(provider.getClassA()); acc.lock(); // do something exception prone ...} // safely unlock() ClassA// ...到目前為止,一切都很好,但是由于多種原因ClassA,ClassAAccessor應該刪除和之間的“朋友”依賴項在UML 2.2上層建筑,下從以前的UML更改部分C.2,它說: The following table lists predefined standard elements for UML 1.x that are now obsolete. ... ?friend? ...我見過的大多數編碼規則和準則都禁止或強烈不鼓勵使用友人,以避免從導出類到友人的緊密依賴。這件事帶來了一些嚴重的維護問題。正如我的問題標題所說如何正確刪除/重構朋友聲明(最好從我的類的UML設計開始)?
2 回答

浮云間
TA貢獻1829條經驗 獲得超4個贊
依賴關系對訪問屬性或操作一無所知。依賴性用于表示模型元素之間的定義依賴性!如何從模型中刪除所有依賴項并了解如何使用可見性。如果您的朋友關系代表從特定類型(類)訪問功能(屬性或操作),則可以將屬性或操作的可見性設置為Package。包可見性意味著,可以從實例中訪問該屬性值,這些實例的類在同一包中定義。
在同一包中定義ClassAProvider和Client,并將classA屬性可見性設置為Package可見性類型。客戶端實例可以讀取classA屬性值,但同一包中未定義的其他類型的實例則不能。
- 2 回答
- 0 關注
- 437 瀏覽
添加回答
舉報
0/150
提交
取消