冒号课堂读书笔记(1)

第一课

那些与殿堂相比显得有些原始、甚至丑陋的东西,被有意无意地挡在视线之外。可没有那些,你们将来如何为这些宫殿添砖加瓦,又如何另起楼阁呢?

“程序员是吃青春饭的职业”出自那些缺乏灵感和激情的人之口。

评判语言优劣,如同争论兵器高下,倘若撇开使用的主体和对象,皆为空泛之谈。

好的语言就是适合编程者和解决对象的语言。

DSL(domain specific language):领域特定语言,一般用于特定语言,多属于第4代语言。

编程范式是抽象的,必须通过具体的变成语言来体现。它代表的世界观往往体现在语言的核心概念中,代表的方法论往往体现在语言的表达机制中。一种范式可以在不同的语言中实现,一种语言也可以同时支持多种范式。

编程范式是一种世界观和方法论。

设计模式经典书籍:Design Patterns:Elements of Reusable Object-Oriented Software.

第二课

命令式编程(imperative programming)
用命令式编写的程序由命令序列组成,即一系列祈使句。更学术说,命令式编程是冯 诺依曼机运行机制的抽象,即依据从内存中获取指令和数据,然后去执行。从范式的角度看,其世界观是:程序是由若干行动指令组成的有序列表。其方法论是:用变量来存储数据,用语句来执行指令。

过程式编程(procedural programming)是指引入了过程(procedure)、函数(function)或子程序(subroutine/subprogram)的命令式编程。但由于现代的命令式语言均具备此特征,故二者往往不加区分。

结构化编程(structured programming)实在过程式编程的基础上发展起来的。其本质是一种编程原则,提倡代码应具有清晰的逻辑结构。

结构化编程时过程式编程的一种原则,其主要思想是:提倡在宏观上采用‘自顶向下’的设计,微观上采用顺序、选择和循环的逻辑结构,摒弃或限制goto语句,以保证程序结构清晰、易于调试和维护。

声明式编程(declarative programming)由若干规范(specification)的声明组成。声明式语言是人脑思维方式的抽象,即利用数理逻辑或既定规范对已知条件进行推理或运算。

声明式编程主要包括函数式编程(functional programming)和逻辑式编程。

命令式编程时行动导向的(Action-Oriented),因而算法是显性而目标是隐性的;声明式编程时目标驱动(Goal-Driven)的,因而目标是显性而算法是隐性的。

命令式语言提倡迭代而不鼓励递归。一则迭代比递归更符合命令式的思维模式,因为前者贴近机器语言而后者贴近数学语言;二则除尾递归(tail recursion)外,一般递归比迭代的开销(overhead)大。相反,声明式语言提倡递归而不支持迭代。

OOP的核心思想是:以数据为中心组织逻辑,将系统视为相互作用的对象集合,并利用继承与多态来增强可维护性、可扩展性和可重用性。

过程式编程的理念是以过程为中心,自顶向下、逐步求精。如果把整个流程看作一棵倒长的大树,过程式编程自树根向下,逐渐分支,直到每片树叶,类似数学证明中的分析法,即执果索因的逆推法;OOP则从每片树叶开始,逐渐合并,直到树根,类似数学证明中的综合法,即执因索果的正推法。

若把树根看成主函数,离树根越近,离用户需求也越近。如果用过程式编程,由于是逆推法,树干改变容易导致树枝相应改变,因此一旦用户需求发生变化,可能会从树根波及到树枝甚至树叶,维护起来殊为不易。相反OOP从树叶开始设计,离用户需求较远,抽象程度较高,受波及的程度较小,因此更易维护和重用。

OOP以对象为基本模块单位,而对象是现实中具体事物和抽象概念的模拟,这使得编程设计更自然更拟人化。

OOP最大的卖点是其高度的可重用性,相比于其他范式却并不具明显优势,但它更接近人类的认知模式,编程者更容易也更乐于用这种方式编程,这时它深入人心的一个重要原因。比较一下两种用法:
- 牛.吃(草)
- 吃(牛,草)

说白了OOP就是将相关的函数用数据粘合,重新包装后再贴上对象的标签。从这种角度上看,与其说OOP更具重用性,不如说更具易用性。

对一个灭有独立思考习惯的人来讲,与其说他认同一个理论,倒不如说他认同该理论倡导者的权威。而在他仰视权威的同时,也把自己的思想交托给了权威。

第三课

泛型范式:Generic Programming,简称GP,其基本思想是:将算法与其作用的数据结构分离,并将后者尽可能泛化,最大限度地实现算法重用。

STL(standard template library)有3要素:算法、容器和迭代器。算法是一系列可行的步骤;容器是数据的集合,是抽象化的数组;迭代器是算法与容器之间的接口,是抽象化的指针。算法串联数据,数据实化算法。

第五课

无论干哪一行,要想胜任愉快,离不开4样东西:才能、兴趣、方法和努力。没有才能则难以胜任,没有兴趣则难以愉快,没有方法则事倍功半,没有努力则一事无成。

对数据类型的理解:
数据类型包含两个要素:一个是允许取值的集合,一个是允许参与的运算。

数据类型的意义:

  • 限定一个变量的数据类型,就意味着限制了该变量的取值范围和所参与的运算,这从一定程度上保证了代码的安全性。
  • 用户自定义的数据类型,如C中的结构和Java中的类或接口,赋予数据以逻辑内涵,提高了代码的抽象性。

所谓动态类型语言(dynamic typing language),正是指类型检查发生在运行期间(run time)的语言。
静态类型语言(static typing language)指类型检查发生在运行之前的语言。

鸭子类型(duck type): 通俗地讲,就是说如果一个对象既会走鸭步又会嘎嘎叫,何妨将其视作鸭子呢。
duck type的哲学是:名义不重要,重要的是能力。

动态类型语言的优势:简明、快捷、灵活,天然具有范型(generic)特则。

静态类型语言的好处:在运行之前进行了类型检查,一方面代码的可靠性增强,符合“发现错误要尽早”的原则;另一方面编译器有可能藉此优化机器代码以提高运行效率,同时节省了运行期耗费在类型检查上的时间;此外,变量类型生命彰显了编程者的意图,有辅助文档的功效。

第十一课

Java中,基本数据类型是值类型的,其语义类型也是值语义类型(为了保证值语义,它们是不可变的)

对象数据类型都是引用类型。但是如String, Integer, Boolean 等虽然是引用类型,但它们是值语义类型,也应保证不可变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值