2009-07-24 27 views
3

我有一個朋友有興趣進入編程,並詢問了很多不同的概念。類,接口和諸如多態性/繼承性之類的東西很容易解釋,但我用類比反思掙扎了一下。你會如何向非程序員解釋反射?

你會如何解釋它是什麼以及它在實踐中的工作原理?

回答

19

反射只是一個對象告訴你自己,它的方法,實例變量,類型等的能力。使用它的名字命名的隱喻就像在鏡子裏看着鏡頭,看到自己。這樣你就可以把自己描述給其他人。同樣,反射也是物體(甚至程序)描述自身的能力。

+0

反射是一個用詞不當 - 它不是關於在反射圖像中看到自己,而是關於動態還是靜態。 – 2009-07-26 14:50:34

+5

@Eamon:請反思一下這樣一個事實,即英語中「反映」一詞的含義不止一個。 – 2009-07-27 08:13:07

3

「在大多數編程中,數據和操作是兩個單獨的東西(操作對數據起作用)。反射使操作成爲數據,從而使程序知道甚至修改它本身。

雖然這可能太簡單了?

編輯:此外,如果你想要一個類比,名稱反射提供了一個很好的。反思就像程序可以在鏡子中看到自己。所以它可以在只知道它們的名稱爲字符串的情況下調用方法,並獲取字符串中方法名稱的列表等。

1

在解釋反射之前,解釋靜態類型語言vs動態打字然而,解釋對非程序員反思的需求將是一個挑戰。如果他們提出了足夠的問題,你最終不得不解釋使用反射的缺點......

+0

是的,這是比鏡子概念更好的類比。即使沒有反射,任何靜態對象都可以調用它自己的方法,反射可以用來調用其他的東西。反思不是關於看到自己的形象,而是關於靜態/動態的分化。 – 2009-07-26 14:49:41

1

想象一下,一個班級是一輛汽車。它有像一些性能:

  • 方向盤
  • 輪胎
  • 發動機

它也有一些方法:

  • 換檔(齒輪)
  • 轉(側)

想象一下,你得到一些新車(最新和最好的),你不知道任何有關。沒有人告訴過你這件事。所以你轉向反思。機械。他會在引擎蓋下看看,告訴你它有什麼樣的引擎。還有哪些其他屬性供您使用和調用方法...

最後,您將能夠駕駛這款新車,因爲您知道它具有哪些屬性/方法。

0

如果你的朋友知道像Python這樣的動態語言,那麼解釋反射是如何實現的可能是有幫助的;即對象只是字典,並且該反射允許您查看其字典形式的對象,而不是通常處理的對象。

3

我不會。反射是一種編程概念,它只與程序員有關。如果你不是程序員,除了我需要知道構建核反應堆的技術實現細節之外,你不需要或不需要了解它。

既然這個人有興趣學習編程反正,我真的沒有看到這個問題。幫助他學習編程,遲早他會有討論反思的必要詞彙,然後你可以告訴他,如果他需要的話是什麼。

0

鏡像的比喻是不完美的,因爲它意味着反射是物體對自身做的事情。任何對象或函數都可以反射到另一個對象上。此外,在一些實現中,存在用於反射的單獨的類或函數;你不會調用方法或訪問某個對象的屬性來反思它。

競爭比喻是意識。一個有意識的實體可以檢查真實世界中的一個對象並描述它的屬性,這就是程序反射的全部內容。這種類比的問題在於,意識意味着實體的認知意識,而反思則不意味着意識。只要你包括這個警告,它不會讓人誤解。

而不是(誤導)的類比,如何使用一些說明?反射是實現調試器中心任務之一的簡單方法:檢查存儲在變量中的對象。由於您不必爲每個類編寫序列化程序,因此使用反射可以更輕鬆地存儲和檢索外部數據存儲庫中的對象。通用序列化器可以使用反射來檢查對象的屬性並使用它來創建數據庫模式。

相關問題