Pulpcode

捕获,搅碎,拼接,吞咽

0%

在运行代码的时候,最烦的就是看见Null了,而程序经常遇到的错误也是NullPointException(空指针异常)。就算是写代码处理Null,也烦的要死,因为要在各处重复的写:

1
2
3
4
5
6

if (xxx == null){
...
}else{
...
}

然而很多时候你可能就忘写了。

当然还有的人,跟我一样纠结,认为代码不能写太多的废话,比如我明知道这个函数不会返回null,那我为什么要在这里判断是否为null,那这样我的代码是不是显得非常蠢啊?

但是你还是会有点犹豫,毕竟你害怕哪天,真的就空指针了,而你并没有判断。所以很多强迫症患者一直在思考,这代码怎样写才算好。

所以这篇博客。总结一下,到底应该怎样处理这个null

什么是null

在语言层面,定义null,返回null,没有任何问题,因为它确实代表着什么都没有,而且也不和0,空字符串等价。就像数据库,也是既有null值又有空类型的值(比如空字符串),它们并不能被混淆。

而在代码层面(工程层面),之所以报错,也就是所谓的NullPointException,只不过因为对一个不存在的东西进行了解引用罢了。

比如你调用了一个null对象的属性或者方法。类似a.b(),那这就自然会报空指针异常了。
再或者对一个null的容器,通过索引进行调用,也会出现空指针异常。
还有就是用for去迭代一个null容器。
以上这些都是常见的空指针异常错误的原因。

阅读全文 »

刚毕业那会,初学git的时候,很多命令都不知道咋用,比如git merge,我很害怕旧代码把我的新代码给覆盖了。后来我才发现这种想法是多余的,git从来不会让旧代码把新代码覆盖。

首先先分类当merge代码的时候会发生什么?

简单的merge

比如你在开发一个购买水果的网站代码,这个时候有新的需求要购买苹果,然后你在master上切出一个分支:

1
git checkout -b feature-sale-apple

之后你开发完成,并测试通过,需要把feature-sale-apple的代码合并到master。这个时候只要切换到master分支:

1
git checkout master

然后合并 feature-sale-apple就行了。

1
git merge feature-sale-apple

那么如果你当时在feature-sale-apple试图merge master呢?

1
git merge master

实际上什么都不会发生。

阅读全文 »

有一些文艺青年,喜欢引用这样一句话:

那一天我二十一岁,在我一生的黄金时代,我有好多奢望。我想爱,想吃,还想在一瞬间变成天上半明半暗的云,后来我才知道,生活就是个缓慢受锤的过程,人一天天老下去,奢望也一天天消逝,最后变得像挨了锤的牛一样。可是我过二十一岁生日时没有预见到这一点。我觉得自己会永远生猛下去,什么也锤不了我。

这段话出自王小波的《黄金时代》,我读过这本书。我记得这里提到的“像挨了锤的牛一样”。好像是说为了防止公牛好斗,喜欢打架,影响春耕,全都给阉了。

话说我第一次看老谋子的电影《红高粱》,有一个镜头也让我想起了“挨了锤的牛”这个梗,桥段就是日本人抓住一大帮中国农民,逼他们砍倒高粱修公路,这个时候有个屠夫被逼着给日本人杀牛剥牛皮。这个时候镜头特写了一个切牛睾丸的画面。我没看过《红高粱》这本书,不知道书中是否有这段,但是我应该能猜到,电影中这个画面,应该是指被日本人使唤的这群中国人,就像这被剥了皮,割了屌了的牛一样,只能忍气吞声。

其实我记得刚毕业的时候吧,确实是有这种被我称为阉割恐惧的感觉。实际上不仅仅是我,我看我周围的同学,很多在毕业的那段时间,有坚持背单词发朋友圈,也有每天打卡健身的,还有刷微积分的。我觉得他们都是有一种阉割恐惧,害怕自己被这个社会阉了而已。

当然你看到我这篇博客的开头,好像感觉我是要写一篇,“毕业几年,觉得自己迷茫,害怕自己颓废,最后再给自己灌点鸡汤”之类的文章,其实那种东西我还真懒的写。

因为后来我才明白,根本没有什么阉割不阉割的。

