8

让不懂编程的人爱上iPhone开发(2020春)005

 3 years ago
source link: https://zhuanlan.zhihu.com/p/111508898
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

让不懂编程的人爱上iPhone开发(2020春)005

苹果粉丝,摄影迷,心理学爱好者

欢迎继续我们的学习。

理论充电-面向对象的编程(Object-oriented programming)

在继续我们的学习之前,我们需要来一点点小小的理论知识充电。

请大家在学习的过程中始终记住本系列教程的第一目标,那就是帮大家培养传说中的“程序猿思维”,而不是简单的学会怎么用iOS开发一个毫无用处的”Hello World”应用。

虽然这些名词和理论看起来让人有点头大,但相信我,一旦你了解了这些知识,今后不管学习任何编程语言或开发技能,都可以举一反三。

对象(Objects)

说句实话,我有时候无法理解国内对某些计算机名词的翻译,比如对象。

v2-b9a7c8a674200dd04d3d37124c990121_720w.jpg

根据现代汉语词典的解释,对象的意思有两个:

①行动或思考时作为目标的人或事物:革命的~ㄧ研究~。

②特指恋爱的对方:找~ㄧ他有~了

v2-8e6c086701dc6d7e02b4216ec3b51bc6_720w.jpg

而根据牛津英英词典的解释,object作为名词的意思是:

1.可以感知到的实体,但不是生命体

2.研究、关注、渴望的目标

那么,到底什么是面向对象的编程OOP-object-oriented programming)?

首先,它不是面向你心仪妹子的编程,这是可以确定一定以及肯定的。

其次,它也不是面向行动或思考目标的编程,这个听起来也相当的别扭。

最后,面向对象的编程不是第一天就出现的,它是在计算机编程语言发展的过程中根据实际开发的需要与时俱进的结果。

50年前的开发者,甚至从来没有听说过这个名词。所以如果你不小心穿越回那个时候,然后把OOP这个名词摆出来,再把设计模式、开发范式之类的新概念在堂前如同念唐诗宋词一样滔滔不绝的解释,一定是众人敬仰的大神,编程之神~

大家看我的教程可能会注意到一个细节,那就是我经常会提到历史上的一些事情。有些可能只是为了情怀,比如关于乔布斯和苹果的一些故事。但更多则是希望大家了解,一个事情为什么是现在的样子,而不是另外一个样子。

不管是iOS操作系统,还是Swift编程语言,包括最新的SwiftUI,都不是外星人科技传送从天而降的,都是基于此前的历史沉淀。如果你不了解这些历史,就会陷入之知其然不知其所以然的“填鸭式”学习状态,更不太可能在今后的学习或工作中做一些创新性的工作。

中国绝对不缺码农,缺的是具有开创精神的创造者和开发者。同样的,大家也绝对不缺iOS开发的入门和进阶教程,网上一搜一大把,个个都比我写的专业靠谱,说话又好听~

在我原创或翻译改写的所有在线教程中,会把培养程序猿思维和创造性思维放在第一,把代码世界和IT行业的发展史融入其中,最后才是学习某些具体的技能。所以不可避免的会有很多废话在里面。

如果你只是单纯想提升开发的具体技能,我强烈建议不要继续看下去,几乎可以肯定是在浪费自己的宝贵时间和精力。对于这一类童鞋,我会在专栏或网站中推荐一些非常不错的中外书籍或在线教程,供大家选择。

所以,OOP到底是怎么回事?除了面向对象的编程?还有面向什么的编程?传说中的”编程范式“是个什么东东?

实际上,这些所谓的”编程范式“(Programming Paradigm)并不是凭空产生的,而是在工作的需要中逐渐演化而来的。

让我们沿着历史的发展脉络来逐一认识这些名词。

混沌初生-

在计算机最早期的时候,编程开发人员是需要软硬兼修的。

为什么?因为那个时候所使用的编程语言是所谓的机器语言,以及后来在机器语言基础上抽象出来的汇编语言。开发者需要精确了解寄存器、存储器的地址访问等非常底层的细节。

使用这类语言的好处当然大大的,开发者可以直接对硬件底层进行访问和设置。但是不好的地方也是明显的,一个是门槛太高了,开发者必须是软硬件兼修的高手。而另一个则是语言的适用性过于狭窄,针对这种设备的机器语言如果换一套设备,基本上就没用了。汇编语言的适用性要好一些,但上手难的问题仍然没有得到解决。还有一点就是,在这个时代编程很难实现一些复杂的功能,调试之类的也异常麻烦。

总之,如果你是机器语言或者汇编语言的高手,那么在学习使用其它编程语言的时候,有种大学毕业生做幼儿园作业的感觉。

另外,在编程世界混沌初开的时候,大家写代码都是随心所欲。所谓的兴起而来,兴尽而归,就是编程田园牧歌时代的标配。

混沌时代诞生并坚守到现在的语言就是汇编语言了,在2020年3月,它依然占据编程语言排行榜的第12名。

从”无序“到”有序“

随着技术的进步,人们发现机器语言时代随心所欲的编码方式容易导致混乱,而且不利于技术的普及和规模化。

这个时候诞生了所谓”面向过程“的编程语言(Procedural language),或者叫”结构化“的编程。

简单来说,这种”编程范式“的思维范式是自上而下的。也就是开发者对实现某个算法和功能有非常详尽的说明,而且还要指明执行指令或者语句的具体顺序。

