关于返回 Null 值的问题

justjavac 发表于 2012-05-18

我总感觉一个方法返回null值有问题。 当读了Misko Hevery关于how to think about OO的博客文章后,又让我想起这个问题。

我感觉返回null值是有问题的,它大量的被使用在一个方法有不同的返回类型时。 简单的用谷歌搜索一下“returning null”,你就会发现有建议把返回类型做成一个null对象。 返回一个Null对象在某些情况下是合适的,但并不适合当你需要向客户端传送两种不同的东西的情形。

用Misko重构的一段代码来说明这个问题。 他重构的是一段登录代码(我非常喜欢他的过程),这段代码大概是这个样子:

Cookie login(Ldap ldap) { if ( ldap.auth(user, password) ) return new Cookie(user); return null; }

从这段代码,可以看出两种情况(从结构上讲)

  1. 如果认证通过, 客户端会被通知验证成功, 生成一个新的Cookie
  2. 如果认证失败, 则通过返回的null值通知客户端

客户端的方法应该是什么样的?

public void...

只要一个返回语句

justjavac 发表于 2012-05-18

别再这样写了:

public boolean foo() { if (true) { return true; } else { return false; } }

每次当我深入某个开源项目,看到大概是某个专家写的、并被有经验的专业人士审查过的这样的代码, 我都会惊讶不已,竟然没有人去阻止这个开发者在这个方法里胡乱的放置返回语句。

请告诉我,把代码写成下面的样子很难吗?

public boolean foo() { boolean flag = true; if (true) { flag=true; } else { flag=false; } return flag; }
...

成为高效程序员的搜索技巧

justjavac 发表于 2012-05-16

对于缺乏编程知识的人来说,完全有可能编写一个网页或小程序。 如果在用Google搜索相关示例时幸运的话,可以搜到现成的代码。 即使是经验丰富的程序员,通常也会为了节省时间和精力而在网上搜索解决方案。

如果不借助搜索技术、网络及集体智慧,现代化高效编程是难以想象的。 因此,搜索技巧对高效程序员变得愈发重要。

现在,我们不需要了解和记住如何解决众多的编程问题,可以采用搜索技术。 我们正变得更加高效、高生产力,并能够解决更多的问题。 但这是否意味着在构建软件时,拥有好的搜索技巧就足够了呢? 本文将讨论,搜索技巧在程序员知识的形成过程中的作用,以及如何高效使用搜索技巧

知识的类型及它在程序员大脑中如何成长

有三类知识

概念知识(为什么、是什么、如果—— 语义上的)——理解软件系统构建过程中的概念、原理、关系及主要方法。 根据这类知识,能够找出体系结构或代码必须按特定方式设计的原因,以及从中选择最佳设计方案的备选方案和逻辑是什么。 概念知识,不是指用特定编程语言解决特定问题,而是对问题的长远看法和理解。

  • 用途:对复杂的开放式问题寻找新的解决方案,并创建稳健的软件系统。
  • 收获:学习计算机科学、体系结构以及编程概念,在实际实现和经验的基础上,构建自己的理论。

实践性知识(如何做 —— 过程中的)—— 关于如何解决特定编程问题的知识。 这类知识不需要深入理解实现方法选择过程中隐含的概念及基本原理。 搜索技术在这里最重要,因为对有限的编程语言问题所采取的特定解决方案,搜索能相对容易的加以共享并说明。

  • 用途:用已证实的和已知的解决方案快速解决问题,而不是每次都重新发明一种新的方法。
  • 收获:搜索现有的解决方案,通过例子学习或提出自己的解决方案并以后对其重利用。

隐性知识(专业知识、经验及直觉)——基于软件系统实现过程中所积累的个人经验,在大脑中形成的内在知识。 通过强大的大脑功能,隐性知识可以综合并协调其他两种知识。 这类知识很难传授,因为它的大部分都存储在我们的潜意识中。 在特定环境下,它和直觉一同发挥作用,能够在经验、对概念性和实践性知识的反馈和评估的基础上,制定最佳决策。

  • 用途:利用自己的专长、经验及直觉来实现最佳解决方案。
  • 收获:构建软件并从结果中学习知识。

