编程杂感两篇

来源:互联网 发布:电信宽带加端口要多久 编辑:程序博客网 时间:2024/05/20 20:04

(一)

Null是个巨大的错误吗?

为null正名。

null可以表示未初始化的引用。为什么不强迫初始化,因为初始化时可能抛异常。变量声明放进try块,又可能有跨作用域的需求。一种常见的做法是大改语法引入maybe关键字支持代数类型,并且函数做模式匹配,否则难以完美处理这个问题。另外,每个处理meybe类型变量的函数,无非强制写两个分支分别处理nothing和just,本质就是强迫程序员分别处理null变量和已初始化变量,虽然好处是从文法上保证程序的正确性。但是实践中识别null变量也可以留给程序检查或者IDE插件来实现,而大部分IDE也已经做到了。
null也可以用来表示空的返回值。同样,调用者要处理null或non-null返回值。如果文档明确提醒使用者有可能会返回null值,实践中是可行的,这也是惯例。返回一个maybe类型未尝不可,但是在面向对象编程实践中,这又增加了抽象的层次(比如协变的概念,假如要利用返回对象的虚函数),增加了开发者的脑力负担。

所以说,null还是有好处的。尤其在IDE的帮助下,降低了开发的难度。

(二)

Java与C++编程效率。

Java借力软件工程,C++重视与计算机底层的结合。

面向对象的软件设计方法,第一件事是建模,把现实抽象为若干个类,定义若干接口。C++软件的设计,从现实抽象建模的同时,手动管理对象生命周期,容器、工厂类设计好,谁创建对象,谁负责对象的销毁,谁只是持有指针,对象析构同时释放资源,这些都要考虑。同时也要考虑计算机底层的内存分配,甚至要考虑CPU cache、分支预测、IO效率等。所以C++要设计好,需要考虑更多底层实现。

但是,Java的虚拟机,帮你解决了大部分底层问题,比如GC。你只需关注在抽象层,设计好容器、工厂、事件,对象生命周期问题JVM帮你解决。同时,Java有反射和注解,更方便对象的管理,软件工程上带来IOC、AOP思想,造就了各种框架。于是更有利于解耦,把应用开发变成了模板填空。降低了每个人的心智负担,便于分工协作,自然提高效率,降低开发难度。应用开发的最省力方式就是,拖控件,填模板。

以上所说只是单纯对比开发相同大小的两个小程序,而不牵涉后台的数据库、并发、缓存这些架构问题。而这些更是Java的强项,强大的开源生态,跨平台的开箱即用,也大大提高了开发效率。

原为某问答网站上两个回答,现收藏入blog,note之。
0 0