悠然乱弹:200行高质量的代码,也不是那么容易完成的


悠然 17:47:43

路人甲,速度报到领取任务了。

悠然 20:01:28

今天完成200行代码,呵呵,完不成,淘汰:)

X@8}U9MLE}EBUE273)]9PGF
悠然 20:02:11 
http://git.oschina.net/tinyframework/tiny.git
悠然 20:02:20 
https://git.oschina.net/tinyframework/tiny/fork
悠然 20:02:26 
去fork一下。
路人甲 20:02:44 

悠然 20:03:10 
然后把自己fork下的代码clone下来。
悠然 20:03:38 
对应的找到https://git.oschina.net/tinyframework/tiny/tree/master/framework/org.tinygroup.dbf
悠然 20:03:42 
这个目录。
悠然 20:04:01 
这个里面大概有300多行代码,完成了dbf文件的读取。
悠然 20:04:14 
你的任务是完成另外的200多行代码,完成对应DBF文件的写入。
悠然 20:04:28 
要求,代码风格与原来大体一致。
路人甲 20:05:00 
嗯,我尝试一下
悠然 20:05:09 
呵呵,今天完不成,明天完成也算完成任务。
悠然 20:05:18 
明天完不成,后天完成也算完成。
悠然 20:05:58 
今天完成,架构师;明天完成,高级程序员;后天完成;中级程序员,大后天完成:初级程序员。
悠然 20:06:04 
LY6DR3ISJE0)6K)L)]~VIZK
悠然 20:06:07 
公平吧?
悠然 20:06:22 
大后天完不成,就out了:)
路人甲 20:07:22 
收到。
悠然 20:07:38 
}$$SH8F5BOR8W96(N@`FVY4(Y8OSM1NHC$]3CFH@G11Q%I
悠然 20:08:56

路人甲 9:17:14 
CD74A7A2C66748888D8F289B25CDF79A
悠然 9:17:55 
??
悠然 9:18:00 
这么开心的?
路人甲 9:18:05 
我可以说我完成了么?
悠然 9:18:29 
}$$SH8F5BOR8W96(N@`FVY4[4]
悠然 9:18:42 
呵呵,热烈欢迎。
悠然 9:19:00 
呵呵,如果完成了且没啥问题,我兑现给你架构师。
路人甲 9:19:48 
呵呵,回头你先看看代码。主要的文件格式应该是没有什么问题了。我写入的,用之类的读的功能,是可以读取的
悠然 9:20:10 
}$$SH8F5BOR8W96(N@`FVY4[5]
悠然 9:20:16 
pullrequest给我。
路人甲 9:20:26 
嗯,我先吃个早饭
悠然 9:26:21 
@LUA{YQK6%1MZAU5[]84W]W
悠然 9:26:46 
吊我胃口。
路人甲 9:27:24 
我来弄一下。X@8}U9MLE}EBUE273)]9PGF[4]
路人甲 9:51:35 
我提交了代码,要点一下pull requests是吧
悠然 9:52:27 
嗯嗯。
路人甲 9:55:20 
我操作完成了
路人甲 9:55:22 
悠然
悠然 9:55:58 
3E2B9A0553FE4EA8ACFC62D61A19CDA9


悠然 9:56:34 
A72D9381EA8A4C538747F6EAC092B007
悠然 9:58:26 
呵呵,好像规定的200行也没有超过哦。
路人甲 10:04:04 
我完成的比较仓促。。有不足的地方。还希望提出
写的时候,我把数据先放内存,最后写文件的。所以没有用nio
悠然 10:04:35 
Writer接口为啥没有内容??
路人甲 10:05:08 
我应该把抛出来用的方法声明在接口里,
悠然 10:05:36 
否则这接口的作用就降低了。
悠然 10:05:53 
编译采用jdk1.5兼容要求。
悠然 10:06:01 
否则在jdk1.5就没法跑了。
悠然 10:06:32 
headbuffer.write(new byte[]{ //年月日
  0x72,0x07,0x07  
});
悠然 10:06:39 
ECD323D9B3C942E1A19F39F5055EAE1A
悠然 10:06:48 
这个要读取当前日期的。
悠然 10:06:52 
你给填了固定值。
悠然 10:07:54 
62ACF8F0D1C14BFB90DE2356B807334F
悠然 10:08:08 
这个命名不规范,应该是写入一行的意思吧?
悠然 10:08:29 
writeRecord和writeData表达的意思是不一样的。
路人甲 10:09:18 

悠然 10:10:08 
3A19150767054E1F981D0915DBFABFDC
悠然 10:10:25 
变量名尽量用长名。
路人甲 10:10:39 
MNZG)S@Y~O64{]B~UL$X2KN[7]
悠然 10:10:52 
2343EE918A8C44FABB83A612ED4BF490
悠然 10:11:02 
这个地方,引用in的意义在于?
路人甲 10:11:55 
因为我定义字长是4位
路人甲 10:12:10 
如果需要2位的或者3位的
路人甲 10:12:26 
我会把4位拷贝到指定长度的数组中
路人甲 10:12:34 
3FAB297F5EE54D09BA4967D6EEE01806
悠然 10:12:44 
嗯嗯,这个应该改成两方法。
悠然 10:12:56 
一个是int转成4个长的方法。
悠然 10:13:05 
另外一个是截取部分长度的方法。
悠然 10:13:45 
LY6DR3ISJE0)6K)L)]~VIZK[18]
悠然 10:14:43 
writeByteArray
悠然 10:14:58 
这个的函数名定义是不是也不准确??
悠然 10:15:12 
这里是输出一个字段定义吧?
路人甲 10:15:15 

路人甲 10:15:39 
改,这方面的确不规范
悠然 10:17:16 
亲,做平台与做项目的区别在于:
悠然 10:17:28 
做项目,没有人能看得到你表现不好的地方。
悠然 10:17:44 
所以,你猥琐一点实现就实现了,没啥关系。
悠然 10:18:09 
做平台就完蛋了,你猥琐一下,完了,还不能改,因为有人用了。
悠然 10:18:25 
完了,每次被人发现,都会被人鄙视。
悠然 10:18:30 
LY6DR3ISJE0)6K)L)]~VIZK[5]
路人甲 10:18:55 
嗯。我了解了,下回就会注意这些
悠然 10:22:51 
修改完了之后,再提交给我。
路人甲 10:23:04 

悠然 10:23:36 
呵呵,因此就算你今天完成,给你高级程序员称谓了哦:)
悠然 10:25:03 
架构师和高级程序的差别,其实也就差这么一点:
1.更细致
2.更严谨
3.不仅仅是以实现功能为目标
路人甲 10:25:39 
嗯,X@8}U9MLE}EBUE273)]9PGF[6]
悠然 10:29:19 
我要离开一下,你要严格要求自己,完了觉得没有更好的程度,再提交后推送我。
路人甲 10:29:53 
好的
悠然 10:30:17 
根据这个看,你是一个反应敏捷的程序员。
悠然 10:30:32 
但是可能随项目做的比较多,导致有点随意了。
悠然 10:31:14 
呵呵,简单注意一点就好了。
路人甲 10:31:32 
X@8}U9MLE}EBUE273)]9PGF[7]
悠然 12:37:42 
路人甲!!!
路人甲 12:37:54 

悠然 12:38:36 
呵呵,pull了没?
路人甲 12:39:42 
还没有,上午没有弄。我下班之前提交给你
悠然 12:40:04 
感觉你分分种就可以搞定的。
路人甲 12:40:41 
X@8}U9MLE}EBUE273)]9PGF[8]上午在部署几个东西。

路人甲 12:40:54 
坐在这儿,事就来,杂呀。
悠然 12:42:09 
X1`E@`R9LLX~6VHSWO`NXY0
路人甲 15:44:09 
悠然,我pull给你了
早上说的那些细节我修改了一下
完善了一些忽略掉的逻辑
悠然 17:17:25 
嗯嗯。
悠然 17:17:38 
这样就对了,好呆让我挑出点毛病,有点成就感么:)
悠然 17:19:35 
路人甲,在??我回来了。
路人甲 17:19:42 
在了
悠然 17:19:57 
LY6DR3ISJE0)6K)L)]~VIZK[8]刚才出去到客户那里去了。
路人甲 17:20:12 
CD9B4256A29C4233B5467C818BBFAD2A
悠然 17:20:20 
首先回答个问题,你自己觉得这次提交的有啥遗憾或不足没?
路人甲 17:21:34 
我暂时没想,但是我存在一些疑惑
悠然 17:22:02 
请讲?
路人甲 17:22:02 
比如,对dbf的文件的写入,目前只有整个文件的写入
路人甲 17:22:28 
那么如果对于个已存在的文件,想做局部的删改
路人甲 17:22:36 
是不是也在预期之内的功能
路人甲 17:23:09 
还有,我看你读的时候,把数据,只当字符串来解析,dbf文件的其它数据类型是不是不用关心
悠然 17:23:14 
呵呵,也要全读出来,再修改了之后再写入,是吧?
悠然 17:23:32 
现在需要idx文件的,暂时不用关心。
悠然 17:24:37 
你没有考虑删除标记的?
路人甲 17:25:04 
写入的时候有删除标记?
悠然 17:25:33 
就是有的记录有删除标记。
悠然 17:27:42 
DD82A00E12D94F19A757E416C0880131
悠然 17:27:50 
读取的时候,明显是有处理的。
路人甲 17:28:14 
额,可能我对这个功能的使用背景还不太了解。
我想如果预期是删除的,那么为什么还要往里写呢。
悠然 17:28:58 
呵呵,如果删除了,写入,下次要用,只要把删除标志置一下就回来了。
悠然 17:29:11 
如果直接不写入,下次想后悔就没有了。
悠然 17:29:53 
和你说,要改成jdk1.5兼容,你没有改。
悠然 17:31:23 
BADEEA95116446B99279EEE95AF4075F
悠然 17:31:38 
这个方法,可以优化为没有arrayCopy的。
路人甲 17:31:50 
额。。我用了jdk1.5不支持的东西呀。。
我早上没注意到这句话。jdk1.5我还没用过
悠然 17:31:58 
理论上性能好一点:)
悠然 17:32:10 
4EAFEC5C31E345C39486CB41BFFD588F
悠然 17:32:17 
这个东东,jdk1.5不支持。
悠然 17:32:44 
我的框架要求支持jdk1.5和1.6两个版本。
悠然 17:32:55 
说错了,支持jdk1.5以上版本。
路人甲 17:32:55 
嗯。我知道了
路人甲 17:33:10 
刚才那个问题。我想讨论一下
悠然 17:33:35 
嗯嗯,请讲。
路人甲 17:34:26 
arraycopy拷贝内存比一些cpu的数学计算来说,
悠然 17:34:56 
??是不是打错字了?
路人甲 17:36:01 
没有,我早上看到你说的了,但是我认为arraycopy的方案,要比之前实现的那一版,要好一些。
悠然 17:37:19 
嗯嗯,我是说,如果从代码优化的角度还可以更优化。
悠然 17:37:38 
你知道bit
悠然 17:37:44 
就知道数据开多长。
悠然 17:37:56 
然后按长度赋值进去,直接返回就好了。
悠然 17:38:06 
无法是多了3个判断。
悠然 17:38:34 
3个判断与多赋值的语句,对比成本已经接近。
悠然 17:38:42 
但是现在多了一次arrayCopy
悠然 17:39:21 
要申请两次空间,还有数据拷贝。
悠然 17:39:26 
比如,bit=2
悠然 17:39:58 
你先申请了4bytes,然后四4赋值,然后又进行arrayCopy
悠然 17:40:32 
如果写成byte[]buf=new byte[bit];
路人甲 17:41:09 
嗯。我明白你的意思了
悠然 17:41:37 
单就这个问题来说,你性能下降一倍多。
悠然 17:41:57 
垃圾回收次数增加一倍多。
悠然 17:42:04 
如果有的话。
悠然 17:42:48 
82B8F8FE94234D118F0F7F8222F4F3D6
悠然 17:42:56 
这种尽量就用field吧。
悠然 17:43:04 
i,j除外。
路人甲 17:43:13 

