也谈面向对象编程

如何理解Fourier Neural Operator (FNO) 2022年Nvidia发表在arXiv上的的FourcastNet作为几乎是最早的一篇气象大模型的工作(之前Google Research的MetNet主要还是对于降水的预报)。除了Transformer的backbone之外,使用到了2021年发表在ICLR上的Fourier Neural Operator。为了好的理解模型的理论基础,可以详细学习一下以及他的前期工作GNOFNO作者对这两篇文章的解析blog。 阅读详情

      在我的工作和生活过程中,我曾经不止一次的被人问到,“什么是面向对象?什么是面向对象编程?”,而后来,我也像他们一样去问其他人同样的问题,可是,他们回答的结果和我当初的相仿一样让人吃惊!我大多可得到如下描述“把一类事物抽象成一个类,这就叫做面向对象编程。”也许,这是很多的初学者毫不犹豫的答案。然而,我并不想反驳你的观点,但如果我问你“面向对象和面向过程有什么异同”,也许,会有不少人回答诸如结构体和类之类异同的研究结果。

      然而,事情的真相总是让人吃惊的,假设你在C++语言中使用结构体,你会发现他们几乎和类的结构至少在使用上是完全相同的!也许,终于会有人提出反驳的意见“结构体不能继承,而类是可以继承的!”那么,恭喜你,我们终于回到问题的点子上来了,虽然答案仍然是错误的,(C++中的结构体和类唯一的差别是默认访问的不同,类是私有,结构体是公有,仅此而已)但至少在一定程度上,你对面向对象是有所了解了。

      虽然对于什么是面向对象编程一直是一个很有争议的话题,但我还是想尽量去描述它的本质。

      曾经在我的学习和工作的过程中,我碰到过一些人,他们告诉我:“我使用了纯面向对象语言C#或是JAVA,那么当然,我的程序肯定是面向对象的。”然而,同样的,事实的真相总是那么让人不舒服,即使你使用了完全面向对象的语言,你所写的程序,也不一定能称为面向对象编程,大多时候,你的程序最多只能称为基于对象编程而已。

       其实,对于这个结果你不必惊讶,很多有经验的程序员同样会告诉你相同的结果,

       事实上,要搞清楚什么是面向对象编程,最简单直接的方式是去看看Alan Kay当初为什么会设计出smalltalk出来。(注:smalltalk被公认为世界上第一个面向对象语言,有的地方认为是Simula 67,此处不去讨论它)。而后的C++,更是明显的说明了这个问题。(注:C++为世界上第一个商业化的面向对象语言,前面所说的smalltalk和Simula 67都为实验室语言。)

回顾C++的历史,当时C语言已经非常的普及,它的高效完美及比汇编更加易用的特性使得很多人为之着迷。而后,随着软件行业的飞速发展,软件开发已经不是一件神秘的事情。而各行各业似乎都开始与软件产生了千丝万缕的关系。为止伴随而来的是许多行业对软件的大量需求,同时,诸如“航天工程”级别的大型软件需求也开始急剧增长,软件的复杂度也开始急剧飙升。

      问题来的是如此的突然,这些问题几乎已经超出了一些语言的“理解范围”,比如,假设你的程序有几页纸长,或是超出了它的正常解题范围,那么像BASIC语言就可能会发生悲剧——可能永远不会算出结果。而当你的程序超过5万行的时候,C语言的程序员就会被各种命名冲突和各种隐藏在程序之中的小漏洞整的焦头烂额!

      在很多时候,我们并不能在语言的理解范围之类解决问题,而且也没有清楚的文字告诉我们,语言的理解范围到底是什么!我们可能常常为增加额外的功能而试图在原来的系统中硬塞几行代码。但糟糕的是,与之伴随而来的便是软件额外的花费直线飙升!

     大天使加百利终于出现了,也许,面向对象的概念就是在这种情况下诞生的。Smalltalk/C++也呼之而出。

