摘要:
尽管编程风格这种东西因人而异,但是养成对编译器和程序友好的编程习惯还是很重要的。在Java这个名词王国里,变量和对象的地位是非常基础而重要的,尤其是对象,创建是耗时和耗存的。如果我们能在使用变量和对象的时候稍微注意点,积少成多,我们的程序就不会跑着跑着就“当”了。一尽量避免使用静态变量 很多时候我们之所以创建静态变量,是因为我们想要一个与整个类的生命周期一样长的变量,这通常都是声明一个静态全局变量,很少有在一个方法中声明静态变量(这样做通常认为是错误),而且,静态变量并不会在程序结束后被垃圾回收器回收。如果我们的程序中有太多的静态变量,你就要好好思考,到底是否真的有必要是静态变量,尤其是那种明 阅读全文
摘要:
根据《程序员的思维修炼》这本书介绍的德雷福斯模型,专家最大的武器就是他们的直觉。很多人都一定会感到莫名其妙,像是编程这种技术活,怎能说是靠直觉呢?直觉,指的是不以人类意志控制的特殊思维方式,它是基于人类的职业,阅历,知识和本能存在的一种思维形式。这种思维往往直接准确的抓住问题的核心,快速的找出解决方法。拥有这种思维的人,往往都是各个行业的顶尖人士,因为他们对于他们所处的技术领域的所有一切问题都有一个内化的体制在运转并且有效的提取出来。但是,要怎么才能锻炼这种直觉呢?直觉摸不到,也看不到,完全无法掌握,这是一般人的看法,其实,我们的实际生活中就已经在运用直觉了。 俗话说得好:“硬着头皮看下... 阅读全文
摘要:
策略模式并没有表面上那么高深,相反,它的实现意图非常浅显,就是我们程序员实在不想在判断一大堆条件后写一些基本上都差不多的代码(即算法的变体,明明是同一种算法,只是因为输入不一样就要重复一次),烦!没错,就是这种感觉,催生这种模式。我相信,当初设计这种模式的家伙一定是忍无可忍了。 为讲解策略模式,我特意准备一个活用策略模式的接口类---Collections.sort这个方法中的comparator。 comparator使用了策略模式(有些人会有异议,认为这应该是模板方法,这里暂且搁置这些争议),基本上,我对于List元素的排序都是使用它,因为自己也做过测试,它的运行效率并不比任何排序... 阅读全文
摘要:
再一次的重构,这次就是讨论类的职责和对象文件的封装内容。类的职责,指的是我们一个类到底应该做什么?做多少?以我的图书馆仿真为例,显然,主类的职责之一就是显示结果,就是图书馆图书列表。但是,在图书馆列表这个部分,需要实现很多方法,而这些方法是否都需要在主类里实现呢?就像前面的例子那样,这次我们依然是有三个类:RatingBook,BookDepot和main,那么,它们各自应该承担的职责是什么呢?我们可以将目光先放在那些涉及到RatingBook的方法上。首先,RatingBook就像所有的对象文件一样,应该有设置数据属性和返回数据属性的方法,当然还有构造器。一般,一开始设计类的时候应该遵守的. 阅读全文
摘要:
遍历List,然后删除其中的元素,这种操作存在风险,如果改变List的结构,就会影响到我们接下来的操作,这是危险的,甚至有些数据我们在毫不知情的情况下就被删除掉。这都是不允许的,为应对这种情况,我们可以做一个映射,将原来List映射到新的List上,比如说,可以将不需要删除的元素放到一个新的List上,而不是在原有List上直接删除得到,这样更加安全,但是很多情况下,我们根本就不知道数据是怎样的,它哪些是重复的,需要进行判断,但是在循环中如果这样写: List<Integer> mlist = new ArrayList<Integer>(); for(int i = 阅读全文
摘要:
Map作为一种容器,最大的价值就是它可以存储key-value对,这样就能方便我们快速查找对应的值(这就是关联逻辑关系数据)。但是,如果我们不仅仅是想要保存对象间的这种逻辑联系,还想要通过它们的这种对应关系,做更多的操作,比如说,我们每个学生,都有对应的学号,当初保存的时候并没有对学号进行排序,而且它们也确实是没有任何规律可言,我们想要的是学号能够按照自然顺序排序的学生名单,那么,我们一开始应该怎样保存呢?现在我这里有两种解决方案,其中就是封装学生这个对象,这个对象里面封装了学生名和学号这两个数据,然后将它存储在一个对象List中,就能利用List的相应方法进行操作。另一种就是我们的Map存. 阅读全文
摘要:
ArrayList和Array是我们在实际编程中经常使用的容器,而且因为ArrayList相当于动态化的数组,所以它们之间有太多的相似,以至于我们在选择哪种来存储元素的时候,会有小小的迷惑。 那么,这两者的区别和适用场合分别是什么呢?一存放的内容 数组,存放的一定是同种类型的元素,而ArrayList不一定,因为它可以存储Object,但数组也可以是一个Object数组,然后再提取出我们想要的类型,这种做法是不会丢失信息的(Object不能转化为基本类型,但是基本类型都有相对应的包装类),况且我们ArrayList本身内部封装的数组就是Object数组,所以,它的实质就是一个Object数组。 阅读全文
摘要:
本次重构的目的,就是想要尝试一下自己总结出来的代码结构。很多新手,像我,总会在main方法中大量调用方法,使得main方法特别臃肿,这样的代码太难看了,我觉得,main方法的作用应该只是我们的程序的入口,就是它只是一个启动的作用,最好就是只有一个调用的方法,然后这个方法再调用其他方法,这样层层调用下去,条理性会更高点,然后我们也可以知道每个方法间的逻辑联系是怎样,最主要的作用就是,通过这样的处理,我们就可以找出我们代码中的逻辑冗余(一些功能相似但是外观不一样的方法体),以及一些不必要的临时变量和参数列表,我们的方法列表也能变得更加简洁。还有一个原则,就是我认为一个方法中最好只是一个逻辑意义上的 阅读全文
摘要:
Context,我们在android开发中经常见到这个名词,尤其是某些方法的参数列表,像是我们Toast中的makeText()中的第一个参数,就是Context。可以这么说,Context是 android中的基础,只有切实掌握好Context的概念和用法,我们才能写出更好的代码。那么,现在就让我 阅读全文
摘要:
这是有关于我最近学习node.js中出现的错误的记录和纠正过程,因为我只是一名初学者,所以,遇到的错误可能真的是非常简单,如拼写错误等等,这些我当然是不会记录下来的,但是如果是一些我一时看不懂,不知道怎么解决的错误,我就会一一记录下来。1.npm install formidable的错误这个错误是我想要通过npm来下载并安装formidable时遇到的,一开始,我是能够进入改包下载的网站,但是却无法下载下来,错误是一大箩筐,但是最主要的还是开头的所谓的“SSL error"。我是在linux平台上开发的,它会显示一些相关的帮助网站,我们可以点进去看看是否有我们需要的,但是,全是英文 阅读全文