设计模式(还有架构、领域及其他)是不同类型知识相结合的有趣的例子:“如何做”的例子, 这些例子中隐含的概念及实现过程中积累的经验。...

java编程的78条黄金法则

justjavac 发表于 2012-05-16

创建和销毁对象

1、考虑用静态工厂方法(返回类的实例的静态方法)代替构造器
2、遇到多个构造器参数时要考虑用构造器
3、用私有构造器或者枚举类型强化Singleton属性
4、通过私有构造器强化不可实例化的能力
5、避免创建不必要的对象
6、消除过期的对象引用
7、避免使用终结(final)方法

对于所有对象都通用的方法

8、覆盖equals时请遵守通用约定
9、覆盖equals时总要覆盖hashCode
10、始终要覆盖toString
11、谨慎地覆盖clone
12、考虑实现Comparable接口

类和接口

13、使类和成员的可访问性最小化
14、在公有类中使用访问方法而非公有域
15、使可变性最小化
16、复合优于继承
17、要么为继承为设计,并提供文档说明,要么就禁止继承
...

少走弯路的10条忠告

justjavac 发表于 2012-05-16

1、买个闹钟,以便按时叫醒你。

贪睡和不守时,都将成为你工作和事业上的绊脚石,任何时候都一样。 不仅要学会准时,更要学会提前。 就如你坐车去某地,沿途的风景很美,你忍不住下车看一看,后来虽然你还是赶到了某地,却不是准时到达。 闹钟只是一种简单的标志和提示,真正灵活、实用的时间,掌握在每个人的心中。

2、如果你不喜欢现在的工作,要么辞职不干,要么就闭嘴不言。

初出茅庐,往往眼高手低,心高气傲,大事做不了,小事不愿做。 不要养成挑三拣四的习惯。 不要雨天烦打伞,不带伞又怕淋雨,处处表现出不满的情绪。 记住,不做则已,要做就要做好。

3、每个人都有孤独的时候。

要学会忍受孤独,这样才会成熟起来。 年轻人嘻嘻哈哈、打打闹闹惯了,到了一个陌生的环境,面对形形色色的任何事,一下子不知所措起来,有时连一个可以倾心说话的地方也没有。 这时,千万别浮躁,学会静心,学会忍受孤独。 在孤独中思考,在思考中成熟,在成熟中升华。 不要因为寂寞而乱了方寸,而去做无聊无益的事情,白白浪费了宝贵的时间。

4、走运时要做好倒霉的准备。

有一天,一只狐狸走到一个葡萄园外,看见里面水灵灵的葡萄垂涎欲滴。 可会死外面有栅栏挡着,无法进去。 于是它一狠心绝食三日,减肥之后,终于钻进葡萄园内饱餐一顿。 当它心满意足想离开葡萄园时,发觉自己吃得太饱,怎么也钻不出栅栏了。 相信任何人都不愿做这样的狐狸。 退路同样重要。 饱带干粮,晴带雨伞,点滴积累,水到渠成。 有的东西今天似乎一文不值,但有朝一日也许就会身价百倍。

5、不要像玻璃那样脆弱。

有的人眼睛总盯着自己,所以长不高看不远;总是喜欢怨天尤人,也使别人无比厌烦。 没有苦中苦,哪来甜中甜? 不要像玻璃那样脆弱,而应像水晶一样透明,太阳一样辉煌,腊梅一样坚强。 既然睁开眼睛享受风的清凉,就不要埋怨风中细小的沙粒。

6、管住自己的嘴巴。

不要谈论自己,更不要议论别人。 谈论自己往往会自大虚伪,在名不副实中失去自己。 议论别人往往陷入鸡毛蒜皮的是非口舌中纠缠不清。...