阅读全文 »

工厂方法模式也是一种创建型模式,之前提到过创建型模式用来解耦 ”被创建的对象“和”创建对象的对象“,两者之间的关系。

既A与B的关系是使用关系,但是A并没有把B当成一个属性,因为它并不应该是A的一个属性,类似人使用苹果,但是苹果不能被作为人的一个属性。

比如对于苹果而言,是一种水果,还有很多水果,比如Banana, Orange, Peach.

人有一个方法叫eatFruit();

但是你并不能在这个方法中直接new一个fruit

因为这样太耦合,你可以把一个fruit对象作为参数传入到eatFruit方法中去,但你只不过把问题给拖延了,那这个Fruit又是从哪来的的呢?

所以最好你自带一个工厂方法FruitFactory,可以getFruit(),而这个FruitFactory就可以作为你人类的属性被注入进来。这样,我们就把创建水果和人吃水果的动作进行解耦。将水果的实例化拖延到FruitFactory工厂中去。

阅读全文 »

最近通关了《巫师3》的一个DLC(游戏扩展包)-《血与酒》。之所以叫《血与酒》,酒字带指游戏发生地:陶森特,一个游戏世界中虚拟的南方公国,环境优美,土地富饶,盛产葡萄酒(原型应该是法国)

witcher-blood-and-wine

而血主要是指游戏的故事主线围绕调查吸血鬼事件展开。

witcher-blood-and-wine

其实在出此扩展包之前,最早发售《巫师3》时,发布过一个宣传动画,内容也是男主角白狼猎杀一个女吸血鬼(推荐点开看一下,这cg超好看,画面都快赶上真人了)。

巫师3CG

在宣传动画中,吸血女妖隐形后,白狼扔出了一个被称为月之尘的炸药。让她显形。玩家可以在游戏中合成这种炸药,这种炸药的主要成分就是银丝,可以用来防止怪物变形。

witcher-two-swords

而玩过《巫师》系列游戏的人,也都知道,主角背后背着两把剑,一把是钢剑,一把是银剑,其中钢剑是用来杀人的,银剑是用来斩妖除魔的。

但实际上按照游戏的设定,银剑的质地过于柔软,并不适合打造兵器,所以所谓的银剑,剑的剑刃锋口处使用的还是精钢,只不过在上面镀了一层银。

这令我突然觉得很好奇,为啥银子这东西就用来降魔了,所以这篇博客就来整理一下。

阅读全文 »

适配器模式是一种非常常用的模式。

我们常常所理解的设计模式是,你在一开始就想好了系统的构架,然后用设计模式去构建你的构架,奈何真实的项目,往往有你想不到的地方,新的改动不断的加入,这个时候就需要一些模式来满足这种打补丁的需求。

所以我认为适配器模式的真实场景是这样的:

你的现有系统跑的很好,这个时候突然来了一个新的接口,你要融合到你现有的系统设计中去,因为你现有系统运行的很好,你不想对其做任何修改,这时你就需要适配器模式,来将这个新的接口包装成现有系统能理解的样子,让它们根本不知道来了这样一个新接口。

阅读全文 »

起因

开始做机票相关业务开发的时候,我一直好奇为啥我大兰州的机场三字码的是LHW,因为兰州的汉语拼音明明是LanZhou啊,感觉这LHW说对的上吗,这个W是啥?说没对上,LH貌似都还能找到,带着这个疑问我查阅了相关资料,才发现这里面还是有些有趣的故事,所以这篇博客打算来分享一下。

不仅仅是兰州

可能主要因为我来自兰州,所以我才对兰州的三字码特别关心,但实际上不仅仅是兰州,很多机场三字码貌似也对不上,比如:
青岛:TAO
天津: TSN
广州: CAN

但是有些三字码确实还是能对上的,看上去就像是拼音中截取的。比如:

上海的机场码是SHA
沈阳的机场码是SHE

还有一些算是对上的,比如:

北京: PEK
香港:HKG

这甚至让我想起了中学时候,英语课上的疑问,就是为啥北京的英文叫PEKING,而不是Beijing,香港为啥叫hangkang,而不是叫xianggang。

阅读全文 »