其实C++诞生的原因很简单,第一个目地就是为了解决软件过于复杂,而使过程语言过于臃肿,以致超出了其“理解范围”所带来的各种难以发现和解决的BUG;第二个目地是为了解决开发大型项目时,为了增加开发效率,使用多人协同开发,而过程语言在这方面显得非常的吃力的问题。还有一个目地,就是让我们的代码更加易于理解。因为观察对象的实质,你会发现,我们建立的对象一般都是事实存在的一些事物,这比我们理解一类抽象更加有效,简单。

     在面向对象发展了几十年的今天,当初的这些目地仍然被我们一直在使用,只不过,我们抽象出了这些东西,终于总结出了面向对象的本质:封装,继承,多态。

     对!真正的面向对象编程必须具备这几个特征,不然,即使你使用了完全面向对象的语言来编程,最多也只能称之为基于对象编程。

而更抽象却更加易于理解的一句话就是,让你的代码“高复用,低耦合”,而我们前面所说的封装,继承,多态,只不过是为这六个字服务的而已。

     这里,可能又会有人说,“我用的C#使用超基类Object继承而来的,我的方法也覆盖了原有的接口,这就是多态,所以我的程序就是面向对象的。”其实,这里,你已经走入了一个误区。就如我们前面总结的一样,如果你的代码并没有达到“高复用,低耦合”的目地,那么,你的思想仍然是停留在基于对象编程之上的。你要清楚,你所继承的Object这写类及框架,都是那些开发公司,如微软之类早已经做好的东西。你使用的是人家的产品,人家的产品具有面向对象的思想,而你,最多只能称之为微软的用户而已。

Nexus3国内高速下载指南:多版本全平台资源汇总 本文针对国内开发者从官网下载Nexus 3速度慢、易失败的问题,提供了详尽的解决方案。汇总了Windows、Linux、macOS等多个平台的Nexus 3历史及最新版本(如3.31.1)的国内高速下载链接,并附有版本选择建议与Linux环境下的快速启动指南,帮助用户高效获取和部署这一流行的仓库管理工具。 阅读详情

相关推荐

TC3XX - MCAL知识点(三十七):AURIX™ TC3xx 的BootLoader烧录APP完成之后跳转使多个核均正常运行

摘要:针对AURIX TC3xx多核芯片在软件复位后仅Core0能启动的问题,分析发现该芯片在Cold Power-on Reset(断电复位)时会完整执行多核启动流程,而Application Reset(软件复位)会跳过从核初始化。解决方案包括:1)在BootLoader中显式调用IfxCpu_startCore()函数启动其他核;2)通过跳转函数强制各核从指定地址启动;3)双Boot场景下让每个核独立响应复位命令。实测表明,软件复位后需手动触发从核启动,或采用断电复位方式确保所有核正常初始化。

梦想技术家 358

我也来面向对象编程

作为一个第一门程序设计语言就是C++的,而且一直使用到现在的计科系的学生来说,我也来oop。 在我们小的时候,家长为了培养我们,为让我们做一些自己能够力所能及的事。比如自己乘饭。 妈妈会很耐心的和我们说,手先抓住碗,用另一只手打开锅盖,然后拿起饭勺,用饭勺挖合适的大小的饭块放到碗里,重复几次,根据自己的食量挖多少饭,放下饭勺,盖上锅盖。ok,饭乘好了,这是过程的,妈妈只是教你怎么做。妈妈没

周翔的专栏 1450

KEPServerEX 6 之驱动协议(UDD)实战 HTTP协议对接OpenWeatherMap天气 API全流程指南

本文分享了基于 KEPServerEX 6 的通用设备驱动(UDD)对接OpenWeatherMap天气API的实战方案。该方案针对工业物联网场景进行了深度优化,具有动态城市切换、运行时热配置、老旧JS引擎兼容等核心特性。文章详细介绍了从环境准备、脚本部署到Tag配置的全流程,重点解析了Legacy JS语法适配、Float类型安全处理等关键实现细节,并提供了完整的避坑指南和故障排查方法。该方案经过生产环境验证,可稳定实现气象数据采集与动态切换功能,适用于SCADA/MES系统集成场景。

-雲飛兄-博客 444

javascript面向对象编程

前言:虽有陈皓《Javascript 面向对象编程》珠玉在前,但是我还是忍不住再画蛇添足的补上一篇文章,主要是因为 javascript 这门语言魅力。另外这篇文章是一篇入门文章,我也是才开始学习 Javascript,有一点心得,才想写一篇这样文章,文章中难免有错误的地方,还请各位不吝吐槽指正   吐槽 Javascript   初次接触 Javascript,这门语言的确会让很多正规军感到诸多...

weixin_34211761的博客 77

JavaScript面向对象编程

