2013年11月8日

异常处理

摘要: 通过编程无法避免的,用已检查异常异常处理。比如网络断开。如DataFormatException。RuntimeException通过编程可以避免,要在编程时对出现的RuntimeException的情况判断。比如除数是0,数组越界等。但现在还有比较流程用RuntimeException来替换掉所有有Exception。这种情况主要是为了代码更美观。在调用链上谁可以处理谁就可以捕。用RuntimeException封装Exception的两种方法,直接封装和用RuntimeException子类。详见:《java编程思想P280》异常和方法返回值的选择,个人倾向于方法返回值。如果发生程序不可继 阅读全文

posted @ 2013-11-08 15:34 关攀攀 阅读(112) 评论(0) 推荐(0)

常见架构方案

摘要: 注:大部分来源于网络,领域部分来自jdon大型网站架构和知识体系演进京东架构淘宝Detail内存领域对象+事件驱动Domain EventsCQRS命令查询分离DomainModel+Event分布式架构DCI架构数据+上下文+交互1.直接通过领域对象来发出事件。2.创建上下文,将Role注入到领域模型中。 阅读全文

posted @ 2013-11-08 15:28 关攀攀 阅读(454) 评论(0) 推荐(1)

调试程序

摘要: 1.有异常信息的技术性调试如果有异常信息,一定要从异常信息出现的原因入手。例如:java.lang.NoSuchMethodError: org.springframework.util.ObjectUtils.isArray(Ljava/lang/Object;)解读:肯定找到类了,类里面没有方法。分析:自己本地没错,服务器上有错,就是在本地能找到方法,在服务器上找不到。也就是说肯定有一个类有此方法,并且还有一个同包的类无此方法,应该是jar包冲突。然后找到包含此类的jar包确认下就可以。2.结果不对的逻辑性调试先要想,找出怀疑的点,然后通过断点或日志加以证明或反证明,如果不是再找怀疑点,如 阅读全文

posted @ 2013-11-08 15:19 关攀攀 阅读(248) 评论(0) 推荐(0)

编码反模式

摘要: 1) 通用方法一个方法处理多个业务,比如修改用户传入一个用户对象,方法根据邮箱,手机..是否为空来处理修改手机,邮箱等业务处理方法:每个业务要分开,单一职责2) 对象内的平行方法A(a1,a2,a3),a1,a2,a3方法中有相似功能。IA(a)ßA(a,abstract b)ßA1(b),A2(b),A3(b)3) 业务链方法一个业务的链式判断用方法调用来实现,比如用户登录,先判断是否是用户名-》别名-》密码。方案二:用责任链或装饰器模式来处理。两个没有特别明显的优略,但如果是一个业务的重要逻辑,方案二有明显优势。4) 混乱代码很多类,对像协调来做一件事,每个类只是一个框 阅读全文

posted @ 2013-11-08 15:17 关攀攀 阅读(233) 评论(0) 推荐(0)

一些编码经验

摘要: 1)根据要解决的问题来设计线程或者类体系,保证带来的复杂性都是因为问题的复杂性而带来(用多线程可带来好处的地才使用),并且要试图从技术上尽量缩减方案的复杂性(比如用JDK5新线程代替原来wait,notify)。(数据迁徙重构有感)针对代码:要思考多这几个类解决了什么问题,多几个线程又解决了什么问题,深层次的调用又解决了什么问题,如果没有解决什么问题,只是复杂,还是删除掉吧。2)重构代码要有自动测试护航,哪怕是只有验收测试。3)写足够少的代码,保证每小步都可执行,可观测,在每次小正确时考虑是否要重构。顺序,先写接口,再写接口测试,测试失败,接口实现,测试通过,考虑重构。就像是想做一个东西,组装 阅读全文

posted @ 2013-11-08 15:16 关攀攀 阅读(189) 评论(0) 推荐(0)

java语言的一些小语法

摘要: 原始类型空指针Integer a=null;if(a==0)会抛出空指针Map隐含添加冲突Iterator是工作在一个独立的线程中,它会建立一个索引表,当原来数据发生改变时,索引表不会发生改就,就会抛出java.util. ConcurrentModificationException异常。容易发生问题:Map的put方法,意愿是想修改,但如果key不存在就有问题了。集合大小隐含冲突for(int i=0;i和List,如果作为参数一个可传入子类型,一个不可以传入子类型。String"".compareTo(null)会有异常java正则str = str.replaceA 阅读全文

posted @ 2013-11-08 15:11 关攀攀 阅读(125) 评论(0) 推荐(0)

长方法重构过程

摘要: (一)整体过程1) 原代码重构成逻辑块清晰的过程化代码2) 对不同逻辑块进行抽取成服务类3) 从领域对象的角度分析服务类,通过单一职责来梳理服务类(二)原代码重构成逻辑块清晰的过程化代码每个逻辑块要有明确的输入输出,不同逻辑块最好能做到无序,如果一定有有序,要对有序有地方有所注释。每下个逻辑块都很分明,想抽成方法就可以随时抽取,不想抽取也可以保持现状,当重复代码出现时要进行抽取。如下是个合格的过程化代码示例。返回值 方法1(参数1,参数2){返回值变量1; //声明方法返回值 //逻辑块A 跨块变量AB1;//被多个逻辑块使用 块变量声明A1; 块变量声明A1=块代码A0(参数1); 跨块变量 阅读全文

posted @ 2013-11-08 15:01 关攀攀 阅读(257) 评论(0) 推荐(0)

从单元测试开始说起

摘要: 编程从一个角度来说,象是在推土,或者设定个小目标,完成,再设定一个小目标再完成,每一小步都有成功的喜悦。是在做一个类似一小步,一小步创作的东西,每一步有小成果,有它的趣味性和创造性,有每次一个小胜利的喜悦。编程的过程从一个角度来说更象是扫雷,每次一小步,还要保证扫过的地方一定没有雷,有它的谨慎性。总的来说程序可以分为衔接部分和功能部分。功能程序要要有单元测试来保证。集成测试来保证衔接部分和单元协作的正确性。面向过程和面向对象和分合的关系:分合角度,面向过程主合A->B->C,面向对象主分分为ABC三对象;组件角度,面向过程和衔接程序相呼应,面向对象和功能程序相对应。面向过程和面向对 阅读全文

posted @ 2013-11-08 14:58 关攀攀 阅读(251) 评论(0) 推荐(0)

2012-3用户数据迁移

摘要: (一)用户数据迁徙1.每次处理的数据要有一定的批量,保证内存和CPU占用稳定,不会内存溢出。2.在一定情况下,用可重复执行和报错机制来代替事务。比如change_log和数据操作不强调事务。数据迁徙经验汇总:迁移数据相关(这些问题看起来小,但带来的问题还是很麻烦的):一.如果前后空格无意义,数据库入库时要截断前后空格。二.同一字段在不同数据库或者同一数据库不同表中存储大小写要一致。不能数据库不区分,就存不一致的。三.数据库或者保持全角半角一致(同上),或者只存半角。一定不能有的地存全角,有的地存半角。四.如果业务要求字段唯一,数据库要做唯一限定。五.不可太相信业务系统,可以开发个非法数据检测程 阅读全文

posted @ 2013-11-08 14:52 关攀攀 阅读(199) 评论(0) 推荐(0)

2013-商品迁徙

摘要: 需求简述sqlserver商品库全量迁徙至mysqlsqlserver商品库增量迁徙至mysqlmysql商品库增量迁徙至sqlserver两边数据是异构的:几条sqlserver数据要合成一个mysql数据,几个sqlserver表数据对应mysql一张表的数据。商品迁徙一开始设计用过头了mysql中的一个表的记录来源于sqlserver中几个表,设计了个buiid接口,每个sqlserver中的对象实现此接口再统一进入一个build集合进行构建,在编码后发现,哪个表哪些字段怎么build的很难维护,不同build分的太散乱了,改进成不同build的逻辑放到了一起。总结:不要过早设计,设计的 阅读全文

posted @ 2013-11-08 14:42 关攀攀 阅读(180) 评论(0) 推荐(0)

导航