冒号课堂笔记(5-6课)

《冒泡课堂:编程范式与OOP思想》读书笔记 5-6 课

编程语言
  1. Duck类型的哲学:名义不重要,重要的是能力。

    鸭子类型是动态类型的一种风格,允许非继承性多态,即一个对象的类型可以由其接口集合来去定,不需要通过显示继承,有利于代码重用。由于Duck类型的接口组合是隐性的,其使用者须要比普通的interface更小心,以免误用;其维护者也要小心,以免破坏客户端代码;另外,它也可能造成滥用。

  1. 数据类型包含两个要素:

    • 允许取值的集合

    • 允许参与的运算

    int类型在Java中既定义了介于231-2^{31}23112^{31}-1之间的整数集合,也定义了该集合上的整数所能进行的运算。

    限定一个变量的数据类型,就意味着限制该变量的取值范围和所参与的运算,这从一定程度上保证了代码的安全性。

  2. 数据类型既有针对机器的物理意义,又有针对人的逻辑意义。前者进行底层的内存分配和数值运算等,后者用于表达高层的逻辑概念。既然类型如此重要,类型检查就必不可少。

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

      优点:代码灵活简明、易于重用,适合泛型编程和快速原型开发。

    • 静态类型语言(static typing language)是类型检查发生在运行之前(包括编译期间,compile-time)的语言。

      优点:运行之前的类型检查增强了代码的可靠性,使编译器有可能进行优化处理而提高运行效率,节省了运行期的类型检查所占用的时间和空间,同时类型声明有辅助文档的功效。

  3. 动态类型的变量不需要显示声明,静态类型的变量需要通过显示声明或类型推断。

  4. 类型的动静与强弱完全是正交的两个概念。静态类型语言中,有强类型的Java,也有弱类型的C;动态类型语言中,有强类型的Smalltalk,也有弱类型的JavaScript。前者通过类型的绑定时间来划分,后者以类型的约束强度来划分。 通常弱类型语言(weakly-typed language)允许一种类型的值隐性转化为另一种类型。

  5. 类型按安全性来划分,可分为类型安全(type-safe language)和类型不安全语言(type-unsafe language)。

    类型检查的目的就是为了避免类型错误(type error),即杜绝因类型问题而产生的错误或不良代码。

    弱类型语言允许类型的隐性转化,被认为是类型不安全的;而强类型的语言则不允许这种转化,被认为是类型安全的。

  6. 静态类型检查实行“疑罪从有”的有罪推定制,动态类型检查实行“疑罪从无”的无罪推定制。取舍原则是:Static Typing Where Possible, Dynamic Typing When Needed。即尽可能守规则,必要时变通。

  7. 脚本语言一般是解释型语言,不需要通过“编译 - 链接 - 运行”的循环圈,便利快捷,加之简单宽松的语法、面向字符的特性,以及较强的文本处理能力,尤其适合作为年和语言,多用于系统管理和集成。

  8. 动态语言秉承的理念:优化人的时间而不是机器的时间。为提高人的生产效率,宁肯牺牲部分程序性能或者购买更高配置的硬件。

    动态语言在程序运行期间改变数据结构、函数定义、对象行为或指令流程等,相比静态语言在结构和功能上的更就有动态性。

    优点:

    • 代码量少,从一定程度上减轻了维护难度;

    • 提供字节码编译或JIT编译,弥补了运行效率上的不足;

    • 一些模块的结构和功能上的变化不会导致相关模块的重新编译和链接;

    • 具有灵活、适应力强和开发周期短的特点,能够快速响应客户端的需求变化,并且适合快速原型开发。

  9. C++提倡使用RAII原则解决包括内存在内的资源管理问题。RRIF(Resource Release Is Finalization),即“资源释即终结化”,其思想是:将资源的取放与某一对象的生命周期绑定,初始化对象是获取资源,终结化对象时释放资源。用户代码不再直接管理资源,只需控制相应对象即可。这样代码得以简化,资源的有效性也得以保障,并且还是异常安全的(exception-safe)。

Commentaires