Reflection 您如何向非程序员解释反射?

Reflection 您如何向非程序员解释反射?,reflection,Reflection,我有一个朋友对编程很感兴趣,他询问了很多不同的概念。类、接口和诸如多态性/继承性之类的东西都很容易解释,但我正努力用类比来进行反思 你将如何解释它是什么以及它在实践中是如何工作的?反射只是一个对象告诉你它自己、它的方法、实例变量、类型等的能力。使用它命名的隐喻就像在镜子里看自己一样。这样你就可以向别人描述你自己了。同样,反射是对象(甚至程序)描述自身的能力。在大多数编程中,数据和操作是两个独立的东西(操作对数据起作用)。通过反射,操作变成数据,允许程序了解甚至修改自身 虽然这可能太简单了 编辑:

我有一个朋友对编程很感兴趣,他询问了很多不同的概念。类、接口和诸如多态性/继承性之类的东西都很容易解释,但我正努力用类比来进行反思


你将如何解释它是什么以及它在实践中是如何工作的?

反射只是一个对象告诉你它自己、它的方法、实例变量、类型等的能力。使用它命名的隐喻就像在镜子里看自己一样。这样你就可以向别人描述你自己了。同样,反射是对象(甚至程序)描述自身的能力。

在大多数编程中,数据和操作是两个独立的东西(操作对数据起作用)。通过反射,操作变成数据,允许程序了解甚至修改自身

虽然这可能太简单了


编辑:另外,如果你想打个比方,反射这个名字提供了一个很好的例子。反射就像程序可以在镜子中看到自己一样。因此,它可以在只知道方法名称为字符串的情况下调用方法,并获取字符串中的方法名称列表等。

在解释反射之前,最好解释静态类型语言与动态类型语言之间的区别。然而,向非程序员解释像反射这样的需求将是一个挑战。如果他们问了足够多的问题,你将不可避免地不得不解释使用反射的缺点…

想象一个班级是一辆汽车。它有一些属性,如:

  • 方向盘
  • 轮胎
  • 引擎
  • 等等
它还有一些方法:

  • 换档(档位)
  • 转弯(侧)
  • 等等
想象一下,你得到了一辆你一无所知的新车(最新最棒的)。没人告诉你这件事。所以你转向反思。技工他会检查引擎盖下面,告诉你它有什么发动机。您还可以使用哪些其他属性和方法来调用


最后,您将能够驾驶这辆新车,因为您知道它有哪些属性/方法。

如果您的朋友知道Python之类的动态语言,那么解释反射是如何实现的可能会有所帮助;i、 对象只是字典,这种反射允许你以字典的形式查看对象,而不是像通常那样对待对象。

我不这么认为。反射是一个编程概念,它只与程序员相关。如果你不是一个程序员,你不需要,也不想知道,就像我需要知道建造核反应堆的技术实施细节一样


因为这个人对学习编程很感兴趣,所以我并不觉得有什么问题。帮助他学习编程,迟早他会掌握必要的词汇来讨论反射,然后如果他需要,你可以告诉他反射是什么。

镜像类比是不完美的,因为它暗示反射是一个对象对自身所做的事情。任何对象或函数都可以反射到另一个对象上。此外,在一些实现中,存在用于反射的单独类或函数;您不会调用abject的方法或访问其属性来反映它

一个相互矛盾的类比是意识。一个有意识的实体可以检查现实世界中的一个对象并描述它的属性,这就是编程反射的全部内容。这个类比的问题在于意识意味着实体的认知意识,而反射则不是。只要你包括这个警告,它就不会误导你


与其(误导性的)类比,不如用一些说明性的用法?反射是实现调试器的中心任务之一的一种简单方法:检查存储在变量中的对象。反射使得从外部数据存储中存储和检索对象变得更容易,因为您不必为每个类编写序列化程序。通用序列化程序可以使用反射来检查对象的属性,并使用反射来创建数据库模式。

是的,这是一个比镜像概念更好的类比。任何静态对象都可以调用自己的方法,即使没有反射,反射也可以用来调用其他对象。反射不是关于看到自己的形象,而是关于静态/动态的划分。反射是一个用词不当的词——它不是关于在反射的形象中看到自己,而是关于动态与静态。@Eamon:请思考一个事实,“反射”一词在英语中有不止一个含义。