b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

面向对象(OOP)在编程语言开发中是否绕道而行?为什么?

电脑杂谈  发布时间:2020-03-23 22:29:53  来源:网络整理

面向对象程序设计oop_oop_面向对象oop

可能是由于诸如Java和C#之类的猿语言的普及,世界上对面向对象的理解仅停留在类,接口,封装继承多态性和设计模式的层次上. 实际上,这些概念只是面向对象在静态强类型语言上的投影. 面向对象的含义远不止于此. 使用面向对象的软件开发的cast割版本,自然性不足,各种约束都是可以理解的.

奇怪的是,面向对象的性质非常简单. 系统由对象组成. 对象通过发送消息来交互,以完成整个软件系统的功能. 面向对象的关键不是对象,而是与类无关,而是对象之间的交互,对象之间的关系即消息. 面向对象的核心概念只是对象和消息. 至于类接口的抽象,继承多态虚函数的抽象类封装等等,这只是静态强类型语言解释面向对象程序的一种方式.

听起来简单易懂,但是您可以编写代码吗?是的,效果很好. 可以说,面向对象是迄今为止最有效的抽象方法. 没有人,开玩笑,这怎么可能. 但是,您必须首先很好地了解对象和消息的含义.

oop_面向对象oop_面向对象程序设计oop

什么是对象?在这里,有必要扩展对象的扩展. 严格来说,“一切都是对象”的说法既不正确也不正确. 例如,java中的对象是必须继承自Object才能成为对象的类型,而诸如int和double这样的内置值类型显然不符合java中对象的含义. java中的这种区别会带来很多不便. 因为猿不能总是以与对象相同的方式来操纵内置值类型. 因此,正确的说法是,一切都是类型,类型的实例是对象,类型本身是更高类型的实例. 可以在程序中保存状态或数据的任何对象. “一切都是对象”意味着一切都必须是对象. 语言内置类型int,float,double等的变量都是对象. 从类new派生的变量是对象,类型也是对象,模板类是对象,并且函数它是对象,程序的语句是对象,包(名称空间)也是对象,消息也是宾语. 存在所有可能的程序,一切都是对象,并且可以用数据表示. “代码就是数据,数据就是代码. ”读完这篇文章后,您是否可以感觉到Java在表达对象方面存在固有的缺陷,因为在Java中,只有类型为new的对象才有资格获得对象特权.

在解释了对象的含义之后,它就是对象的交互,即消息. 对象通过发送消息来请求其他对象执行操作. 在代码中面向对象oop,所有可以扮演此角色的形式都是消息,例如普通成员函数,虚函数,接口,事件,远程调用,win32消息wParam和lParam组合,所有这些形式都是消息的化身,从本质上讲,这只是一个函数调用. 而且,消息不仅发送到一个对象,这也称为单派遣,这是绝大多数应用程序. 消息也可以发送到两个或多个对象,即,多个对象组合以处理一条消息. 不是消息广播,而是多派遣,这是访客模式.

调用成员函数是一种发送消息的方法,它也是最常用,最有效且最类型安全的发送消息的方法. 当然,它也是最严格,最耦合的方式,因此猴子在调用函数时从不发送消息. 成员函数仅是特定于此类型对象的消息,并且编译器禁止将消息发送到其他类型的对象. 这也意味着,一旦调用了成员函数,应用程序便完全与该类型绑定. 不要害怕听到耦合. 在许多情况下,耦合是完全必要的. 例如,在代码中使用了字符串对象,数组对象和int float变量. 与这些对象的耦合根本不是可耻的. 此外,在编写代码时,应确保胆大妄为. 不要总是考虑抽象,不要总是考虑分层,而要使用最直接,最快的方法来实现业务逻辑. 只有当现实需要灵活性并需要扩展时. 有必要考虑去耦. 由抽象不当引起的麻烦要比没有抽象的麻烦要严重得多.

面向对象程序设计oop_面向对象oop_oop

