2009-07-06 49 views
4

在代碼審查期間,我查看了一組存儲庫類(在vb.net中)。我習慣於看到這些存儲庫類中充滿了返回域對象的集合(除其他事項外)的函數。然而,這個倉庫有這樣看起來是這樣的1公共財產和1個私有變量:爲什麼使用公共屬性而不是函數來公開定製集合<T>

Private _item as Collection (of Customer) 

Public Item as Collection (of Customer) 
    Get... 
    Set... 

在「獲取」,有代碼,從私人_item的DAL並加載它得到了客戶。

使用屬性(customerRepository.Item)而不是普通的舊函數(customerRepository.GetAllCustomers)會有什麼好處? 「財產」的方式看起來很奇怪,但奇怪並不總是意味着錯誤。

+0

在二傳手他們做得到?問題是否是一個錯字? – jvanderh 2009-07-06 02:18:41

+0

對不起,我說「得到」,但我真的想打電話給其他一些代碼。開發人員實際上正在向讀者呼叫DAL,循環讀取並填充_item集合(全部在集合中)。這是奇怪的嗎? – EricCode 2009-07-06 02:26:13

回答

2

在此示例中,getter正在返回整個集合,並且允許用戶從中獲取項目。在存儲庫模式中,存儲庫是集合,您可以使用集合語義與集合進行交互,以獲取存儲庫應該保存的實體的特定實例。

此實現中的危險是此API的用戶有能力用另一個集合替換集合。這是不好的做法,在我看來

0

如果你的意思是在Get(而不是Setter)中「有代碼從DAL獲取客戶並將其加載到私有_item中」,那麼我已經看到代碼在哪裏完成了,但是在那裏是檢查私人_item是否爲空。然後它變成一個緩存,並且只有在第一次訪問時才從DAL讀取。每隔一段時間它就直接從私人_item返回。

當然,您也可以在GetAllCustomers中執行緩存方案。

+0

是的,你是對的。我的錯。謝謝 – EricCode 2009-07-06 02:27:30

3

我同意在訪問任何種類的DAL的setter中放入一個操作是不好的做法。

  • 操作是要溝通,他們應該考慮緩存結果的用戶夠貴:

    按照MSDN Property Usage Guidelines,必須使用時的方法。

  • 使用get訪問器獲取屬性值會產生可觀察的副作用。

很明顯,使用上述屬性違反了該準則。

+1

此外,從相同的MSDN鏈接: 當......連續調用成員兩次會產生不同的結果。 這可能會在每次調用屬性時訪問數據庫時發生。 db值可能會改變。 – EricCode 2009-07-06 03:00:42

相關問題