2010-05-26 47 views
15

我顯然是這些概念的全新。我只是不明白爲什麼你會限制訪問屬性或方法。看來你會根據預期的結果編寫代碼。爲什麼要創建一個私有方法而不是簡單地不調用該方法?是否需要創建迭代對象(如果我正確地說明了這一點),多個開發人員的情況(不要混淆其他人的工作),或者只是爲了不意外地搞亂自己的工作?我是OOP/PHP的新手。類的可見性和可擴展性的實用性是什麼?

+0

Bah。有很多類似的答案! – 2010-05-26 14:17:54

回答

7

這一切都歸結爲封裝。這意味着隱藏課堂的內部,只關心它的功能。如果你想擁有一個信用卡處理課程,你並不在乎它是如何處理信用卡的。你只是想能夠去:$creditCardProcessor->charge(10.99, $creditCardNumber);,並期望它的工作。

通過使某些方法公開和其他方法變爲私有或受保護,我們爲其他方法留下了入口方式,以便他們知道從哪裏調用代碼是安全的。公共方法和變量被稱爲「接口」。

對於任何職業,你有一個執行。這就是班級如何履行職責。如果是冰沙製作課程,班級如何添加配料,配料的添加等等,都是實施的一部分。外部代碼不應該知道和/或關心實施。

它的類的另一面它接口。接口是類的開發人員打算由外部代碼調用的公共方法。這意味着你應該能夠調用任何公共方法,並且它會正常工作。

+0

感謝您提供明確的定義和示例。 – 2010-05-26 14:50:01

8

我們創建私有方法,以便我們類的消費者不必關心實現細節 - 他們可以專注於我們的類爲他們提供的幾件漂亮的事情。

此外,我們有義務考慮每種可能的公共方法的使用。通過將方法設爲私有,我們減少了一個班級必須支持的功能數量,並且我們有更多的自由來改變它們。

假設您有Queue類 - 每次調用者向隊列中添加項目時,可能需要增加隊列的容量。由於底層的實現,設置容量並不是微不足道的,因此您將其分解爲單獨的函數以提高您的Enqueue函數的可讀性。由於呼叫者不關心隊列的容量(你正在爲他們處理),你可以使方法保密:呼叫者不會被多餘的方法分散注意力,你不必擔心呼叫者會做出荒謬的事情並且您可以隨時更改實現而不破壞使用您的類的代碼(只要它仍然在由您的類定義的有限用例中設置容量)即可。

5

使用封裝有幾個原因,其中最強的是:想象一下使用由別人編寫的大型複雜庫。如果每個對象都不受保護,您可能會在不知不覺中訪問或更改開發人員從未打算以這種方式操作的值。

隱藏數據使得程序更容易概念化並且更容易實現。

4

這是關於封裝。方法是私人的,可以做內在的工作,同時暴露優雅的功能,使事情變得簡單。例如。你可能有一個$ product-> insert()函數,它使用4個內部函數來驗證單例數據庫對象,使查詢安全等 - 這些內部函數不需要公開,如果調用,可能會搞砸其他結構或流程,您,開發人員已經落實到位。

8

你最後的兩點非常準確 - 你不需要多個開發人員讓你的東西搞砸。如果你在一個項目上工作了很長時間,你會意識到你已經忘記了你在開始時所做的很多事情。

隱藏某物的最重要原因之一是,您可以安全地稍後更改。如果一個領域是公開的,幾個月後你想改變它,這樣每當領域發生變化時,就會發生其他事情,你會遇到麻煩。因爲它是公開的,所以沒有辦法知道或記住有多少其他地方直接訪問該字段。如果它是私人的,你有一個保證,它不會在這個班級以外被觸及。你可能有一個圍繞它的公共方法,你可以很容易地改變該方法的行爲。

一般來說,你公佈的東西越多,你就越擔心與其他代碼的兼容性。

0

例如 - private/protected方法可能是在另一個(公共)方法中調用的某個類的一部分。如果這部分是以更公開的方式被調用的話,這是有道理的。然而你不希望這些方法在其他地方被調用。

這與類屬性完全相同。是的,你可以寫全民公開課,但最有趣的是什麼?

2

多開發情況(不 弄亂其他人的工作),或者只是 所以你不會弄亂自己的工作 意外怎麼辦?

主要是這兩樣東西。公開一種方法說:「這就是這個班級應該如何被其客戶使用」,使其私人說「這是一個實施細節,可能在沒有預警的情況下發生變化,哪些客戶不應該關心」,並強迫客戶遵循諮詢。

一個有一些有據可查的公共方法的類比不熟悉它的人更容易使用(這可能是它的原始作者,在6個月內首次查看它)是公開的,包括所有你不關心的小實現細節。

1

它使協作更容易,你告訴你的類的用戶哪些部分不應該經常改變,並且你可以保證如果你的對象只使用公共方法就會處於有意義的狀態。

它不需要像私人/公共/任何(我的意思是由語言強制)區分那麼嚴格。例如,在Python中,這是通過命名約定來完成的。你知道你不應該混淆標記爲不公開的任何東西。