毫无疑问,此类普通成员函数的消息过于僵化. 每次发送消息时,对象的标识都必须是其自身类型的变量,并且根本没有灵活性. 因此,存在一个虚拟函数,该函数用于将消息发送到相同基类的相同子对象家族. 此时,对象声明可以降级为基类. 不要低估虚拟功能的灵活性. 构建了第一代静态强类型化的面向对象框架(MFC,VCL,OWL).

在虚函数之后,接着是侵入式接口,对象声明会退化为包含此函数接口的变量. 只要对象的类实现该接口,调用者代码就可以向该对象发送消息(调用其接口的成员函数),这意味着可以更广泛地使用调用层代码. 请仔细理解,基类继承和接口实现之间的语义差异非常明显. 继承用于优化分类,着重于对象的数据,而接口则更着重于对象的功能. 原则上,使用虚拟功能和接口,您基本上可以支持面向对象的编程概念. 而且,以这种方式构造的软件框架,如果一切顺利,就可以很好地理解系统,严格执行级别,并且类型是安全的. 那不是吗?这是Java. 但是,仅以此方式,当面对复杂且不断变化的需求时,通常会出现大量代码,这说明了虚拟功能和接口的局限性. 出版社: 在开发中,当需要灵活性时,我们优先考虑虚拟功能,后来发现该功能的语义更为笼统,我们将其分为一个接口. 一切都以开发效率为重,随后是单元测试和连续快速重构.

虚拟函数和接口的最大缺点是,一旦定义了类,成员函数及其接口的数量就固定了. 不能增加或更改. 这也意味着调用层发送给对象的消息也肯定是无效的. 您无需花太多时间就知道这会给您带来多少不便,您必须进行改革. 为了弥补这种不足,自然会继续出现各种设计模式. 因此,下一步是非介入成员函数和非介入接口的消息形式,这是Go语言的面向对象形式. 尽管从PL的角度来看,Go语言的使用率非常低,但是如果您对Java和C#这样的面向对象的严格方法感到厌倦,那么使用go编写代码时,您将感到前所未有的自由. 当消息达到此级别时,它可以满足大多数应用程序的开发.

oop_面向对象oop_面向对象程序设计oop

在以上消息实现中,消息要么附加到类或接口,要么不能独立存在. 同时,它们还要求对象必须预先响应消息. 必须具有清晰的语义,但同时也会失去灵活性. 性别. 当然,不需要像java这样的类将接口附加到类,因此在应用程序层使用该接口之前,它必须首先确认对象是否支持该接口,就像com的QueryInterface函数首先查询该接口一样. 但是,如果消息本身是对象,那么会立即产生许多神奇的用途,例如,消息的操作,消息的保存,消息队列和队列的操作,以达到Monad的效果,并且以此类推. 哈哈面向对象oop,当我在这里写的时候,我想到了ObjC. 它的面向对象机制和成员函数调用都是以发送消息的方式完成的. 这样,直接进入面向对象的基本原理这一主题,自然就可以节省麻烦,但同时也会降低效率成员函数调用性能以及类型安全性的好处.

在GUI框架的设计中,只有将消息视为对象,我们才能获得简洁明了的效果. 在这种消息发送机制下,对象声明被降级为对象类型,这是一种通用类型. 就像对象类型一样,当消息的独立性达到此级别时,这也意味着消息和对象类型已完全解耦. 当系统添加新消息时,无需修改对象类型的定义. 您只需要向对象动态添加新的消息处理方法. 这等效于在运行时向对象添加新的成员函数,这比go更好. 语言的非介入方式也很方便. 使用过对象C的学生应该能够感觉到这一点. 这种去耦水平已达到其最终的灵活性. 但是,消息的上下文信息完全丢失. Win32的消息wParam lParam就是这种情况. 甚至消息的参数类型和返回类型都已完全消失. 人肉是按类型管理的. 实际上,这也是弱类型,它已经进入了动态类型领域. 在不让编译器接受静态类型检查的情况下,猿类负责错误使用类型的所有后果. 而且,没有类型约束,我个人认为代码将更难以理解. 这个世界上没有万能药,所有治疗方法都有弊有弊.

