随笔分类 -  从码农到架构师

帮助码农从理论上和实践上两方面进行改进,以获得成长。目标是成为架构师。
摘要:最近在写《自表达代码》一书,该书第22章将会介绍一个Android平台上的日文输入法的开发过程。通过该开发过程展示如何在程序开发过程中保持代码的可读性、可扩展性和可变更性。在写该部分之前,首先需要进行输入法引擎的设计。下面是一个相对来说傻大笨粗的输入法引擎设计思路。虽然傻大笨粗,但是由于数据量并不大,数据算法次数并不多,所以该设计仍然是“可以接受的”。即处理时间上比较快、存储空间上占用不大。但是距离十分优秀的输入法还有很长的距离要走。输入法的基本工作原理就是,输入一堆英文字符,然后利用英文字符到一个字典中去查找英文字符应该翻译成什么对应的自然语言文字。这里提到的输入法引擎就按照这个思路来设计的 阅读全文
posted @ 2013-10-08 22:41 史蒂芬.王 阅读(9997) 评论(0) 推荐(0) 编辑
摘要:提起安全性这个话题,大家恐怕依稀还记得Sony的PSP账户信息泄露的事故造成的重大损失。但是又隐隐觉得这事儿离我很远,无需过多考虑。也有的人会想,我们做的是企业内部系统所以不必太在意。但是,Web程序的安全性已经悄然来到你我身边,我们在使用的系统太多的并没有充分考虑安全性。这样的系统只是尚未发生事故。一旦发生事故后果相当严重。轻者数据泄露,重者商业损失,更严重的导致商誉损失,甚至是企业倒闭。这绝不是危言耸听,且看看这些年来报道的安全门话题,哪个不是损失惨重?今天就来说一说这个话题:企业应用的Web程序的安全性。很多企业的应用程序喜欢使用Web来开发,一者开发相对简单,二者部署容易,三者升级方便 阅读全文
posted @ 2013-09-29 15:03 史蒂芬.王 阅读(1368) 评论(0) 推荐(0) 编辑
摘要:今天在新浪微博上又看到有人讨论千行代码缺陷率,还讨论的很细致——怎么计算,怎么统计....引用郭德纲的一句话:统计那玩意儿没用,一句话解决你心中所有疑惑。(原文是:学那玩意儿没用)首先我们来看看,千行代码缺陷率是怎么定义的?缺陷率 = 缺陷数量/(代码行数/1000)然后看组织如何关心这个数字 越小越好那么结论是什么? 没有能力减少缺陷数量,就加大代码行数呗一些常见的招数 把 {单独占一行 把 }else { 写成 } else { 上面这些还只是影响到代码可读性,下面这些就有些奇葩了。 把定长循环分开写,写成顺序方法 把配置文件的行数统计进去 而下面这些就令人发指了 复制、粘贴 重新发明轮. 阅读全文
posted @ 2013-07-04 13:08 史蒂芬.王 阅读(13685) 评论(2) 推荐(0) 编辑
摘要:今天,BJDP的伍斌老师提出一个有意思的题假设出版社要促销一套哈利波特图书,该套图书共5集,每集单册购买8元。若任意两集各买一本,打95折;若任意三集各买一本,打9折;若任意四集各买一本,打8折;若所有这五集都各买一本,打75折。上述优惠之外的单册还是按8元一本计价。比如五集各买一本之外再加一本第一集,五本书打75折,这本另加的第一集按8元计价。这个问题的答案是51.2。但是用程序应该如何实现呢?先是写了套代码: 1 public double buy(Map books) { 2 3 int count = count(books); 4 double mi... 阅读全文
posted @ 2013-07-04 11:57 史蒂芬.王 阅读(735) 评论(4) 推荐(0) 编辑
摘要:昨天写了一篇博文《30行,金额转人民币大写的代码》,今天突发奇想,看看不用从后向前的思路,而用从前向后遍历的思路,会不会代码也一样精炼呢?于是经过了大约40分钟的奋战,才有了下面的这段代码。中间测试出来的奇怪东西特别的多,比如叁亿万零捌佰,壹拾零万元,消除这些奇怪的错误着实花费不少时间。 1 public class ChineseCurrencyConverter { 2 private static final String [] UNITS = {"","拾","佰","仟","万",&q 阅读全文
posted @ 2013-06-27 09:59 史蒂芬.王 阅读(4024) 评论(43) 推荐(1) 编辑
摘要:消小球游戏的iOS版 for iOS 6 only话不多说,直接上代码,https://github.com/StephenWang7971/BubbleBreaker 阅读全文
posted @ 2013-01-18 10:39 史蒂芬.王 阅读(311) 评论(0) 推荐(0) 编辑
摘要:最后我们来讲一下代码风格的问题1. 魔法数字,也有叫数字常量的 总之,就是一个数字戳在那,谁也不知道这是什么意思, 这种代码还会导致一个问题就是代码的值发生变化的时候,无法确保所有的相关代码都得到修改。 OpenWnn里这种情况太多了,就不一一列举了。 同样的字符串常量也是一个问题。 对于这种情况,定义成常量并不是解决问题的唯一办法,还有很多更好的办法,比如,拆分类。2. 静态表 Java代码中的静态块static{}可以让一部分固定的赋值代码提前执行,但是如果用不好这个特性,反而这个会成为代码的问题。 RomKan代码中的romkanTable ,表示输入的英文字母是如何转换成为假名的。 但 阅读全文
posted @ 2012-11-30 13:05 史蒂芬.王 阅读(300) 评论(0) 推荐(0) 编辑
摘要:结构问题是所有问题中最严重的问题,这里的很多问题都反映了作者缺少基本常识。代码的结构就像房屋的结构一样,是支撑整个代码的框架。如果房屋的结构不够结实,房屋就会倒塌。如果代码的结构不够良好那么修改Bug或者对应需求变更的时候就要付出昂贵的代价。1. 缺少MVC结构 严重程度:非常高 输入法和其他应用程序一样,都是由:数据(Model),视图(View)和控制器(Control)构成的,但是OpenWnn没有按照MVC划分类包,也难以区分哪部分代码是数据,那部分代码是视图。2.错误的从属关系 严重程度:非常高 各种对象之间应该有一定的从属关系,例如:图书管理有书架,书架上面有图书。就绝不可以说书里 阅读全文
posted @ 2012-11-30 12:07 史蒂芬.王 阅读(648) 评论(0) 推荐(0) 编辑
摘要:接前文,我们继续分析OpenWnn的注释问题1. 为了注释而注释 严重程度:中 注释就是把方法或者变量的名称再重写一遍,这种工作纯属是浪费时间,可以不用花费这种工时。/** Current key-mode */ protected int mCurrentKeyMode; 这种情况在OpenWnn中特别多。2. 啰嗦的注释 严重程度:低 本来可以很短就能够写完的注释,却要写很长的注释,结果也没有因为写的长对于理解产生有益的帮助。 这种情况在OpenWnn中非常少。3. 步步皆注释 严重程度:中 这种情况会拉开代码间距,使代码变得不再流畅。 这种情况在OpenWnn中也非常少。4.缺少注释.. 阅读全文
posted @ 2012-11-30 11:53 史蒂芬.王 阅读(339) 评论(0) 推荐(0) 编辑
摘要:什么是错题本? 最近一直有热心读者提出:能否找到一个写的不太好的工程例子,然后解析其中的代码错误,让我们能够从中更为直观的体会到糟糕的代码书写。这么多年接触了许多糟糕的代码,但是苦于不能公开,也难以做到。不过,后来接触到了OpenWnn,这是一个很好的工程,它的代码中几乎充斥着各种各样的代码书写坏习惯。就好像中学生的错题本一样,打开一看都是各式各样的错误。足以警醒以后不再犯同样的错误。本章我们将对OpenWnn的代码问题进行解析,从命名、注释、结构和风格四个方面分别进行阐述。什么是OpenWnn呢? 我在前面的博客里至少两次提到这个工程。这是一个Android下的开源日文输入法,由Omron 阅读全文
posted @ 2012-11-30 11:14 史蒂芬.王 阅读(2071) 评论(0) 推荐(0) 编辑
摘要:今天又写了一个游戏 ——连连看,这个是个很经典的游戏,我也想来试试看,如何实现它。关键部分在于如何判定两个选中单元格是可以相连的。经过分析,可以看到,连接的方式为一下几种模式不管上述的哪种模式,都可以总结为如下的公式:沿着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 . 阅读全文
posted @ 2012-11-29 22:02 史蒂芬.王 阅读(261) 评论(0) 推荐(0) 编辑
摘要:好了,代码已经写到这里,基本功能都具备了,下面来进行一些收尾工作吧。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 ... 阅读全文
posted @ 2012-11-27 19:32 史蒂芬.王 阅读(232) 评论(0) 推荐(0) 编辑
摘要:接上节我们发现的遗留问题。先来解决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... 阅读全文
posted @ 2012-11-27 17:41 史蒂芬.王 阅读(205) 评论(0) 推荐(0) 编辑
摘要:下一步,我们来实现消除。消除分两步,第一步消除选中的小球,第二步,降落。先说消除,在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);... 阅读全文
posted @ 2012-11-27 16:45 史蒂芬.王 阅读(207) 评论(0) 推荐(0) 编辑
摘要:然后,我们实现点击小球的动作。点击小球的时候,分为两步,第一步:选中;第二步,清除。本章先研究选中。首先,我们需要了解点击的小球的位置,但是,之前的设计并没有传入相关的参数。所以我们先来重构BallActionListener 1 package org.stephen.bubblebreaker.listener; 2 3 import java.awt.event.ActionEvent; 4 import java.awt.event.ActionListener; 5 6 import org.stephen.bubblebreaker.control.EventDispatche.. 阅读全文
posted @ 2012-11-27 15:38 史蒂芬.王 阅读(220) 评论(0) 推荐(0) 编辑
摘要:本章,我们来讨论如何为游戏加上动作。先从整体上考虑,很多Java例子程序喜欢直接在代码中加入:button.addActionListener(new ActionListener() { public void performAction(Event e) {}});这样的代码。这是不好的,因为这不符合单一职责原则,ActionListener应该独立出去,单独成类。这样,当发生问题的时候也容易寻找。有两种形式,一种是本文采用的单独成类的形式,另外一种是在对应的对象中声明内部类。例如:class MyButton.ActionListener {}。整体上来讲,我们会加入:StartActi 阅读全文
posted @ 2012-11-27 14:42 史蒂芬.王 阅读(230) 评论(0) 推荐(0) 编辑
摘要:在写了这么多理论之后,读者都对实践比较感兴趣。那么如何写自表达代码呢?我们跳开理论部分(以后我会补充理论部分),直接进入实践部分,从本章开始,将以消小球这个游戏为例,以Java代码为样本,引导大家一步一步书写自表达式代码。消小球是一款见于Windows Mobile上的游戏,在12x12的方格子里随即放置各种颜色的小球。选中至少两个相邻的同颜色小球,再次点击,就消除选中的小球,消除的小球的个数累加作为得到的分数,消掉小球以后上面的小球会降落,某列被消除以后,会将其左边的列拉过来,直到无法继续消除位置。好了,游戏规则介绍完毕。那么我们开始在Eclipse里建立工程。Java工程,名称Bubble 阅读全文
posted @ 2012-11-27 13:24 史蒂芬.王 阅读(473) 评论(0) 推荐(0) 编辑
摘要:假设我们在测试一个电子邮件地址的网页输入框,下面是相关的需求描述:当该文本框输入一个“电子邮件”以后,点击保存按钮,如果输入的是正确的电子邮件地址,则转入下一页,否则提示一个消息框,显示“你输入的不是合格的电子邮件,请重新输入”。点击“确认”按钮以后,焦点回落在电子邮件地址输入框里,并且光标放在文本框最后一个文字后面。没有选中文字。原来的输入文字内容不变。那么我们应该测试多少?1. 对话框显示的消息是否要测试?2. 对话框的确定按钮点击是否要测试?3. 对话框的关闭按钮点击是否要测试?4. 焦点回落是否要测试?5. 光标位置是否要测试?6. 选中文字是否要测试?7. 文本框的文字内容是否要测试 阅读全文
posted @ 2012-11-21 13:55 史蒂芬.王 阅读(339) 评论(0) 推荐(0) 编辑
摘要:假设有一个文本框,需要校验输入内容是否是电子邮件,那么应该测试多少种用例呢?1. 英文的电子邮件地址 abc@gmail.com2. 带下划线,点号的电子邮件地址 a.b.c@gmail.com a-b-c@gmail.com a-b.c@gmail.com a.b-c@gmail.com a.b@gmail.coma-b@gmail.com a_b@gmail.com a.b_c@gmail.com a-b_c@gmail.com a_b_c@gmail.com3. 很长的电子邮件地址 abcdefghijklmnopqrstuvwxzy@gmail.com4.纯数字的电子邮件地址 123. 阅读全文
posted @ 2012-11-20 20:32 史蒂芬.王 阅读(411) 评论(1) 推荐(0) 编辑
摘要:完成一个级联下拉列表框(例如:省市联动)需要多少行代码呢?问过若干人,答案从100行到几万行的都有。那么对于一个二级联动下拉列表框需要这么多代码的话,那么一个四级的联动下拉列表框(比如:品牌、分类、类型、型号)又需要多少行代码?对于这个问题,我们推荐的是,每个增加一个下拉列表框只要2行。当然,这没有计算写成通用结构的代码。那么,我们来看看是什么样的代码能够通用到这种程度,可以每增加一个下拉列表框只需要2行就可以了。为了简单起见,我们采用两套级联下拉列表框来实现例子。一个是省市下拉列表框,另一个是产品下拉列表框。先上代码: 1 <HTML encoding="UTF-8" 阅读全文
posted @ 2012-11-19 21:45 史蒂芬.王 阅读(30546) 评论(10) 推荐(4) 编辑

点击右上角即可分享
微信分享提示