8478413135D04762A4FE541CAAECBD12
悠然 17:43:26 
这个是可以接受的。
悠然 17:43:33 
Field f是要避免的。
悠然 17:43:48 
i一般约定俗成为表示索引下标。
悠然 17:43:52 
所以,可以用。
路人甲 17:43:54 

悠然 17:44:04 
但是如果Field f,这个就难以理解了。
路人甲 17:44:08 
我刚才想说啥来着
路人甲 17:44:13 
还有一个问题
悠然 17:44:31 
想说,arrayCopy那个方法,我为啥说你还有优化空间了。
路人甲 17:45:13 
对了,util里。我把那个*256的改成位移了。40ABFDF414BA4E8A8A62741A0072014C动了原来的东西
悠然 17:45:29 
没关系,改得好都接受。
悠然 17:45:37 
改不好,就不接受:)
悠然 17:46:03 
所有的都可以改---只要改得好。
路人甲 17:46:20 
变量名的问题,我刚才改完后还检查了一遍,还有这个问题。太粗心了
悠然 17:46:22 
知道为什么让你做个小例子了吧?
悠然 17:46:32 
因为不同的项目组,规范不一样的。
路人甲 17:47:03 
嗯,我向来单打斗独。。所以这次机会,我很珍惜
悠然 17:47:08 
我眼睛像素级的。
悠然 17:47:25 
不管是拼写错误,逻辑错误,漏网的不多。
悠然 17:47:36 
嗯嗯,所以,对你是机遇也是挑战。
悠然 17:48:04 
机遇,是有新东西学习,挑战是你要和你自己做斗争。
悠然 17:48:23 
但是请相信我,如果你做得好,我们会向你学习的:)
悠然 17:48:41 
同理,你原来养成的“坏”习惯也得改改。
悠然 17:49:53 
D99109A72EB04383B8C038057FB042CD
悠然 17:50:05 
这个args,没有人会知道怎么填的。
路人甲 17:50:27 
嗯呐。
悠然 17:51:14 
byte[] fillbank = new byte[needFillLength]; 
  for(int j = 0;j<needFillLength;j++) fillbank[j] = 0x20; 

悠然 17:51:21 
这个可以搞成个方法。
悠然 17:51:49 
Tiny里面,不允许写if(...)aaa;else bbb;
悠然 17:52:12 
必须写成:
if(...){
   aaa;
}else{
  bbb;
}
路人甲 17:52:17 
Ok
悠然 17:52:36 
同样也不允许写for(...)aaa;
悠然 17:52:49 
必须写
for(...){
   aaaa;
}
悠然 17:53:34 
这个的用处,在于当你发现在循环体内一行语句不够的时候,不要担心忘记加{}而引起新的BUG
路人甲 17:54:45 
嗯。我再改改
悠然 17:55:01 
LY6DR3ISJE0)6K)L)]~VIZK[12]
悠然 17:55:15 
今天一定改好呀,拖到明天,就变中级程序员了:)
路人甲 17:55:32 
Ok
悠然 17:56:24 
}$$SH8F5BOR8W96(N@`FVY4[12]M}`B[M0D~YCZ45R@U(FE_88(Y8OSM1NHC$]3CFH@G11Q%I[4]
路人甲 17:56:36 
0035E3322E1647FEBCEE81CB779813D1
悠然 17:56:45 
千万不要粗心哦,后面给你大块头,你这要一粗心。
悠然 17:56:53 
不是要种下遍地的BUG了??
路人甲 17:57:14 
好的。我一定
悠然 17:57:48 
偶相信你,几点pull我??
悠然 17:58:09 
我好及时看,避免明天看,再发现问题,你就真跑中级去了:)
路人甲 17:58:44 
我7点pull
路人甲 17:59:04 
也许更早,我仔细再核查一
路人甲 17:59:07 

悠然 17:59:17 
好滴,我8:00左右看。
悠然 17:59:23 
到时我给你留言。
路人甲 17:59:29 

悠然 17:59:35 
偶看好你~~
悠然 18:01:42  
路人甲 19:05:41  

11D5B325F89942F697F692971A871C9F
路人甲 19:05:46 
悠然,这一版你可满意?
悠然 19:06:07 
}$$SH8F5BOR8W96(N@`FVY4[14]
悠然 19:06:13 
这才是做程序的态度。
悠然 19:06:23 
你自己感觉一下,性能如何,代码整洁度如何?
悠然 19:06:41 
NB的程序员就是不多干,也不少干。
路人甲 19:07:19 
3C12C79F66E34443BF82F81918C9A246我准备pull给你了
悠然 19:07:30 
仔细检查哦。
悠然 19:07:38 
你已经玩了我好几次了。
路人甲 19:08:23 
嗯,这一版我一行一行看过了。希望你满意
路人甲 19:08:31 
我pull你,然后就先回去了
悠然 19:08:34 
LY6DR3ISJE0)6K)L)]~VIZK[16]
悠然 19:08:42 
其实这个代码还有优化的空间。
悠然 19:09:04 
9E87E0DD7341454AB50189319A2D4691
路人甲 19:13:52 
悠然,你收到没
路人甲 19:14:00 
925F4B19750E474A8BE3A4486D5D2E77
路人甲 19:14:07 
我冒似没pull成功呀
悠然 19:14:24 
4小时前有一个。
悠然 19:14:44 
我把那个关闭了。
路人甲 19:15:10 
好了
路人甲 19:15:12 
成功了
悠然 19:15:29 
刚才那个方法还可以优化:)
悠然 19:15:33 
你再仔细看看。
路人甲 19:15:53 

悠然 19:21:12 
从性能优化的角度看,还可以改成速查表。
悠然 19:25:18 
bodybuffer
悠然 19:26:00 
840C21B5C2C34A81A2CACC1447514DEB
悠然 19:26:24 
690E3EEC26C846C19BD3709354F944F4
悠然 19:26:57 
2D0E1DE7FF094411BB0E8FE057B70B9D
悠然 19:27:09 
这里的encode是多传的。
悠然 19:27:18 
dbffos
悠然 19:27:26 
bodybytearray
悠然 19:28:22 
fieldNameBytearr
悠然 19:28:34 
destlen
悠然 19:29:21 
fillbank
悠然 19:30:58 
C312DA98076743C3B7F3A5BDF372CBC7
悠然 19:39:13 
3218AD3ACB48452EAF4AA884EA52ECD6
路人甲 20:44:55 
encode不是多传的。只是忘了用了
路人甲 21:02:36 
20C2ACA6630247F898A58A1FC1727288
悠然 21:02:38 
@LUA{YQK6%1MZAU5[]84W]W[10]
路人甲 21:02:49 
你是这意思不,悠然

悠然 21:03:08 
}$$SH8F5BOR8W96(N@`FVY4[16]
悠然 21:03:19 
嗯嗯,当然,实际区别也不大。
悠然 21:03:32 
这里仅是说一下如果优化到最好,是应该怎么优化的。
路人甲 21:03:34 
少了在栈里的运算
悠然 21:03:58 
你这个代码写得太随意呀。
悠然 21:04:13 
挺不错的人,被耽误了。
悠然 21:05:38 
你的接口方法设计得有问题。
路人甲 21:05:58 
请指教
悠然 21:06:14 
呵呵,你有一个save()方法。
悠然 21:06:21 
不知其可。
悠然 21:06:34 
我看了你的代码,知道你是干啥的。
悠然 21:06:43 
但是从设计上说,是失败的。
悠然 21:07:09 
然后,那个write(String...args)也不太好。
悠然 21:07:37 
如果人家已经知道类型了,必须得转成String,然后再从String进行转换成要写的数据。
悠然 21:07:49 
这个是非常不方便的。
路人甲 21:08:29 
你觉得用参数列表来解决传记录的值的方案合不合适 呢
悠然 21:08:46 
实际上不太合适,但是也还可以接受。
路人甲 21:11:39 
嗯。我觉得这样调用方便一些,我开是将参数弄成Object类型的。后来看你读的时候全当字符处理的,我就把参数弄成String了
路人甲 21:12:42 
设计成Object,再用反射去判断是不是基本类型,然后填充相应的字节
悠然 21:16:53 
可以用类型判断的。
悠然 21:17:07 
类型不对,抛异常就好了。
路人甲 21:20:01 
关于有个save方法。。我的考虑的前提是,所有字段名和数据都添加好以后再写入文件
这样就要有一个指令来告诉程序,他已经结束输入 了
悠然 21:20:23 
嗯嗯,所以我知道你的意思。
悠然 21:20:44 
如果仅用来表示这个意思,close都比save合适:)
路人甲 21:26:47 
嗯。受益良多。 

你可能感兴趣的:(java,framework,悠然,tiny)