经过大量的废话,我们可以看到就对象而言,它们基本上涵盖了Ape数据处理的所有概念,无论它们是名词还是动词,它们都可以是对象. 从强类型的强耦合到弱类型的完全解耦,实现消息的方法是灵活的. 抽象粒度非常完整,手段也很完整. 在这里,我再次重复了核心的面向对象的价值观. 对象通过消息相互交互,这意味着每个对象都是独立的. 一个对象的任何更改都不会导致其他对象的修改;并且消息可以独立于对象而存在. 当系统添加新消息时,只需要将响应动作(即功能)注册到具有相关对象的消息中即可. 对象和消息发生更改,这与STL容器和算法更改(通过迭代器解耦)的效果类似.

面向对象oop_面向对象程序设计oop_oop

对象和消息的高度灵活性为快速开发提供了一种实用的方法. 开始时,最快,最直接的代码用于实现基本功能. 此时,您可以享受编译器的静态类型检查的麻烦. 随着功能的丰富和模块的复杂性,对抽象的需求正在逐步出现. 因此,我们使用虚拟函数来精炼重复的代码并提高代码的可重用性. 然后,我觉得代码更具通用性和适应性,所以我对接口进行了抽象……,并且重构的每个步骤都伴随着单元测试. 这确实符合人脑的思维方式,非常直观. 相比之下,面向过程的抽象方法过于局限,而功能抽象方法则难以掌握和理解.

以下内容讨论了面向对象的实现. 对象和消息之间的关系取决于类型,或者对象和消息通过类型(迭代器)分离. 无论是静态强类型还是动态类型,一切都与类型有关. 要充分利用面向对象,您必须对类型有很好的了解.

类型和反射这两种存在方式,在编译期间称为类型,在运行时,这些东西称为反射. C ++仅具有编译时类型,而在运行时则没有反射信息. 面向对象的基础结构本质上是不足的. 自然,面向对象的应用程序被击败,军队被击败. 类型最重要的任务是创建一个对象. 您可以在编译时按类型创建对象,并使用new关键字;您还可以在运行时通过反映类型来创建对象. 类型应该像变量一样无处不在. 当然,它已通过C ++标准库无法实现. 该类型指定对象状态值和对象可以响应的消息的集合. 在编译静态强类型语言时,编译器通过检查类型信息中可能的错误消息来发送代码. 显然,对象无法响应此消息,并且调用级别的代码比坚强的人更困难.

类型本身也是一个对象. 对象是按类型创建的. 那么,这种类型的对象是从哪里来的呢?有些是由语言本身提供的(例如int,float等),有些是用户定义的,如果该语言支持泛型,则模板类型会生成大量类型. 尽管对象是由类型创建的,但是创建对象的这种动作也可以理解为将对象创建消息发送到类型的对象,但是类型不一定重要. 在面向对象的哲学中,首先,系统需要对象,然后根据对象的需求定义其类型. 而不是在对象之前具有类型. 优先关系必须明确,职位必须坚定. 因为一旦确定了类型的优先级,它将走上邪恶的道路,并不可避免地陷入形而上学的讨论中,从而构建了一个庞大而复杂的类型继承体系. 这种学术研究不受普通猿类的控制,并且没有什么实际意义. 例如,正方形是矩形还是蝙蝠是鸟还是野兽都是无聊的学术讨论. 严格来说,类型仅用于指定对象所需的字段数据,而成员函数仅是为了方便以后实现对消息的响应行为. 原则上,可以省略或以后添加. 但是,考虑到方便,基本上所有与对象有关的行为特征都将记录在反射对象的类型上.

前面越来越长,感觉好像快要用完了(待续)...


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-149965-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 袁祎
        袁祎

        从容得体的回答很加分

      热点图片
      拼命载入中...