我很難嘗試讓我的團隊對基於界面的編程感到舒適......任何人都有一些建議?什麼是最好的比喻來幫助非OOP開發人員grok基於接口的編程?
回答
爲了幫助您的團隊對這個想法感到滿意,最好的途徑是展示基於接口的開發可以實現什麼,以及如何在沒有它的情況下完成同樣的任務。爲了讓他們「真正」接受並開始理解它,他們首先需要理解並感受到它所解決問題的痛苦。他們真的需要擁有「我每次發生與自己或團隊對話時都必須做X的病態和厭倦」。有一兩件事,我的父親在我的「形成性」多年鑽入我是這個小寶石:
無論它有多少次被 告訴你,你永遠不會有 答案,直到你問的問題。
一旦這個對話發生(由個人或團隊自發)這是真正的學習發生的地方。訣竅是培養一個能夠激發這些類型問題的環境。如果你能向他們表明他們想要接口解決的問題的答案,那麼他們會自己提出問題。
一個很好的例子演示接口的用途如下:
你被分配爲在國際數學會議保鏢。你被告知只能讓那些人能夠爲「什麼是二加二」這個問題提供正確的答案。由於這是一個國際事件,因此很多人試圖進入那些講不同語言的人。起初,你的策略是找出(或猜測)一個請求入口的人講什麼語言,然後找到一個口譯員講同樣的問題,並通過他提出問題。事實證明,這是有效的,很快你就會學會快速識別一些語言,並且現在知道哪些口譯員說這種語言,但是當說出一種你無法識別的語言的人出現時,你會很痛苦必須花費所有時間來弄清楚它是什麼,然後找到合適的解釋器。所以,知道必須有一個更好的方法,你試着找出一個改進的方法來完成你的工作,那就是當你談到你的時候。你得到每一個有人想出時間進入公約的一令紙以及一些記號筆和,你寫在一張紙上如下:
2 + 2 =
你瞧,它的工作原理!每個人都快速提供答案。你不必知道該人說什麼語言或找到翻譯。哎呀,你甚至不在乎他們說什麼語言,他們只是回答這個問題,因爲他們都知道數學!您不必單獨計算每個案例,而是使用參加數學會議的每個人都能理解的「IKnowMath」界面。
An Interface is a Contract。它只是指定了Class的某個特定類別(很難在此處找到類)作爲公共API提供的內容。
這是很好的閱讀。接口是我一直有點害羞拉起觸發器。你多久使用一次接口?何時何時不使用它們的最佳實踐是什麼?對我來說,在Andrew的例子中,它似乎創造了許多額外的工作。該應用程序需要相當大的證明。 – 2009-01-09 19:03:11
我一直都在使用它們。如果應用程序很小,但有可能增長,那麼您仍然可以使用接口而不是編程實現。 – 2009-01-09 19:08:34
請參閱http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface瞭解更多示例和原因,以便您編程到界面。 – 2009-01-09 19:18:07
什麼是他們熟悉?
當我學過C++,建立在我現有的C知識的老師,例如:
- 乘坐的C庫函數文件I/O:打開,讀取,並關閉使用文件處理
- 展示如何將這些可改寫爲文件類的方法:創建,調用read方法,調用File實例上最重要的是
大樓的析構函數,我可能會一個的IFile接口比較文件通過說IFile沒有公開實現細節全部:如果應用程序使用IFile而不是File,那麼您可以更改底層文件系統/實現細節)。
好點,這些開發大多數是經典的asp,非oop,非comp sci背景,所以程序員程序員... – 2009-01-09 18:20:05
我建議你向他們展示可以從中獲益的好處。想象一下這樣的C#情景:
class User
{
public String GetFirstName() { return "foo"; }
}
class App
{
void Run()
{
User user = new User();
String firstName = user.GetFirstName();
}
}
在這裏,我們有一個User
類,會去從什麼地方獲得頭名,並將其返回。現在,您的應用程序與此課程相關聯,並且稍後將難以更改您的名字,因爲您已在各地使用User
課程。如果您實施服務並希望開始致電FirstName
價值服務,會發生什麼情況?你會有一些重構。
考慮使用此方法:
interface IUser
{
String GetFirstName();
}
class User : IUser
{
public String GetFirstName() { return "foo"; }
}
static class UserFactory
{
public static IUser GetUser() { return new User(); }
}
class App
{
void Run()
{
IUser user = UserFactory.GetUser();
String firstName = user.GetFirstName();
}
}
現在你可以實現你要喜歡的任何類接口:
class UserService : IUser
{
public String GetFirstName() { return "bar"; }
}
,只是改變像工廠方法:
static class UserFactory
{
public static IUser GetUser() { return new UserService(); }
}
而你的應用程序代碼將不會更聰明。
接口就像一個班級的着裝要求。如果一個類實現了一個接口,那麼它的公共成員(如果你願意的話,它將出現在其他類中)將包含接口聲明的最小值。
教學在我們公司的新員工大三時,我已經成功地用另一種方式是考慮一個接口爲「尋找對象的方式」,從字面上。
模擬:採取的3D對象,像一塊管。根據您查看的方向,它看起來像(「表現爲」)圓形,矩形或3D對象。鑄造的概念可以很容易地等同於「嘗試旋轉對象,所以你可以把它看你想要的方式/需求」,這無論是成功或失敗根據目的,你正在尋找的視圖上。
這個模擬結果並不是100%,但它可以幫助爲那些還沒有把概念理解成具體的東西的人提供一些非常抽象的東西。
告訴他們接口是個詭計。因爲這個意思是隱藏在公開的:P
接口描述...接口。他們告訴你如何與實現它的類進行交互。
從Head First設計模式
講故事像其在Head First設計模式做的方式深入淺出設計模式或至少示例代碼副本的實際工作大量的時間與懷疑論者
問候 Edwards
我喜歡Legos的類比,它們分別是類和實例,以及頂部/底部的掛釘/孔以及尺寸和形狀,它們是界面。例如,我可能需要一個矩形塊,其格子爲2x4。這些是我感興趣的界面 - 掛鉤的男性/女性界面,以及矩形界面。這些可以通過矩形塊樂高的實例或兩個半尺寸的樂高玩家「組成」的另一個實例來滿足,每個實例爲2x2個螺釘,從而仍然遵守所述界面。因爲所有的樂高玩家都有一個共同的界面(男性和女性的釘子),我們可以混合並組合一個必要的組合,不管這個組合是來自哪一個新的組合,我可以製作一個巨大的機器人螞蟻,或者只是一個普通的舊方形或矩形。來到你曾經在白天迴歸的巨大桶中的樂高。地獄,我甚至可以將官方的Legos與X品牌的Legos混合使用,因爲「男性/女性的盯着界面」非常瞭解。
接口編程允許我們混合和匹配可重用的代碼組件,就像我們做的樂高玩具一樣。
- 1. 什麼是Microsoft開發人員最好的操作系統?
- 2. 對於開發人員來說,最有幫助的混合資源
- 3. 爲什麼PHP開發人員比.NET開發人員便宜?
- 4. 幫助開發基於套接字
- 5. 對於有經驗的PHP開發人員來說,什麼是一種很好的GUI編程語言?
- 6. 什麼是最好的HTML WYSISYG編輯器可用於Web開發人員,爲什麼?
- 7. 什麼是最好的方式來幫助你的測試儀?
- 8. 什麼是開發者控制檯上的beta/alpha測試?它對開發人員有什麼幫助?
- 9. 對於不是優秀程序員的測試人員來說,什麼是好的編程語言?
- 10. JSON如何幫助Web開發人員?
- 11. Jquery Mobile Framework幫助Web開發人員
- 12. 作爲一個Web開發人員,RFC的好處是什麼?
- 13. 對於有經驗的ASP.NET開發人員來說,學習Windows Forms/WPF編程有什麼好的資源?
- 14. 什麼是好的資源來了解iOS開發人員的Web服務?
- 15. 開發算法和開發人員的人員之間最有效的工作流程是什麼?
- 16. 幫助開發基於網絡的多人遊戲
- 17. 開發人員生產力最好的服務器端Web框架是什麼?
- 18. 面向程序編程人員的OOP
- 19. 您認爲最低開發人員級別的PC是什麼?
- 20. 後臺工作人員的幫助。非常基本
- 21. asp.net * WebForms *開發人員對未來的期望是什麼?
- 22. weblogic門戶開發人員的未來是什麼?
- 23. 什麼是基於接口的框架?
- 24. 需要關於GROK模式的幫助
- 25. 什麼是幫助開發者的iPhone應用程序?
- 26. 學習Java並開始遵循C#/ ASP.NET開發人員最新,最好的最佳方式是什麼?
- 27. 什麼是最好的開源Nagios接口?
- 28. 什麼是適用於Windows 7 64bit的最佳PHP開發人員設置?
- 29. Java開發人員非常喜歡什麼非免費工具
- 30. 爲FB開發,找不到一個好的教程 - 什麼教程幫助你?
對於初學者來說,我建議不要使用「grok」這個詞。除非你爲Robert Heinlein粉絲俱樂部工作。 – RBarryYoung 2009-06-13 18:40:05