简单来说,可以把一个复杂的任务拆解成具体的执行步骤,step1…step2…step3…step4…

然后每个步骤可以根据需求细化为更小的子步骤,以此类推。

每个子步骤往往可以通过函数来完成,从而实现代码的重用和模块化编程。

”面向过程“的编程思维大大提升了开发的效率,让编程从混沌开始步入有序。

但”面向过程“的编程思维也有自己的问题,其最大弊端在于其中充斥了各种无条件分支或者goto跳转语句,容易带来代码的混乱和不可理解性。

在”面向过程“思维的支持下,诞生了一大批经典的编程语言,如COBOL,FORTRAN,ALGOL,PL/I,BASIC,C语言等。

其中最为著名的就是C语言了,自诞生以来,它就牢牢占据编程语言排行榜的霸主地位,经年未衰。即便到了如今的移动互联网末期时代,C语言在TIOBE的编程语言排行榜上仍然排在第二,可谓久经考验,历久弥坚。而其它同时代诞生的其它编程语言基本上已经被大家所淡忘。

在这个时代,编程语言最大的特色就是诞生了”函数“的概念,从而让计算机辅助人类完成各种任务的效率大大提升。

从“无情”到”有情“

无论是混沌的机器/汇编语言时代,还是以完成任务为导向的”面向过程“的初步有序时代,编程语言都是一种”无情“的存在。

而随着”面向对象“编程思维的诞生,编程语言发生了一次质的突破,从底层思维上更加接近人类日常的思维方式。从某种角度来看,编程语言发生了一次生物级别的进化,从无生命的无机体进化成了有机体。

在”面向对象“的编程思维中,世间万物都是对象,即便是代码世界也是如此。

如果说”面向过程“的编程重在执行任务,那么”面向对象“的编程重在模拟真实的现实世界,让开发者按照现实世界的逻辑来分析问题和解决问题。”

简单来说,每个对象都相当于一个独立的生命体,它具备各种属性,同时具备各种能力(方法)。

“面向对象”的编程在前期开发和设计上相对麻烦一些,但是非常适合解决大型复杂的更加贴近真实世界的业务逻辑。

如今主流的编程语言基本上都支持“面向对象”的编程,包括C#,C++,JAVA,PHP,PYTHON,JavaScript,Ruby,Kotlin,Go等等。

当然,除了这三大类最主要的“编程范式”思维,还有一些分支思维,比如我们在iOS开发中要重点接触的事件驱动“Event-driven”思维。这些在后面会具体讲到。

关于编程语言的诸多”范式“,这里先不展开讲了,感兴趣的童鞋可以到维基百科查看更多信息:

https://en.wikipedia.org/wiki/Comparison_of_programming_paradigms

https://en.wikipedia.org/wiki/Programming_paradigm#History​en.wikipedia.org

最后需要特别强调一下,不是说采用了”面向对象“思维设计的编程语言就不再支持”面向过程“的编程了,这些思维模式的发展是向下兼容的。简单来说,汇编语言和C语言不支持”面向对象“的编程,但JAVA和C++却一定支持”面向过程“的编程。

同样的,虽然”面向对象“的编程思维是在”面向过程“的编程思维之后诞生的,但并不意味着所有的问题都必须用”面向对象“的思维方式。大家不能为了”面向对象“而”面向对象“,一定要根据所面对的具体问题来选择合适的方式。

说到这里,在我看来,OOP(object-oriented programming)解释为面向实体的编程可能更贴近。但既然大家都这么叫,那我们也就接受这种叫法好了。

Swift也属于所谓的“面向对象“的编程语言,也就是说你要做的大多数事情都和某种类型的对象有关。之前我也提到过,一个应用就是由彼此可以发送消息的对象组成的。

比如,在某个驾驶分享应用中,用户就是一个对象,驾驶员和他们的汽车同样属于对象。在社交应用中,每个用户账户都是一个对象,而每个用户账户又包含了多个子对象,分别对应他们的发帖和照片。在游戏中,每个游戏角色也是一个对象,它具备多个属性,比如生命值,法力值,敏捷度等等。同时每个角色又具备多个能力,比如群体攻击和单体攻击法术等等。

即便是在我们当前的应用中,其实我们也已经接触了一大堆的对象,包括在代码中和在界面上。

让我们来分析下组成ContentView这个对象的代码:

Struct ContentView : View {

这一行代码,如果用人类语言来描述,意思就是”这里我们定义了一个名为ContentView的结构体,它是一个View“。

这么说可能大家还不明白,继续用人话来解释。单词struct是structure(结构)的缩写,它是Swift语言中的一种特定对象。在Swift语言中存在着多种类型的对象,比如class(类)。

一个View(视图)是SwiftUI中内置的对象类型,它代表着界面上所绘制的任何事物,甚至包括界面资深。视图中可以包含其它视图。

好了,既然ContentView是一个视图对象,那么它就拥有View视图类对象所拥有的相同属性和方法。任何在ContentView中定义的属性和方法都是View对象中属性和方法的延伸。

提示:

在Swift代码中,当你看到”:”这个符号时,它代表的意思就是“是一个”。例如,ContentView : View可以理解为,”ContentView是一个View“。这样说大家可能就比较容易理解了。

好了,现在我们已经知道怎么来定义对象了,接下来我们来学习下如何认识对象,以及如何让对象完成特定的任务。这就需要引入属性和方法的概念了。

让我们下一课继续。


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK