1. Essence of Programming

    编程的精义

    编程的根本是顺序、分支以及循环,再复杂的工作都可以通过这三个环节的组合来完成。因此所谓编程实质上是制定某项任务执行的顺序(顺序),找出该项任务中重复执行的步骤(循环)和任务中的特殊情况(分支),之后才是代码层面的实现。

    N.Wirth提出“程序 = 算法 + 数据结构”,至今仍被大多数程序员所认同。其中的加数“算法”暗示了在开始编程之前必须明白程序的逻辑方法,否则计算机是无法理解你想要做什么,自然程序也是无法实现出来的。而另一个加数“数据结构”则表示程序所依赖的数据实体结构。因此,在实现代码之前,要分析清楚任务的前后逻辑关系(算法)和依赖关系(结构),当逻辑关系与依赖关系都明确之后,剩下的就是体力活了。

    所以编程的本质并非使用编程语言,而是用(任一、合适的)编程语言实现算法与结构的过程。而算法与结构需在代码实现之前明确构建。

    对于编程语言,它们的底层函数库都是十分相似,API 也都依赖于系统,而它们的差别仅仅在于适用范围。例如 PHP 只适用于制作网站,Python 可以方便进行数值处理,而C ...


  2. WebSocket with Flask

    HTML5 以前,HTML 还不支持 WebSocket ,当时如果要进行实时的内容更新,要么使用 Ajax轮询(Polling) 或者使用 Comet 技术。

    Non-Websocket

    Ajax 轮询

    在 2005 年, Jesse James Garrett 提出 Ajax (Asynchronous JavaScript and XML, 异步 Javascript 和 XML)。具体请看 Ajax: A New Approach to Web Applications 。并且从那时开始流行使用 Ajax 进行异步处理客户端请求。【关于异步处理请求的历史,可以看 http://en.wikipedia.org/wiki/Ajax_ ...


  3. Avoid Useless default constructor

    避免无用的默认构造函数

    C++允许在构建对象的时候使用默认构造函数。这一点为编程带来了一定程度上的便利,但同时也带来了一些实现陷阱。

    有的时候使用默认构造函数所创建的对象反而没有实际意义,例如一个学生,在没有姓名的时候就是一个无意义的对象。

    一般而言,无需任何数据就可以建立的类可以包含默认构造函数,而需要数据的类则不可以包含默认构造函数。然而没有默认构造函数的类在实现上会有很多限制:

    限制一:创建数组

    如一个类没有默认构造函数,在创建数组的时候没有一种对数组所有元素赋参数的方法,因此数组将创建失败。

    对于这个限制,有几个办法可以回避

    • 回避方法一:对于非堆上的数组,可以在创建时提供必要的参数:
    Student list[] = { Student(Bruce), Student(Steven)};
    

    然而这个方法的缺点很明显,它只适用于非堆数组。

    • 回避方法二:使用 typedef 定义一个指针
    typedef Student* Stup;
    StuP myStu[10];
    Stup * list = new StuP[10];
    

    定义完毕后再对每一个元素进行赋值。

    但这个方法存在两个缺点,一是在删除数组的时候需要释放数组中所有元素的内存,否则会引起程序内存泄漏;二是这种方法会增加额外的内存空间消耗 ...


  4. Polymorphism and Array

    不要对数组使用多态

    C++ 中的类继承特性使得你可以通过基类引用或指针来对派生类进行操作(多态)。同样的,这一特点也同样使用于对象数组。但请永远不要对对象数组使用多态。

    假设有这样一个对基类数组进行访问的函数:

    void printObjs(Base[] obj, int num){
        for (int i=0;i<num;++i){
            cout << obj[i];
        }
    }
    

    同时有基类 Base 的派生类 Child 。若程序中出现:

    Child myObj[10];
    // 对 myObj 所有元素初始化
    printObjs(myObj, 10);
    

    这样的代码会产生与你所设想不一样的执行结果。原因很简单,因为 Base` 与 ``Child 的结构不一样。也就是说 Base 对象与 Child 对象所占用的内存空间不一样 ...


  5. C++-style Type Conversion

    优先使用 C++ 风格类型转换

    大多数程序员都认为 C++ 是在 C 的基础上引入面向对象概念。这一观点并不完全准确。C 语言是一中简洁优雅的语言,若仅仅引入面向对象概念,由怎么会有众多编写 C++ 的大师认为自己对 C++ 的了解并不深呢?可想而知,C++ 比单纯的 “C 语言 + 面向对象” 还要更复杂得多。

    C++ 在设计的时候同样也考虑到程序设计过程中的类型转换问题,但C语言风格的类型转换对于 C++ 来说过于简单粗暴(通过括号及目标类型来进行转换)。试想想,C 中只有基本数据类型以及用户自定义的 struct 结构,因此这样“简单粗暴”的类型转换对C来说是足够,但对引入面向对象之后的 C++ 却不然,至少 C++ 还有着无数程序员自定义的类。因此 C++ 也拥有自己的类型转换操作符。

    除了上面所说的原因,还有另一个优先使用C++ 风格类型转换操作符的原因是 ...


  6. Reference or Pointer?

    引用还是指针

    在C++中,变量有着两种存在形式:引用与指针。

    引用与指针在使用方式上完全不同,但它们的功能都是一样的。都是用来间接引用其他对象。

    为了更清晰在什么场合下更适合使用引用或是指针,以下做一个整理:

    首先,引用不同于指针,不能指向空引用。这也就是说,引用必须指向某个对象。由这一点,我们可以知道,当所指向的对象可能有空引用的情况出现时,就必须使用指针,而当对象永远都不可能称为空引用时,才可以使用引用。

    其次,引用在定义的时候必须对其初始化,而指针没有这样的限制。所以当存在有不同初始化可能的时候应用使用指针,而不能使用引用。但这点也意味着引用的代码效率要比指针高,因为使用指针之前,必须对指针进行合法性验证,否则会出现对空指针进行操作的错误。

    另外,引用所指向的对象一旦初始化之后就不能再改变指向的对象,而指针也没有这样的一个限制。因此以下的代码中引用与指针所做的事情是有本质上的不同

    string s1("Nancy");
    string s2("Clancy");
    string& rs = s1;
    string * ps = &s1;
    rs = s2;
    ps = &s2 ...

  7. "think-python_2"

    第一章 编程方式

    本书的目的是教你如何像一个计算机科学家一样思考。这种方法结合了数学、工程、自然科学的思考方式,让你像数学家,计算机科学家使用专业术语来表达观点(特别是计算)。例如工程师,设计产品,把零件组装成系统,在可选择的方案之间的权衡得失和评估方案。像科学家一样,观察复杂系统的运作,形成假设,并验证自己的预测。

    一个计算机科学家最重要的一项技能是解决问题。解决问题意味着确切地阐述问题的能力,意味着有创造性地思考解决方案的能力,还有准确清晰的表达一个解决方案的能力。事实证明,学习编程的过程是一个极好的练习解决问题技能的机会。这就是为什么这一章叫做“编程的方式”。

    在一个层面上来讲,你将学习到的编程,本身就是一个有用的技能。另一方面,你将通过编程达到你的目的。我们越往后走,道路会变得越发清晰。

    1.1 Python编程语言

    你将学习的编程语言是Python。Python是高级语言中的一种,其他你可能听说的高级语言还有C,C++,Perl,Java。

    除此之外,还有低级语言,有时称为 “机器语言”“汇编语言” 。一般来说,电脑只能运行低级语言。所以在高级语言编写的程序必须经过处理才可以运行 ...


  8. think-python_1

    前言

    这本书的奇怪的历史

    1999年一月,我准备在Java编程入门班教课。我之前教了三次,越教越感到沮丧。挂科率太高了,而且,即使稍有学成的学生,成绩整体水平也太低。

    我发现教材里存在着问题。他们的范围太广泛了,有太多不必要详细了解的Java细节,也没有足够高层次的指导原则。他们都受陷阱所影响:他们会开始容易,循序渐进,然后在学到第5章的后半部分会直接阵亡。学生们需要在太短的时间里学会太多新知识,而我也必须在学期剩下的时间不断帮助学生拾起这些内容。

    开学的第一天,两个星期前,我决定写自己的书。我的目标是:

    • 尽量使它简短。学生们会更倾向于阅读10页不是读50页。
    • 小心词汇量。我尽力将术语和定义减到最少。
    • 逐步建立知识结构。为了避免陷阱,我挑选出最困难的话题,并且他们分成一系列的小步骤。
    • 将注意力集中于编程,而不是编程语言。我尽量精简地挑选Java中有用的部分,并将其他舍去。

    我需要一个标题,所以我选择了 怎样像计算机科学家一样思考。我的第一个版本是粗糙的,但它起作用了。学生们去阅读了并且能够明白,我可以将课堂时间花在更难的、更有趣的话题上,最重要的是,还有时间可以让学生练习。

    我将这本书发布在GNU自由文档许可之下,它允许用户自由复制、修改,和自由发布这本书 ...


  9. think-python_0

    Think Python 中文翻译

    瞎扯前的瞎扯

    好久没更新博客,纯粹刷内容.把最近和妹纸翻译的 &lt;Think Python&gt; 贴出来.

    项目地址: https://github.com/shonenada/think-python 欢迎有兴趣的童鞋纠正或者加入~~

    瞎扯下

    要说这翻译的来由还真奇葩。 某一天,妹纸想学点语言,我就毫不犹豫地推荐了Python,然后找了《Think Python》给她看,然后开玩笑说让她翻译。

    然后...她真的翻译了。

    然后...然后我就建了这个版本库,把翻译都记录下来。

    = = 当然啦,妹纸不是学理科的,更不是学计算机的,很多翻译还有问题,如果发现翻译有问题或者不准确的地方,欢迎各位指正。


  10. upset

    很难过..

    几个月前收到明信片,是一个大学同学,天天见面的朋友寄来的. 他说 "但不可否认,我们的道路是渐行渐远的". 我以为,我们四个人是很好的朋友,也会一直好下去. 但,他说的,是对的.

    依然很难过.

    很想很想回到过去,对过去的自己扇一巴掌. 那个自大的自己. 但一切都晚了.

    当目光渐渐放远的时候,我终于发现, 这个世界是找不到边界.

    当自己最擅长的领域不断被曾经所认识的世界之外的新的世界打败的时候, 我知道,我的内心已经慢慢变得脆弱起来.


Page 4 / 6