2015-09-18 22 views
5

我試圖找出是否有一種方法來阻止函數/方法被添加(編輯:由其他開發人員)到一個類的情況下,其中對象是一個模型或DTO不應包含方法防止其他人濫用模型/ DTO,他們可能會嘗試添加「幫手」方法等)。如何防止方法被添加到類中?

有什麼辦法可以達到這個目的嗎?

+3

只是不這樣做。 –

+4

編寫一個自定義的CodeAnalysis(FxCop)或「Roslyn」規則,將其添加到您的構建過程中,如果違反,會產生錯誤。 –

+0

@NickG這個問題太廣泛了,有點混亂 - 結構與防止方法有什麼關係?你或你不想從班級繼承? –

回答

5

如果模型類具有方法,則使用反射並編寫一個失敗的單元測試。

用自定義屬性標記您所有的模型類。然後進行一個使用反射來加載給定程序集的單元測試,迭代該程序集中的所有類並檢查標記了模型屬性的類沒有方法。這應該是相當直接使用反射。

+1

不要忘記構建一個繼承圖並檢查所有派生類型以確保它們沒有方法。如果你不能相信別人不添加方法,你當然不能相信他們添加你的屬性。 –

+0

@Asad不用擔心 - 我主要是出於好奇而不是其他任何東西:)我們沒有太大的問題,我甚至可能不會實施所提出的解決方案。我只是想知道是否有「快速修復」 – NickG

0

您不需要使用結構來防止添加到類中。您可以使用關鍵字sealed

public sealed class MyDTOObject { ... } 

現在,你不能固有的一類,也避免繼承(這基本上是你問)。繼承MyDTOObject的事實正在創建一個新類,其基於的不等於或不限於或以任何方式由執行MyDTOObject定義。

您可以使用abstract類來強制派生類實現某些方法,但不是相反。

如果要防止其他人從您的班級派生並實施幫助方法,則必須使用sealed關鍵字,或將班級標記爲內部。

+2

我認爲OP在詢問如何防止_any_方法,即使在「MyDTOObject」本身。 –

+1

我認爲OP的要求是希望能夠繼承和添加屬性,而不是方法。 –

+1

@ Christian.K:我說這是不可能的,除了讓這個類被封爲防止繼承。 (他指定「由其他開發人員」添加) – caesay

3

我相信你正試圖解決一個程序問題,你應該使用通信的代碼。

你的同事(我假設)正在使用'完全信任'特權的代碼文件。如果他們違反了這個特權,你應該打開對話。以更改爲契機,向他們介紹預期的設計。也許他們是正確的,你會受到教育!

我建議簡單地在課程名稱中加上明確的目標設計,並附註釋說明預期的性質。也許引用通知課程的設計文檔。

2

您不能妨礙任何人都可以對您的代碼庫進行完全寫入訪問。只有兩件事你可以做避免它是創建一些FXCop CodeAnalysis規則如Christian.K在評論中提到或通過編寫你的DTO類,使它無疑是一個DTO,不應該有任何方法通過使用一個unambigious名稱的類,如果這還不夠提供一些代碼註釋,通知編碼器不這樣做。

但是,如果使用集合,例如,您可能需要某種方法。如果您的DTO的兩個實例相同,則需要進行某種比較,因此您必須提供至少一個EqualsGetHashCode-方法。

0

您可以防止類通過標記它最終方式沒有人將能夠擴展您的類,因此不能夠添加任何行爲被擴展或繼承。但請停下來問問自己,不管你是否願意這樣做,因爲那樣你會簽署一份無形的合約,以至於班級所要求的一切都寫在班級中,而這個班級不需要進一步的補充。

說得很清楚,我在Java環境下談論。