我看到它的方式,我不得不編寫我可以測試的代碼,但那不支持接口的語言支持,或者使用語言支持,但是在測試時遇到困難。
爲什麼您需要訪問private
變量和函數?要麼他們在某些時候被函數調用(不過是間接的),要麼他們只是不可訪問的代碼段,根本不應該存在,因爲沒有辦法調用它們。想想看,如果private
方法完全是不可能從課外以任何方式調用,它是否會運行?
如果你真的想測試一個private
方法,你可以把它放到它自己的類中。另外,如果它如此複雜以至於它確實需要單獨進行最佳測試,那麼它有可能首先有機會。另一種選擇是隻要你需要/想要測試它就公開,但實際上並沒有改變'真正'的代碼(把它留給private
)。正如其他人所說,有些語言還具有的功能,幫助你測試這些方法通過將他們略多,如朋友C++,internal in C#和package-private in Java.Occasionally the IDE's themselves even help out.
有沒有什麼好的理由去發出錯誤和不警告?
一大原因不是所以你不能打電話給他們,其他人不能打電話給他們。想象一下,你正在寫一個將被大量客戶使用的圖書館。你已經標記了他們不需要撥打private
的所有內容,並且他們需要的所有功能都是公開的。程序員繼續前進,開始使用你的庫,用它編寫一堆代碼,並且自己和他們自己的客戶都生產出滿意的客戶。
幾個月後,你決定爲你的大規模成功的圖書館加油,並發現你需要做一些重構。因此,您[重命名,添加/刪除參數,刪除]一些private
方法,但要小心保持所有公共方法的接口完全相同,以便升級無縫過程。 但是在此Universe中,編譯器僅在訪問private
變量時發出警告而不是錯誤,並且幾個客戶端程序員編寫了調用這些private
方法的代碼。現在,當他們嘗試升級到您的圖書館的新版本時,他們會遇到一堆真正的錯誤,因爲他們不能再調用這些private
方法。現在,他們不得不花時間找出代碼出了什麼問題,並重新編寫了大部分代碼,他們不記得任何事情(我提到這是未來兩年?)。因此,他們必須徹底重新學習如何使用你的庫並重寫他們的客戶代碼,這對任何人來說都是無趣的。現在他們很不高興,因爲你太過分了,以至於在升級過程中逐字打破所有代碼並使他們的生活變得更加困難。
猜測當他們修復代碼時,他們研究並調用了新的private
方法,因此如果您在發佈升級時決定更改界面,整個循環會重新開始。對你而言,稍微方便一點就是給你一堆不滿意的顧客。
等等,是不是他們打電話給我的私人方法的白癡?他們爲什麼不看警告?這是他們的錯,不是我的!
嗯,是的,這是他們的錯,他們可以通過注意這些警告來防止問題。但並不是每個人都是想要修正和理解警告的代碼質量的狂熱分子,並且大量的人忽略它們。問題是,如果編譯器發出嘗試訪問private
變量和方法而不是警告的錯誤,則可以自己阻止整個事件,否則private
關鍵字根本就不存在。你可能已經失去了一點時間,因爲這些方法很難測試,但是你已經獲得了讓那些不那麼聰明的人不會濫用你的代碼並將任何問題歸咎於你的問題的能力。
我最喜歡的軟件開發原則之一(以及一般的產品設計)是應該易於正確使用,或者不能正確使用。真正的私人成員是這種建議的體現,因爲它們使您的代碼無法正確使用。
[假設的反駁:]那麼,使用我的代碼的人應該足夠聰明,弄清楚。我要求他們只是花點時間正確使用代碼。
因此,您有意識地拒絕花費時間來提高代碼的質量並使其更易於使用?然後,我不想要什麼與你的代碼。顯然你的時間比你的客戶更重要,所以我會花2.5秒時間關閉你的項目的網頁,然後點擊下一個Google結果。你所使用的圖書館中有更多private
的成員比你想像的要多得多,而光榮的是你不必花費你的時間毫秒來擔心它們,因爲它們對你完全是隱藏的,只會分散在public
界面中提供的更簡單更好的方式。如果所有內容都是公開的或者是懦夫警告 - 私密的,那麼在你真正找到你想要的東西之前,你必須篩選更多的功能。
每當您在成員函數之前鍵入private
時,您已經給了自己權力以任何方式在未來的任何時候更改它,因爲除了您之外,沒有人可以觸摸它。第二個人試圖訪問它,他們會得到一個停止顯示的錯誤,因爲編譯器有你的背面,並且當你已經以更加可用的形式提供了他們需要的所有東西時,他們不會讓它們對你的代碼做任何愚蠢的事情在你的public
界面。
是的,它會使現在測試變得稍微困難一點,但它也確保了您在將來重構時可以不必擔心它,並且使您的代碼更容易批次人們使用。繼續並暫時公開它(我有點像你的'全公開編譯器開關的想法:),但不要忘記當你完成你的時候把它切換回來,你的客戶都可以用簡單的更具適應性的代碼。 :D
解決方法是不寫測試,直接訪問被測對象的私有成員。您的測試應該在公共界面上運行。 –
按照設計,不應私人成員有其他(公共)方法已經調用它們?私人方法的想法是細分一個班級的內部運作而不會使其公共界面複雜化。爲什麼你會寫一個沒有目的的私有方法(即一個公開的方法來調用它)? – Stecman