zoukankan      html  css  js  c++  java
  • 《松本行弘的程序世界》读书笔记

    1. 前言

    半个月之前买了这本书。还是经园子里的一位网友推荐的。到如今看了一半多。基础的都看完了。剩下的几章可做高级部分来看。这本书看到如今。能够说感触非常深。必须做一次读书笔记!

    关于这本书,不了解的能够去网上查查。作者是Ruby语言的创始人,可谓是程序世界中的高手,开卷故意,无论你是哪个层次的编程人员,相信都能或多或少的汲取到你想要的营养。

    以下将总结一下看完本书我记录下的一些知识点。

    有的是书中的原话。有的是我个人的理解,供參考。

    2. 面向对象

    2.1 多态性

    面向对象三大原则:继承、封装和多态,当中最重要的技术是“多态性”,多态往往会用继承来表现,而封装又保证多态的独立性。多态性能够让程序仅仅关注做什么,而不是关注怎么做。

    依据情况的不同,自己主动选择最合适的方法来处理。

    多态也是程序扩展性的基础。

    2.2 历史

    面向对象语言从60年代的Simula,到70、80年代的SmallTalk,直到后来的C++和java,java是最成功、应用最普遍的面向对象语言。

    本人用C#,和java几乎相同。

    UML是描写叙述面向对象方法设计模型的图示方法(不会UML的抓紧补补吧,这也算是基础了)。

    2.3 结构化编程

    在非常久非常久曾经,一些比較低级语言。是通过goto语句来运行代码的。C语言中有goto语句,一開始学的时候老师就不让用。goto语句是在出现if...else...(条件推断)和for、while等循环结构之前,人们用来控制程序的方法。大家试想。假设不让你用if..else..和for循环。通篇都是goto,那将会是什么结果??所以。用【顺序】、【条件】和【迭代】来取代goto语句。是程序开发的一大变革。

    另外提一句,假设你从事.net开发,你可能有幸解除到goto语句——IL中间语言。IL相当于.net中的汇编预研。将一个简单的 if..else...编译成IL之后。结果例如以下:

    2.4 数据抽象化

    前面讲到程序结构从goto语句中解放出来,那么程序所操作的数据结构呢?也须要有一种抽象的表达方式。而不是计算式世界所能理解的二进制代码。最常见是我们经常使用的数组、链表、字典等结构。事实上。严格来说,程序中的整数、浮点数、各国的语言文字。都是数据抽象的结果。由于计算机仅仅认识二进制字符串。

    2.5 多重继承

    假设你是一名java、C#开发者,你用不到多继承,由于他们根本就不提供。可是有些语言是支持多继承的,C++、python。现实世界中须要多继承,比如以为程序猿同一时候也可能是一位作家,一个部门经理同事也可能是一位父亲。可是多继承假设开放到程序中,就会带来很多问题。

    同意一个类有多个父类,复杂度可想而知,因此java禁止使用。可是它用什么来弥补这一缺失——接口interface。

    至此,大家要了解接口是由于什么才来到这个世界——由于弥补进制使用多继承而带来的问题。可是接口真的能非常好的解决问题吗?不见得。由于接口毕竟不能像父类那样使用。

    Ruby中没有接口(不是全部面向对象语言都有接口的),它通过引用程序块的方式来实现多继承。我没有深入了解Ruby的这块功能。有兴趣的朋友能够研究。

    2.6 面向对象是现实世界中详细事物的反映吗?

    作者觉得,对“面向对象”最好的解释是“对数据的结构化”。

    前文讲到结构化编程是将程序流程分为顺序、条件和循环三种结构。而面向对象则是在此基础上的延伸,它将程序处理的数据进行了结构化。通过对象来组织数据。数据就成为一个总体,而不再松散。

    这是面向对象最根本的意义,假设理解这一点。那么是否反映现实世界就不重要了。事实上像数组、字符串。你也找不出现实世界的什么东西与之相应。

    程序是处理抽象数据的。不管以后学习什么技术,都不要满足于小猫小狗之类的样例。

    另外。关于“继承”,也不要看成是现实世界的真实反映,它就是一些抽象、公用功能的重用方法,这样反而更好理解。

    2.7 静态语言 VS 动态语言

    这里所谓的静态和动态,指的是数据类型的强弱。

    比如C#、java就是强类型,js、Ruby就是弱类型。强类型中,每一个变量都有明白的数据类型。不能更改,也不能赋其它类型的值,要不然会报错。而在若类型中,变量的类型是随着其存储值动态改变的。

    两者各有好坏。强类型能够在编译时识别类型错误,程序运行的速度会更快,可是不灵活。

    弱类型灵活,可是有些潜在的错误不easy发现。

    我恰巧C#和js都用,在我看来。这两种方式都能够。仅仅要你认真对待,哪个都不会出现大问题。所以了解就可以,不必太纠结究竟哪个好。


    3. 程序块

    3.1 闭包

    “闭包”这个词,我是在js中第一次接触的。

    只是看来业界通用这个词汇。大体意思就是应用外部的变量和环境,和js中一样。

    作者提到Ruby中能够通过传递程序块的方式实现闭包。我没有细致去看细节。

    只是读到这里。我想起了下面几点:

    01. jQuery源代码中用到了大量的闭包,了解到js中的闭包会影响到性能和内存。所以。我以后将会很注意jQuery中闭包的使用,真正深入了解闭包;

    02. C语言的函数指针是闭包吗?

    03. C#和java中,哪些用到了闭包?

    以后再遇到这样的问题、知识点,将关注下面。

    3.2 for循环

    Ruby中实现for循环的方式是 obj.each(....) 这样的方式,和jquery的each循环类似。作者在本章节的后面提到“不用for语句”,由于for语句会破坏对象的封装性。事实上这一点在设计模式中也有专门的解决方式——迭代器模式。


    4. 设计模式

    首先,书中没有一个一个挨着讲每一个设计模式。

    有兴趣能够看看我写的关于设计模式的博客:

    换种思路去理解设计模式(上) 

    换种思路去理解设计模式(中)

    换种思路去理解设计模式(下)

     

    大家最好要知道,“设计模式”一词来源于建筑业(以前是我比較向往的专业,呵呵)。大家常说的设计模式。通常是指《设计模式.可复用软件的基础》一书中提到的二十三中设计模式,作者们是GoF。事实上这些设计模式并非作者们创新出来的,而是他们总结当时日常设计工作中,最经常使用的23中模式。给他们分组、取名。最后成就了一部伟大的作品。

    所以,GoF做出的贡献就是将原本没有名字的东西,给他们起名字,并让他们成为结构化的知识。这是件非常了不起的事。比如美国PMI将日常项目管理工作总结为10大知识领域5大过程组一样。

     

    4.1 设计模式和类库

    类库是把经常使用的算法、接口封装起来,供系统其它模块使用,或者供其它系统使用。它能够“0成本”重用的。但设计模式的重用,却不是“0成本”,它是一个非常抽象的东西,你要依据实际情况来详细确定。

    4.2 开放-封闭 原则(简称:OCP)

    业界有5大设计原则,当中最重要的就是“开放-封闭原则”——即对扩展开放、对改动封闭。了解设计原则能够查阅:换种思路去理解设计模式(上) 

    这里所谓的“对扩展开放”,在面向对象编程中是通过继承和多态来实现的,继承同意功能的加入。多态保证接口的稳定性。从有用主义的观点来看,面向对象的精髓就在于对OCP的实践。至于把对象看做物体理解起来比較easy,可以建立现实世界的模型等,仅仅只是是一些锦上添花的东西。

    一个优秀的设计模式,肯定能经得住OCP的考验!

     

    5. Ajax

    ajax是web开发中比較基础的东西,基本概念此处不再赘述。

     

    5.1 Ajax中的“x”

    “x”指的是“XML”。由于在ajax刚開始用的时候,都是用xml格式来传递数据。因此xml也被说成是ajax的基本部分之中的一个。可是如今随着json越来越流行,xml的用武之地越来越少。高版本号的浏览器直接支持JSON转换接口。

    所以,此处了解就可以。开发时该用什么用什么。

    5.2 javascript——基于对象的语言

    可能你会常常听到:js是以对象为基础的语言,全部的数据都是对象,js是基于原型的语言。对。js中没有“类”的概念,除了主要的值类型之外。其它的数据都以对象来处理,都能够自己定义加入属性,包含函数。js是通过原型来实现所谓的继承的。

    另外,js中的闭包是比較出名的,闭包在js中的应用非常多。jQuery源代码中大量使用闭包就是个例证。

    这两个问题,不是一两句话能说明确的。说实话我如今感觉自己知道一些,可是了解的不是非常透彻。只是正在努力的补充。要想把js的“对象”和“闭包”讲明确,我想还须要从其它方面下手,将会是一个比較系统的project。后期我定会搞定它们,并以某种方式讲出来。此处点到为止。

     

    6 MVC和“猴子补丁”

    6.1 MVC

    感觉作者本文中仅仅是讲述了MVC这个理念,并用小样例解释。

    因为我没有真正參与过MVC的项目,也仅仅是日常的了解。所以对这块感触不是非常深。

    6.2 猴子补丁

    所谓的“猴子补丁”,事实上就是C#中的部分类和扩展方法。

    在不改变原来代码结构的基础上。加入新代码。个人不建议这样的做法,假设反复这样做,将会导致代码松散难以维护。

    -----------------------------------------------------------------------------

    推荐一下我录制的《asp.net petshop4.0源代码解读》教程。免费学习!

    -----------------------------------------------------------------------------

    7. 文字编码

    7.1 理解编码

    计算机仅仅能处理二进制数据。从计算机被发明出来它是这样。到如今还是这样。

    那么我们要让这个仅仅能识别“010101...”二进制的家伙去处理文字,该怎么办呢?——把文字表示成二进制。大家能够查看unicode(下文将介绍unicode)编码表,看看当中中文编码那一块。比方,16进制的4e07表示“万”字:

    讲到这里让我想起来,平时我们在新闻留言、QQ聊天或者发短信的时候,能够发一些表情——,大家可能都知道这些表情是用一些特殊的字符串规定好的。事实上,这就是一个简单的表情编码,和计算机中文字编码成二进制一个道理。

    7.2 ASCII码

    当初计算机是美国人发明的,最早也在美国被应用。

    美国人用英语。所谓的字符仅仅有26个英文字母。大写和小写都算上。也只是52个,在算上键盘上那些乱七八糟的标点符号。最多100来个。于是他们发明了用7位二进制数构成的编码表——ASCII码。

    2的7次方=128。ASCII码可表示128个字符。

    计算机中8位二进制是一个字节,还能剩下一位。用于附加错误码(作者:不知错误码为何意??)

    上图中,用二进制数“1000001”表示的是字母“A”,十进制是65,咱们学C语言的时候,预计都能背过——'A'转换成int是65,如今知道什么意思了吧。。。

    下图是ASCII码相应的值(十进制表示):

    7.3 unicode字符集

    世界上的文字有非常多种,除了用A-Z表示的文字之外,还有很多欧洲、亚洲的文字是用其它图形表示的,比方咱们的中文(简体和繁体还不一样)。

    于是。ASCII码不能满足要求之后,有出现了非常多种编码方式,比如中国的GB2312字符集。

    只是如今业界越来越统一到unicode字符集中。

    所以。就简介unicode字符集。

    ASCII码用7位二进制,可表示128个字符。而最初的unicode字符集用16位二进制表示,2的16次方=65536,可表示6万多个字符。

    unicode字符集最初的设计者估计6W多个字符足以表示世界上全部语言文字了,可惜他们错了。后来unicode字符集又扩充到了21位。

    从网上能够查到全部unicode编码表的内容。下面是截取的一个片段。比如。汉字“万”的编码是16进制数 4e07:

     

    7.4 unicode的字符编码方式

    尽管unicode字符集将世界上的文字字符所有统一了编码,可是这个编码的存储方式,却又分为好几种,比如大家常见的UTF-8、UTF-16、UTF-32。

    比如。汉字“万”的编码值是16进制数 4e07 。可是通过UTF-8计算出的存储结构和UTF-16是不一样的。所以。假设用UTF-16的方式去解析UTF-8编码的数据,可能会出现乱码。

    至于每种编码方式是如何的,这里就不再具体介绍了。事实上书中也仅仅是讲了一点皮毛。

    大家了解就可以。

     

    8 正則表達式

    我接触正則表達式是在学习js中接触的。js应用正則表達式比較简单,可是正則表達式本身的语法却非常复杂。

    后来看jQuery源代码。被sizzle这块的正則表達式给全然搞晕了,到如今都没梳理好。

    书中介绍的无非就是正則表達式的若干语法,以及Ruby怎样支持。

    事实上学习正則表達式不用看这个,推荐一个:正則表達式30分钟新手教程(提醒:说30分钟是忽悠你,用俩小时所有看完并理解,就不错了!

     

    9. 整数与浮点小数

    整数和浮点小数,是程序开发中最经常使用的类型之中的一个。

    假设你认为程序对数字的操作很easy。无非就是加减乘除,那么请你耐心看完以下的文字。

     

    9.1 整数是有范围的

    在C、C++、C#等静态类型的语言中,int一般表示32位整数,也就是用32个二进制数表示一个整数。除去一个符号位,int所能表现的最大整数是有限的。

    C#中,int32 和 int64 分别表示不同位数的整数。都有最大值和最小值的标志:

    假设程序中的数字。超过了最大值,无法通过编译,提示溢出。

    同理。假设执行时出现了这种情况,也会抛出异常。

     

    另外,不光整数有范围。浮点小数也有范围大小。原理一样。

    只是浮点小数还有其它要说的内容,下文介绍。

     

    9.2 为何Ruby中的整数没有范围

    不论什么语言都无法从根本上行使整数没有范围。Ruby是动态类型的语言,当他遇到数字超过单个整数范围时。它会把这个数分多个整数存储。

    只是这一切都是Ruby自己主动帮你完毕的,所以在你看来。你觉得Ruby的整数大小是无限制的。

    这是一种技巧。类似于数据库的分表存储。

     

    9.3 浮点小数的误差

    事实上我从非常早曾经就注意到,javascript中:0.1 + 0.2 = 0.30000000000000004 ,当时仅仅是单纯的觉得js对小数的计算有误差,以后得注意。可是看完书中本章节。发现不正确。不光js,所以语言都会有误差。以C#为例:

     

    大家能够从上图中非常清楚的看到答案。程序第一行,尽管C#输出的是 0.1 + 0.2 = 0.3 。可是从以下的程序能够看出,这里的0.3仅仅只是是个近似值。

     

    针对浮点小数的这些计算的误差,各个程序也都给出了他们觉得的可控制的范围。

    比如,C#的single类型(即float类型)中,同意误差的可控范围例如以下图:

    意思就是说,仅仅要在这个范围之内。就不觉得有误差。可是非常遗憾,我还没实用到过这个属性。。

    。先了解一下吧。

     

    9.4 计算机怎样处理小数

    上文说了半天的误差,以下解释计算机中为何对小数处理会产生误差。原因还是一句话:计算机仅仅能处理二进制。

    全部的整数,都能够用二进制无误差的表示出来,比如:65 --> 1000001。10 --> 1010 ,可是小数呢? 有的小数无法用二进制表示

    比如。十进制的0.5表示为二进制是 0.1, 可是十进制的0.2表示为二进制会出现一个无限循环的小数:0.001100110011....

    这是计算机无法全然处理小数的根本。

     

    对于计算机处理浮点数的现状。临时是无法改变的。它会带来一些误差,某些时候可能会由于一些不当的操作或者数据量的添加,而导致误差过大,可是这也仅仅能通过我们的算法和设计来减轻。

     

    最后。小数在内存中肯定不是以“0.25”这样带小数点的形式表示的。由于它必须转换成为二进制。书中提到了表示浮点数的IEEE745标准。也简介了怎样将一个浮点小数表示为二进制串,但这不是我学习的重点。由于对于这一点,先了解就好。有必要时再去深入研究。

    -----------------------------------------------------------------------------------------

    顺便,推荐一下我录制的《asp.net petshop4.0源代码解读》教程,免费学习!

    -----------------------------------------------------------------------------------------

     

    总结一下:

    前文提到的文字编码和数字,让我想起了一个词——数据抽象化

    计算机本来仅仅能识别二进制码,通过这些年来的演变,使得它能够非常友好的处理我们的语言和数学知识,这怎能不叫数据抽象呢。

    再说个具体的样例。我们如今能通过打印机几秒钟打印一页文字,并轻松阅读,可是一開始要阅读计算机的语言,是打印纸带。再翻译纸带。大家能够试着通过ASCII码翻译一下这几个字母:

  • 相关阅读:
    移动端点击事件300ms延迟问题解决方案——fastclick.js
    hover样式失效的解决方法
    phtoshop cs6 下载安装及破解方法(另附Photoshop CC 2018破解版图文教程)
    CCS3怎么实现border边框渐变效果
    使用git clone命令克隆github项目到本地时出错,提示没有权限的解决方法
    CSS3实现背景透明文字不透明
    (三十六)类数组对象arguments
    (三十五)函数的使用
    (三十四)设计模式之发布订阅模式
    (三十三)设计模式之混合模式
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6876820.html
Copyright © 2011-2022 走看看