导读:陈皓曾发表过一篇文章《Javascript 面向对象编程》,珠玉在前,作者还是忍不住再画蛇添足的补上一篇文章,主要是因为JavaScript这门语言魅力。另外这篇文章是一篇入门文章,是作者才开始学习Javascript,有一点心得,才想写一篇这样文章,文章中难免有错误的地方,还请各位不吝吐槽指正。 吐槽Javascript 初次接触Javascript,这门语言的确会让很多正规军

phillip318的专栏 289

面向对象编程的可替代性

面向对象编程是基于”事物属性和方法有共性”的前提下才能最大化发挥其效用的。如果一个系统中有共性的类不多,无法/没必要进行抽象,那就不适合使用这一编程模型。因为类实例化需要大量运算和内存。此时,使用面向过程的语言合适。面向过程语言中所有方法都是静态的,无需实例化便可随意调用,占用内存和CPU时间少。需要解决的问题是: 变量、方法的作用域问题 并行时冲突的问题 基类与子类实例变量数不同对于问题1,在

在河里抓鱼的熊 518

高级面向对象编程之接口

高级面向对象编程之接口 和抽象类相似的是接口,接口,如抽象类一样,定义必须被特定类定义的功能接口,要创建接口,需要使用interface关键字,然后在大括号内,定义方法签名,而不是方法的真正实现。 Interface isomething{        Public function somefunction($var); } 作为一个惯例,接口名字经常以一个小写的i开始,但是这并

veaglefly的博客 464

听大神耗子叔编程范式之面向对象编程

35 | 编程范式游记(6)- 面向对象编程 陈皓2018-01-30 前面我们了函数式编程,函数式编程总结起来就是把一些功能或逻辑代码通过函数拼装方式来组织的玩法。这其中涉及最多的是函数,也就是编程中的代码逻辑。但我们知道,代码中还是需要处理数据的,这些就是所谓的“状态”,函数式编程需要我们写出无状态的代码。 而这天下并不存在没有状态没有数据的代码,如果函数...

weixin_30398227的博客 280

[转]再javascript面向对象编程

前言:虽有陈皓《Javascript 面向对象编程》珠玉在前,但是我还是忍不住再画蛇添足的补上一篇文章,主要是因为javascript这门语言魅力。另外这篇文章是一篇入门文章,我也是才开始学习Javascript,有一点心得,才想写一篇这样文章,文章中难免有错误的地方,还请各位不吝吐槽指正 吐槽Javascript 初次接触Javascript,这门语言的确会让很多正规军感到诸多的不适,这种不

573

Javascript面向对象编程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34272308的博客 72

高级面向对象编程之traits代码复用

高级面向对象编程之traits PHP实现了代码复用的一个方法,称为traits。 Traits试图用来解决在像PHP这样的面向对象语言中只支持单继承的问题。举例来说,比如我们设计了一个web站点,他有很多不同的类:用户(user),页面(page),联系表单(contactform)等。当我们在开发这个站点的时候,如果不去关心对象的类型,而可以使用一个调试工具打印出一个给定对象的信息,那

veaglefly的博客 825

ChatGPT 桌面应用程序(Mac、Windows 和 Linux).zip

ChatGPT 桌面应用程序(适用于 Mac、Windows 和 Linux) 笔记如果你想要体验强大的AI包装器应用程序,可以尝试Noi(https://github.com/lencx/Noi),它是ChatGPT桌面应用程序概念的继承者。非常感谢您对这个项目的关注。OpenAI 现已发布该应用程序的 macOS 版本,稍后将推出 Windows 版本(向 ChatGPT 免费用户介绍 GPT-4o 和多工具)。如果您喜欢官方应用程序,您可以随时了解 OpenAI 的最新信息。如果您想了解或下载旧版本(v1.1.0),请点击这里。我目前正在寻找一些差异化功能来开发 2.0 版本。如果您对此感兴趣,请继续关注。

三维重建-基于探地雷达的地下物体三维重建算法-附项目源码+流程教程-优质项目实战.zip

三维重建_基于探地雷达的地下物体三维重建算法_附项目源码+流程教程_优质项目实战

上一篇: 文件操作系列之六——(CArchive的文件操作)
下一篇: 多字符集(ANSI)和UNICODE及字符串处理方式准则
blpluto
博客等级 码龄21年 117粉丝 44原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值