我记得在某处读过,OO背后的原始概念是找到一种更好的体系结构,以一种保护数据状态的方式来处理多个系统之间的数据消息传递。现在这可能是一个很糟糕的措辞,但是让我想知道是否存在一种没有对象(类比,自行车,汽车,人等)的面向对象的教学方法,而是侧重于消息传递方面。如果您有文章,链接,书籍等,那将很有帮助。
我记得在某处读过,OO背后的原始概念是找到一种更好的体系结构,以一种保护数据状态的方式来处理多个系统之间的数据消息传递。现在这可能是一个很糟糕的措辞,但是让我想知道是否存在一种没有对象(类比,自行车,汽车,人等)的面向对象的教学方法,而是侧重于消息传递方面。如果您有文章,链接,书籍等,那将很有帮助。
Answers:
OO的原始概念与当今的OO无关。(请参见“艾伦·凯(Alan Kay)”到底是什么意思“面向对象”的意思?)。今天的面向对象程序设计是关于创建诸如自行车,房屋和人的隐喻之类的对象的。我强烈建议您坚持使用这些隐喻,因为隐喻的目的是通过使用人们已经理解的概念来帮助人们理解。帮助他们看到相关性,然后帮助他们看到差异,然后深入了解面向对象的知识。
编辑:今天的面向对象是关于使用各种方法(函数)和属性(引用AKA变量和常量)来创建其属性和功能完全/部分描述的完全独立的对象。
您可以谈论耦合和内聚的概念。对象应该由具有高内聚力和隐含高耦合度的属性和方法组成。它们应映射到系统正常运行所需的最精细的操作和属性。他们还应该满足保持代码尽可能小巧和直接的愿望,即在考虑维护和可扩展性的情况下进行编码。
这也可以防止“对象爆炸”,过度概括和错误的隐喻选择,这些都是常见的错误。
我不会关注现实世界的对象,也不会关注消息传递。我使用的一个示例是图形中的图形,在图形中您需要具有“知道如何绘制自身”的对象。
例如,如果您使用的是C语言,而没有内置OO,则可能会发现将指针存储在数据对象内部很方便。如果这样做,那么您将陷入OOP。
我不喜欢提及艾伦·凯(Alan Kay),就好像他是摩西(Moses)分发平板电脑一样。我相信他是接受过数学和生物训练的。作为一个数学家,他可能对Lambda Calculus有所了解,这是非常抽象的,与硬件无关。在LC中,您可能会说一切都是“对象”-就像数字0和数字1是在给定参数时求值不同的对象。这很好地引导了Smalltalk。“消息”的思想是这样,我们可以避免谈论硬件。您可以说,当调用函数(或对象的方法)时,您正在向其发送消息,而当返回时,它正在向您(或您的延续)发送消息。这是描述在独立硬件上异步运行的程序之间进行通信的一种方式。没关系,但是对于普通的编程,它却变得无所适从。为了获得OOP想法的价值,您不需要否认要执行的具体任务的相关性,也不必否认正在运行的硬件的具体性。我认为从人为的类比出发讲授OOP会使人们在数据结构方面过多地考虑软件设计,导致其过分设计,导致代码膨胀和大量性能问题,我不得不花时间清理它变得足够糟糕。
如果您在编程小组中,请几个人聚在一起,然后开始讨论如何告诉彼此做您需要系统做的事情。从字面上看,您可以在系统中扮演角色(您可以通过扮演每个角色来自己完成任务,但是对于一群人来说更容易。如果您是一个人,则玩具会有所帮助)。关注每个人在做什么/将要做什么,而不是关注他们拥有的数据。与人一起做有助于将重点放在消息和角色上,因为人们倾向于记住自己在做什么,而不是记住自己拥有的数据。
注意彼此必须做的事情,以及需要做些什么信息。要保护自己的数据,如果另一个程序员索要您的数据时说不,并问他为什么需要它(有助于数据封装)。