摘要:
Java 8 将要推出Lambda表达式,可以在下面的地址了解一下什么是Lambda表达式,为什么要应用Lambda表达式,Lambda表达式又解决了什么问题之类的。http://www.lambdafaq.org/在下列地址可以下载Java8的JDK和JRE(前瞻版的)2012年12月20日刚放出来的。http://jdk8.java.net/download.html而Java8中对于Lambda表达式的支持JDK需要在这个地址下载http://openjdk.java.net/projects/lambda/Eclipse目前并不支持Java 8,所以想要调试Java8的话,所以我们用能 阅读全文
摘要:
前面我们曾经讲过《你的项目统计这些数据吗?》,这里我们在补充一些内容。1. bug原因分类 bug产生的原因只有一种,那就是代码编写错误,没有什么设计错误还是需求错误之类的荒谬分析。如果牵强的分类会发生什么情况,程序员为了减轻自己的责任,将问题尽量的归结为: 设计不充分 —— 设计人员的问题 需求不明确 —— 需求分析人员的问题 测试用例不足 —— 管理人员的问题——他没给我足够的时间用来测试。然而这些统统都不是问题的真正原因,bug产生的原因就只有一种:代码书写错误。 比如那个二分法查找的著名bug: mid = (left + right) / 2;会导致当left + right > 阅读全文
摘要:
最后我们来讲一下代码风格的问题1. 魔法数字,也有叫数字常量的 总之,就是一个数字戳在那,谁也不知道这是什么意思, 这种代码还会导致一个问题就是代码的值发生变化的时候,无法确保所有的相关代码都得到修改。 OpenWnn里这种情况太多了,就不一一列举了。 同样的字符串常量也是一个问题。 对于这种情况,定义成常量并不是解决问题的唯一办法,还有很多更好的办法,比如,拆分类。2. 静态表 Java代码中的静态块static{}可以让一部分固定的赋值代码提前执行,但是如果用不好这个特性,反而这个会成为代码的问题。 RomKan代码中的romkanTable ,表示输入的英文字母是如何转换成为假名的。 但 阅读全文
摘要:
结构问题是所有问题中最严重的问题,这里的很多问题都反映了作者缺少基本常识。代码的结构就像房屋的结构一样,是支撑整个代码的框架。如果房屋的结构不够结实,房屋就会倒塌。如果代码的结构不够良好那么修改Bug或者对应需求变更的时候就要付出昂贵的代价。1. 缺少MVC结构 严重程度:非常高 输入法和其他应用程序一样,都是由:数据(Model),视图(View)和控制器(Control)构成的,但是OpenWnn没有按照MVC划分类包,也难以区分哪部分代码是数据,那部分代码是视图。2.错误的从属关系 严重程度:非常高 各种对象之间应该有一定的从属关系,例如:图书管理有书架,书架上面有图书。就绝不可以说书里 阅读全文
摘要:
接前文,我们继续分析OpenWnn的注释问题1. 为了注释而注释 严重程度:中 注释就是把方法或者变量的名称再重写一遍,这种工作纯属是浪费时间,可以不用花费这种工时。/** Current key-mode */ protected int mCurrentKeyMode; 这种情况在OpenWnn中特别多。2. 啰嗦的注释 严重程度:低 本来可以很短就能够写完的注释,却要写很长的注释,结果也没有因为写的长对于理解产生有益的帮助。 这种情况在OpenWnn中非常少。3. 步步皆注释 严重程度:中 这种情况会拉开代码间距,使代码变得不再流畅。 这种情况在OpenWnn中也非常少。4.缺少注释.. 阅读全文
摘要:
什么是错题本? 最近一直有热心读者提出:能否找到一个写的不太好的工程例子,然后解析其中的代码错误,让我们能够从中更为直观的体会到糟糕的代码书写。这么多年接触了许多糟糕的代码,但是苦于不能公开,也难以做到。不过,后来接触到了OpenWnn,这是一个很好的工程,它的代码中几乎充斥着各种各样的代码书写坏习惯。就好像中学生的错题本一样,打开一看都是各式各样的错误。足以警醒以后不再犯同样的错误。本章我们将对OpenWnn的代码问题进行解析,从命名、注释、结构和风格四个方面分别进行阐述。什么是OpenWnn呢? 我在前面的博客里至少两次提到这个工程。这是一个Android下的开源日文输入法,由Omron 阅读全文
摘要:
今天又写了一个游戏 ——连连看,这个是个很经典的游戏,我也想来试试看,如何实现它。关键部分在于如何判定两个选中单元格是可以相连的。经过分析,可以看到,连接的方式为一下几种模式不管上述的哪种模式,都可以总结为如下的公式:沿着x方向的所有x进行遍历,对于任何一个x来说,y1-y2之间的连接线如果是可以连接的,而且,x1,y1~x,y1和x2,y2, x, y2之间都是可以连通的,那么这两个点就是可以连接的。具体算法实现如下: 1 package org.stephen.connecty.control; 2 3 import org.stephen.connecty.model.Cell; 4 . 阅读全文
摘要:
好了,代码已经写到这里,基本功能都具备了,下面来进行一些收尾工作吧。1. GameOver的判定。首先在每次消除以后都进行GameOver判定。1 if (game.isOver()) {2 EventDispatcher.send(Event.GAME_OVER);3 }然后实现GameOver判定算法。 1 public boolean isOver() { 2 for (int x = 0; x < ROW_COUNT; x++) { 3 for (int y ... 阅读全文
摘要:
接上节我们发现的遗留问题。先来解决GridBagLayout的问题。MainFrame.build方法修改如下: 1 public void build() { 2 this.setLayout(null); 3 this.setSize(480, 480); 4 balls = new JButton[12][12]; 5 6 for (int y = 0; y < 12; y++) { 7 for (int x = 0; x < 12; x++) { 8 JBu... 阅读全文
摘要:
下一步,我们来实现消除。消除分两步,第一步消除选中的小球,第二步,降落。先说消除,在BallActionListener中进行分支处理即可。1 public void actionPerformed(ActionEvent e) {2 Game game = Game.getInstance();3 if (game.isSelectedBall(x, y)) {4 game.destroySelectedBalls();5 } else {6 game.startSelect(x, y);... 阅读全文