簡體   English   中英

通過一個對象的字段相對於整個對象本身,是否“便宜”些?

[英]Is it less 'expensive' to pass the field of an object as opposed to the whole object itself?

考慮以下類別:

public class Person
{
    public String FirstName;
    public String LastName;
    public DateTime DateOfBirth;
    public StaffType PersonType;
}

以及以下兩個方法和方法調用:

public void DoSomethingWithPersonType(Person person)
{
    TestMethod(person.PersonType);
}

(由DoSomethingWithPersonType(person);調用)

public void DoSomethingWithPersonType(StaffType personType)
{
    TestMethod(personType)
}

(由DoSomethingPersonType(person.PersonType);調用)。

哪種方法更有效? 他們倆都一樣“高效”嗎? 因為只是傳遞了一個引用,所以沒有區別嗎? 還是通過的參考在某些方面有所不同?

我問的原因是因為我在當前項目中選擇了第一個方法簽名-之所以這樣做是因為以后我們可能需要使用“人員”的其他字段-因此更易於擴展/我所擁有的是一種適應性強的方法-但這是一種更昂貴的方法嗎?

編輯:注意-不用說,這些差異將是微不足道的,否則我將已經遇到過一些情況,因為對性能的影響足以讓我采取行動。 這僅僅是出於好奇。

在性能方面,它們將是相同的。 在這兩種情況下,您都傳遞了一個引用(具有相同的性能成本),在兩種情況下,您都從一個字段中獲取了PersonType對象。

此處唯一的區別在於代碼的可讀性/可維護性等方面。通常,最好的方法是僅接受所需的信息。 如果只需要一個PersonType則只接受一個PersonType 它允許更靈活地使用該方法。 (如果除Person之外的其他Person具有PersonType怎么辦?)如果您認為實際需要的不僅僅是Person類型,那么接受Person可能是合適的。

還要注意,即使這里有所不同,也肯定會很小。 您不應該考慮運行成本的問題。 這些天計算機速度很快。 即使是較差的算法也往往花費很少的時間在實踐中運行(從一個人的角度來看)。 如果您發現程序的運行時間比需要的時間長,那么該是時候開始尋找可以改進的地方了。 您應將重點放在代碼的那些區域(由探查器識別)上,這是處理器時間的很大一部分。 網絡通信(包括數據庫調用)和其他IO往往是優化的良好目標。

另請注意,擁有公共場所通常被認為是不好的做法。 至少,您應該應該擁有公共屬性。

您決定傳遞給該方法的任何性能影響將取決於上下文。 如果在同一個類中的方法之間傳遞參數,則性能暗示將非常小,如果通過RMI調用方法,則情況就不同了。

這在某種程度上取決於StaffType的類型,但是通常情況下性能差異可以忽略不計。

如果StaffType是一個類,則沒有任何區別,因為兩者都是引用。 如果是enum則傳遞StaffType值的速度比引用要快一些。

(如果StaffType是一個大struct ,那么傳遞會比較慢,但是實際的問題是struct設計struct ,而不是您如何使用它。)

因此,您應該使用最有意義的一種。 通常,您應該發送盡可能少的信息,只是為了更輕松地了解該方法的實際用途。 究竟是應該發送StaffType值還是要發送整個Person對象以用於將來可能的擴展,這很難說,但是請考慮YAGNI原則-您將不需要它。

大概StaffType是一個枚舉。 在這種情況下,它應該比傳遞對象引用更有效率,枚舉將減少垃圾回收工作。

但是任何差異都可以忽略不計,在這種情況下,我認為可擴展性更為重要。

說到效率,它們是平等的,因為在兩種情況下,您都將傳遞一個引用(說兩個類,否則,如果StaffType是一個結構,則第二個會更慢)。 但是就最佳編碼實踐而言 ,這取決於您要做什么。 如果不需要Person類中的任何其他屬性,則應使用第二個屬性,因為應傳遞的信息越少越好,但是如果必須在person對象上進行更多的工作,則應使用第一個解決方案。

但是您必須考慮方法和框架的可重用性 ,假設您不僅需要對Person類型使用此方法,而且還需要將其用於另一個“類型”,您必須重寫另一種方法以用於它以及代碼更少的面向對象編程的目標將消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM