2010-02-15 46 views
10

傢伙,我有一個「最佳實踐問題,」比如我有這樣的類:要通過什麼?引用對象或值類型?

class Person 
{ 
    public int age {get; set;} 
} 

class Computer 
{ 
    public void checkAge(Person p) // Which one is recommended THIS 
    { 
     // Do smthg with the AGE 
    } 

    public void checkAge(int p)  // OR THIS 
    { 
     //Do smthg with the age. 
    } 
} 

什麼建議通過?正是我所需要的(int值類型)或整個對象(引用類型)

我問這是因爲林使用LINQ對我正在創建的應用程序,我創建了許多實體,我應該通過ID(foreing鍵),但Im傳遞對象。

什麼是最好的方法?

+1

+1我一直有這種困惑,不知何故被遺忘,現在澄清。謝謝。 – 2010-02-15 18:57:34

+0

這是我一直懷疑的問題類型。我需要問:D – MRFerocius 2010-02-15 21:01:30

回答

16

函數checkAge應該只接收執行其工作所需的最少量信息。添加其他任何東西只會創建人爲依賴關係。如果只需要一個int那麼這是我應該採取的解決方案。

+0

傑出的傑瑞德,所以我應該記住給最小的信息需要.-有時我需要通過2個整數,然後我應該給功能2整數,等等吧? – MRFerocius 2010-02-15 18:44:01

+0

@MRFerocious,我會創建2個函數。只需要1個'int'和另一個接受2個'int'並且具有明顯不同的行爲的版本 – JaredPar 2010-02-15 18:45:30

+1

這個原理被稱爲Demeter法則:http://en.wikipedia.org/wiki/Law_of_Demeter – 2010-02-15 21:23:22

12

我認爲在這種情況下,答案可能不是。 「Age」會被分解到它自己的類中,或者如果該操作是與Person相關的特定於上下文的,它將在Person類本身內部找到。

2

按照demeter的規律進行功能。基本上法律規定實體應該鬆散耦合。問問你自己下面的問題,如果一個計算機對象知道一個人對象?在這種情況下,也許你在checkAge內部正在檢查一個int值。如果是這種情況,那麼你認爲傳遞整個對象的原因是什麼?在這種情況下,簡單地傳遞人的年齡並將其作爲int來接受。

所以喜歡

public void checkAge(int n) 
3

與給出的信息,既不解決方案有利於

第一個解決方案要求計算機類來了解Person.Age,無緣無故

第二將計算機類的方法附加到與Computer對象的屬性無關的方法

某些上下文將是h elpful - 如果這是驗證,則CheckAge屬於Person類(可能具有IsAgeAcceptable屬性)

爲什麼計算機檢查某個人的年齡?這個答案決定了什麼是有意義的...

+0

@Steven A. Lowe - 我認爲OP只是舉一個例子。我確信*或希望他在Computer類中沒有真正的checkAge功能。 – JonH 2010-02-15 20:13:29

+0

哈哈哈夥計們,當然這只是一個例子。我問這是因爲我使用Linq和我需要傳遞一些ID,但在某些情況下,我有3個,所以我決定傳遞這些對象.-因此,我會去傳遞整數。 – MRFerocius 2010-02-15 20:34:25

0

我想指出,當傳遞引用時,引用是一個32位整數,而數據類型被複制。所以如果你的值類型大於32位int,那麼如果性能或內存是任何問題,則通過引用傳遞。

0

我想指出int Age可能不是存儲該值的最佳方式。 (Why is DateTime a Property and not a Method

class Person : IBorn 
{ 
    public DateTime Birth {get; set;} 
} 

interface IBorn 
{ 
    DateTime Birth {get; set;} 
} 

interface IDateTimeFactory 
{ 
    DateTime Now();  
} 

class DefaultDateTimeFactory : IDateTimeFactory 
{ 
    public DateTime Now() 
    { 
    return DateTime.Now; 
    } 
} 

public static class IBornExtensions 
{ 
    public TimeSpan AgeFromNow(this IBorn birthed, IDateTimeFactory dtf) 
    { 
    return dtf.Now() - birthed.Birth; 
    } 
    public TimeSpan AgeFrom(this IBorn birthed, DateTime from) 
    { 
    return from - birthed.Birth; 
    } 
} 

class Computer 
{ 
    public void checkAge(IBorn birthed)   
    { 
    var age = birthed.Age((new DefaultDateTimeFactory()).Now()); 
    } 
} 

我敢肯定有人在那裏想着,「那對於這個答案有很多代碼,請務必似乎離譜」。就像DateTime.Now應該是一種方法一樣(因爲方法返回的值可能會改變每個呼叫,並且屬性通常不會更改每的呼叫的值,請參閱上面的鏈接),每個呼叫的年齡更改,因此該屬性可能應該是Birth 。接下來,我將確定年齡的方法封裝爲擴展方法,因爲任何可以爲IBorn的東西當然可以有一個年齡(忽略某個事物的哲學問題已經死亡,它是否有年齡:P)。最後,創建了IDateTimeFactory對象,以便人們可以單元測試年齡方法以確定它是否正確計算年齡(否則,硬編碼DateTime.Now意味着您不能說出與其他事情相比有多舊,例如,老是我的兄弟與我的相比妹妹)。

相關問題