总结起来还是要有规范,规范到习惯。 代码易于维护,分为两个方面:容易阅读理解;容易修改扩展。一、如何写出容易被阅读和理解的代码1. 最根本的一条,要向写文章学习,有目录,有大纲,有标题,有段落,有适当的提示。1.1. 首先是目录结构,这个在一些比较好的实践中,有约定俗成,比如Rails应用,app目录下一定分controllers、models、views、helpers四个目录。再加上config、lib、vender,大致的代码在哪个位置,不用猜都知道。越是常见的项目类型,越是应该按照约定俗成来构建项目的目录结构,不要别出新裁。对于没有业内参考的项目,目录结构也尽可能采用简单、易懂、含义固定明确的单词,比如:core、config、test这样的命名。1.2. 包名与文件名,在这方面,java语言的规范非常值得其他语言参考和借鉴,分层组织,合理命名。是最重要的。1.3.一个源代码文件里,要不要有注释?我认为,尽可能不要,还是要像写文章一样,让人阅读起来,有感觉。比如:文件名,类名,方法/函数名。如果将所有的实际代码全部折叠起来,顺序的阅读这些名字,能不能让阅读者,对于这一个源文件的内容和目的,有大概的了解?再强调一次顺序阅读,一个 源程序文件内有很多个函数/方法,这些方法的排列次序,是有意义的。仅仅依靠调整次序,比如:构造函数,扩展构造函数,简单的读写函数,业务相关的函数。以这样的次序来排列,会更加便于阅读。在必须写注释的地方,也不要写得太多,言简意赅,把要点用1.2.3.讲清楚。1.4. 变量名,常数名,我们必须一再一再的强调命名的重要性,可以说,命名是软件开发中,头等重要的大事。要简洁、清晰、全英文(决定不要汉语拼音、任意缩写)、尽可能不要夹杂数字,比如var1、var2这样的变量名,就是最糟糕的。2. readme在项目开发的过程中,定期整理一份readme,放在项目的根目录,主要包含两部分内容:我们的代码做了些什么?如何查找我们写的代码。3. wiki团队开发,尽可能维护一份wiki,自己架一个mediawiki或者其他wiki,都是很简单的。或者自己架一个redmine这样的集成项目管理工具,该有的就都有了。wiki的管理维护是一个很大的话题,这里就不再展开了。4. 单元测试@李楠 和@KevinWei 已经提到了。 这个办法,既方便阅读理解代码,也方便修改代码。非常重要。5. Code Review@KevinWei 也已经提到了。二、如何写出容易被改写和扩展的代码1. 单元测试,最好全过程采用TDD(测试驱动开发)这样才能让人有信心修改你的代码。2. 参考业内成熟实践与设计模式这个事情,要多讲一句,千万不能过头。为了追求可扩展性,可重用性,甚至仅仅是为了玩弄设计模式,会让一个项目成为过度设计的牺牲品,千万不能过头。3. 定期重构一上来就向设计模式靠拢是很危险的,重构时以设计模式为参考会好一些。但是,大多时候,我们没时间重构。。。所以,还是TDD最实在,按照TDD的工作模式,你的项目几乎每天都有大大小小的重构。4. 结对编程这个@李楠 已经提到了。让知识在团队中不只是一个人掌握,很重要。大概就是这些吧。。。来源:http://www.zhuangbiaowei.com/blog/?p=449
myeclipse7以前都是可以很容易通过link方式来安装eclipse的插件的,自从myeclipse7以后,myeclipse修改的安装配置的方式,直接用link方式安装插件很麻烦,这里找到一个用link方式的插件配置代码的生成器,用这个安装,简单的一米,推荐必备软件。步骤如下1.比如给myeclipse10安装hibernate的插件,我的hibernate插件之前是eclipse3.2的版本安装的里面。在D:toolsMyEclipse 10MyEclipse 10建立myplugins文件,将hibernate插件放入文件中,不要有eclipse的目录。hibernate插件目录如下 D:toolsMyEclipse 10MyEclipse 10mypluginshibernatepluginscom.hudson.hibernatesynchronizer_3.1.9_lclgv1.02.使用MyEclipse插件配置代码生成器,修改里面的路径import java.io.File;import java.util.ArrayList;import java.util.List;/** * *@ClassName : PluginConfigCreator@ClassDescription : MyEclipse插件配置代码生成器@Author : dapeng@CreateTime : 2011-12-18 下午8:39:31 */public class PluginConfigCreator {public PluginConfigCreator() {}public void print(String path) { List<String> list = getFileList(path); if (list == null) { return; } int length = list.size(); for (int i = 0; i < length; i++) { String result = ""; String thePath = getFormatPath(getString(list.get(i))); File file = new File(thePath); if (file.isDirectory()) { String fileName = file.getName(); if (fileName.indexOf("_") < 0) { print(thePath); continue; } String[] filenames = fileName.split("_"); String filename1 = filenames[0]; String filename2 = filenames[1]; result = filename1 + "," + filename2 + ",file:/" + path + "/" + fileName + "\,4,false"; System.out.println(result); } else if (file.isFile()) { String fileName = file.getName(); if (fileName.indexOf("_") < 0) { continue; } int last = fileName.lastIndexOf("_");// 最后一个下划线的位 置 String filename1 = fileName.substring(0, last); String filename2 = fileName.substring(last + 1, fileName.length() - 4); result…
为了防止程序破解系统登录,一般都会采用登录+验证码的措施。kaptcha是我用到的最好用的一个验证码工具,使用非常的简单。瞧瞧我在项目中使用的效果吧!感觉还是很不错的。使用方法:1.当然是下载kaptcha的jar包了kaptaca的地址:http://code.google.com/p/kaptcha/我在下面也提供一个我修改的版本,修改点下面说。2.在web.xml中增加配置 1:<servlet> 2:<servlet-name>Kaptcha</servlet-name> 3:<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class> 4:</servlet> 5:<servlet-mapping> 6:<servlet-name>Kaptcha</servlet-name> 7:<url-pattern>/kaptcha.jpg</url-pattern> 8:</servlet-mapping>3.在需要的页面进行调用 1:<imgsrc="Kaptcha.jpg"> 2:<formmethod="POST"> 3:<br>验证码:<inputtype="text"name="kaptchafield"><br/> 4:<inputtype="submit"name="submit"> 5:</form>4.验证 1: String key = (String)session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); 2: String parm = (String) request.getParameter("kaptchafield"); 3: 4: out.println("验证码的值: " + key+"<br />"); 5: out.println("您输入的值: " + parm); 6: 7:if (key != null && parm != null) { 8:if (key.equals(parm)) { 9: out.println("<b>验证成功</b>"); 10: } else { 11: out.println("<b>验证失败</b>"); 12: } 13: }看看效果来效果还不错的,就是美化不怎么好,好在kaptcha的自定义功能很强,可以根据需要自定义自己的效果。kaptcha的配置属性**Constant****Description****Default** kaptcha.border 是否有边框 默认为yes 我们可以自己设置yes,no yes kaptcha.border.color 边框颜色 默认为Color.BLACK black kaptcha.border.thickness 边框粗细度 默认为1 1 kaptcha.image.width 验证码图片宽度 默认为200 200 kaptcha.image.height 验证码图片高度 默认为50 50 kaptcha.producer.impl 验证码生成器 com.google.code.kaptcha.impl.DefaultKaptcha kaptcha.textproducer.impl 验证码文本生成器 com.google.code.kaptcha.text.impl.DefaultTextCreator kaptcha.textproducer.char.string 验证码文本字符内容范围 abcde2345678gfynmnpwx kaptcha.textproducer.char.length 验证码文本字符长度 5 kaptcha.textproducer.char.space 验证码文本字符间距 默认为2 2 kaptcha.textproducer.font.names 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) Arial, Courier kaptcha.textproducer.font.size 验证码文本字符大小 40px. kaptcha.textproducer.font.color 验证码文本字符颜色 默认为Color.BLACK black kaptcha.noise.impl 验证码噪点生成对象 com.google.code.kaptcha.impl.DefaultNoise kaptcha.noise.color 验证码噪点颜色 默认为Color.BLACK black kaptcha.obscurificator.impl 验证码样式引擎 默认为WaterRipple com.google.code.kaptcha.impl.WaterRipple kaptcha.background.impl 验证码背景生成器 默认为DefaultBackground com.google.code.kaptcha.impl.DefaultBackground kaptcha.background.clear.from 验证码背景颜色渐进 默认为Color.LIGHT_GRAY light grey kaptcha.background.clear.to 验证码背景颜色渐进 默认为Color.WHITE white kaptcha.word.impl 验证码文本字符渲染 默认为DefaultWordRenderer com.google.code.kaptcha.text.impl.DefaultWordRenderer kaptcha.session.key 放入session的key名称 KAPTCHA_SESSION_KEY kaptcha.session.date…
dapeng 2012主题的主题的模仿的腾讯CDC的主题,主题的特点是精简,比起上一个主题,没有太多的css、js、页面效果,主要是为了增加页面的速度。另外一个也是为了在2012年也有一个自己的风格主题。也就是目前自己使用的这款主题,里面很多的都是代码实现的,也是整理自己接触Wordpress,熟悉的一些函数。分页、首页图片、相关文章、分类目录等都重写了代码,加入的注释。图片演示效果:最近访问网站的速度也有些慢,自己用的外链图片也很难访问,为了速度加快一些,使用了cloudflare提供的CDN服务。使用CDN服务后的效果对比:我用的是使用的服务器地址是:174.37.169.153,效果肯定比不上国内,但也比起超时要好的多。另外之前一直使用的wp spuer cache也没有生效,今天也捣腾的可以用了。使用Firebug测试了下首次打开速度,也基本保持在3s左右,可能网络好,满足下虚荣感。主题基本就定下来了,下一步就是做一些SEO的事情了,不过,我的观点是回归自己建立博客的本质。博客首先是记录收集的地方,分享也就是附带的目的吧!如果仅仅是记录收集,用记事本还不简单啊!
文章比较老,不过也把Java开发的常用的方式、方向也说明了。J2EE开发三件宝: Domain Model(域建模)、patterns(模式)和framework(框架)。J2EE系统的概念及如何开发J2EE学习者越来越多,J2EE本身技术不断在发展,涌现出各种概念,本文章试图从一种容易理解的角度对这些概念向初学者进行解释,以便掌握学习J2EE学习方向。首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一种语言,已经代表与微软不同的另外一个巨大阵营,所以Java有时是指一种软件系统的流派,当然目前主要是.NET和Java两大主流体系。J2EE可以说指Java在数据库信息系统上实现,数据库信息系统从早期的dBase、到Delphi/VB等C/S结构,发展到B/S(Browser浏览器/Server服务器)结构,而J2EE主要是指B/S结构的实现。J2EE又是一种框架和标准,框架类似API、库的概念,但是要超出它们。如果需要详细了解框架,可先从设计模式开始学习。J2EE是一个虚的大的概念,J2EE标准主要有三种子技术标准:WEB技术、EJB技术和JMS,谈到J2EE应该说最终要落实到这三个子概念上。这三种技术的每个技术在应用时都涉及两个部分:容器部分和应用部分,Web容器也是指Jsp/Servlet容器,你如果要开发一个Web应用,无论是编译或运行,都必须要有Jsp/Servlet库或API支持(除了JDK/J2SE以外)。Web技术中除了Jsp/Servlet技术外,还需要JavaBeans或Java Class实现一些功能或者包装携带数据,所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。谈到JavaBeans技术,就涉及到组件构件技术(component),这是Java的核心基础部分,很多软件设计概念(设计模式)都是通过JavaBeans实现的。JavaBeans不属于J2EE概念范畴中,如果一个JavaBeans对象被Web技术(也就是Jsp/Servlet)调用,那么JavaBeans就运行在J2EE的Web容器中;如果它被EJB调用,它就运行在EJB容器中。EJB(企业JavaBeans)是普通JavaBeans的一种提升和规范,因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制,这样能保证企业系统平滑发展,而不是发展到一种规模重新更换一套软件系统。至此,JavaBeans组件发展到EJB后,并不是说以前的那种JavaBeans形式就消失了,这就自然形成了两种JavaBeans技术:EJB和POJO,POJO完全不同于EJB概念,指的是普通JavaBeans,而且这个JavaBeans不依附某种框架,或者干脆可以说:这个JavaBeans是你为这个应用程序单独开发创建的。J2EE应用系统开发工具有很多:如JBuilder、Eclipse等,这些IDE首先是Java开发工具,也就是说,它们首要基本功能是可以开发出JavaBeans或Java class,但是如果要开发出J2EE系统,就要落实到要么是Web技术或EJB技术,那么就有可能要一些专门模块功能(如eclipse需要lomboz插件),最重要的是,因为J2EE系统区分为容器和应用两个部分,所以,在任何开发工具中开发J2EE都需要指定J2EE容器。J2EE容器分为WEB容器和EJB容器,Tomcat/Resin是Web容器;JBoss是EJB容器+Web容器等,其中Web容器直接使用Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行,而你开发的Web+EJB应用则只可以在JBoss服务器上运行,商业产品Websphere/Weblogic等和JBoss属于同一种性质。J2EE容器也称为J2EE服务器,大部分时它们概念是一致的。如果你的J2EE应用系统的数据库连接是通过JNDI获得,也就是说是从容器中获得,那么你的J2EE应用系统基本与数据库无关,如果你在你的J2EE应用系统耦合了数据库JDBC驱动的配置,那么你的J2EE应用系统就有数据库概念色彩,作为一个成熟需要推广的J2EE应用系统,不推荐和具体数据库耦合,当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。衡量J2EE应用系统设计开发水平高低的标准就是:解耦性;你的应用系统各个功能是否能够彻底脱离?是否不相互依赖,也只有这样,才能体现可维护性、可拓展性的软件设计目标。为了达到这个目的,诞生各种框架概念,J2EE框架标准将一个系统划分为WEB和EJB主要部分,当然我们有时不是以这个具体技术区分,而是从设计上抽象为表现层、服务层和持久层,这三个层次从一个高度将J2EE分离开来,实现解耦目的。因此,我们实际编程中,也要将自己的功能向这三个层次上靠,做到大方向清楚,泾渭分明,但是没有技术上约束限制要做到这点是很不容易的,因此我们还是必须借助J2EE具体技术来实现,这时,你可以使用EJB规范实现服务层和持久层,Web技术实现表现层;EJB为什么能将服务层从Jsp/Servlet手中分离出来,因为它对JavaBeans编码有强制的约束,现在有一种对JavaBeans弱约束,使用Ioc模式实现的(当然EJB 3.0也采取这种方式),在Ioc模式诞生前,一般都是通过工厂模式来对JavaBeans约束,形成一个服务层,这也是是Jive这样开源论坛设计原理之一。由此,将服务层从表现层中分离出来目前有两种可选架构选择:管理普通JavaBeans(POJO)框架(如Spring、JdonFramework)以及管理EJB的EJB框架,因为EJB不只是框架,还是标准,而标准可以扩展发展,所以,这两种区别将来是可能模糊,被纳入同一个标准了。 但是,个人认为:标准制定是为某个目的服务的,总要牺牲一些换取另外一些,所以,这两种架构会长时间并存。这两种架构分歧也曾经诞生一个新名词:完全POJO的系统也称为轻量级系统(lightweight),其实这个名词本身就没有一个严格定义,更多是一个吸引人的招牌,轻量是指容易学习容易使用吗?按照这个定义,其实轻量Spring等系统并不容易学习;而且EJB 3.0(依然叫EJB)以后的系统是否可称为轻量级了呢?前面谈了服务层框架,使用服务层框架可以将JavaBeans从Jsp/Servlet中分离出来,而使用表现层框架则可以将Jsp中剩余的JavaBeans完全分离,这部分JavaBeans主要负责显示相关,一般是通过标签库(taglib)实现,不同框架有不同自己的标签库,Struts是应用比较广泛的一种表现层框架。这样,表现层和服务层的分离是通过两种框架达到目的,剩余的就是持久层框架了,通过持久层的框架将数据库存储从服务层中分离出来是其目的,持久层框架有两种方向:直接自己编写JDBC等SQL语句(如iBatis);使用O/R Mapping技术实现的Hibernate和JDO技术;当然还有EJB中的实体Bean技术。持久层框架目前呈现百花齐放,各有优缺点的现状,所以正如表现层框架一样,目前没有一个框架被指定为标准框架,当然,表现层框架现在又出来了一个JSF,它代表的页面组件概念是一个新的发展方向,但是复杂的实现让人有些忘而却步。在所有这些J2EE技术中,虽然SUN公司发挥了很大的作用,不过总体来说:网络上有这样一个评价:SUN的理论天下无敌;SUN的产品用起来撞墙;对于初学者,特别是那些试图通过或已经通过SUN认证的初学者,赶快摆脱SUN的阴影,立即开溜,使用开源领域的产品来实现自己的应用系统。最后,你的J2EE应用系统如果采取上面提到的表现层、服务层和持久层的框架实现,基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系统了。还要注意的是: 开发出一个高质量的J2EE系统还需要正确的业务需求理解,那么域建模提供了一种比较切实可行的正确理解业务需求的方法,相关详细知识可从UML角度结合理解。当然,如果你想设计自己的行业框架,那么第一步从设计模式开始吧,因为设计模式提供你一个实现JavaBeans或类之间解耦参考实现方法,当你学会了系统基本单元JavaBean或类之间解耦时,那么系统模块之间的解耦你就可能掌握,进而你就可以实现行业框架的提炼了,这又是另外一个发展方向了。以上理念可以总结为一句话:J2EE开发三件宝: Domain Model(域建模)、patterns(模式)和framework(框架)。原文网址:http://www.javaresearch.org/article/31774.htm
这篇文章是在阿里UED看到了,08年的文章,内容提到web设计之道,现在还是受用的。精简、简单。*Krug***可用性第一定律——别让我思考**这句话不用过多的解释,只是说设计者应尽量做到让用户看到你的web产品时是一目了然的,明白它是什么,怎么使用它,而不需要花费精力去思考。但是恰恰网页上会出现很多让我们去思考的内容,比如:上述的例子已经很明白的说明了用户在面对不通情形下的思考成本,当用户访问web时,每个问号都会加重他们的认知负担,把注意力分散,或许这种干扰很轻微,但积累起来,足以让用户抓狂。为什么要做到这么不言而喻呢?这跟web用户的使用习惯有关。在本书作者花了大量时间观察用户如何使用网络时惊讶的发现:人们总是很忙,他们使用web的目的就是要节省时间,所以他们习惯了扫描而不是阅读,就如我们习惯了去扫描报纸、杂志、产品说明书一样。访问一个不需要思考的网站是多么惬意、高效的一件美事。*Krug***可用性第二定律——要点击多少次都没关系,只要每次点击都是无须思考,明确无误的选择**很多时候我们很难控制用户在到达目标之前的点击次数,可能3次,可能5次,但只要每次点击都是毫不费力,顺势进行,那么用户的挫败感就会大大降低。本文作者给出了下面的经验准则:“三次无须思考、明确无误的点击相当于一次需要思考的点击。”结合我们自己的后台页面,在我们暂时无法找到一个更好的缩短用户使用及实现产品功能流程的解决方案之时,那么我们让每一步操作都显得简单明了,对用户的帮助也是巨大的。就如我在购买系统安装盘时,home?professional?到底哪个才是我要的呢?显而易见,用户在使用web时也经常遇到如此选择,那么让这类选择变得无须思考则是让我们的产品更容易使用的一个主要因素。*Krug***可用性第三定律——去掉每个页面上一半的文字,然后把剩下的文字再去掉一半**估计每个设计师看到这句话都会鼓掌叫好,因为我们总是纠缠在PD、运营人员之间,让自己有点焦头烂额。用户体验概念深入人心,很多时候我们为了体现对用户的超级友好而产生的文案真是让人眼冒金星,各式各样的形容词、欢迎辞堆积,生怕怠慢了用户,但恰恰相反,有多少用户会仔细斟酌你那天花乱坠的文字呢,就如之前说的,用户很忙,他们习惯的之后扫描。请看下面的例子:其实他的主要内容就是填写个反馈表单,但这些欢迎辞明显妨碍了用户并降低了他们的效率。建行的页面也一样,其实他最关键的就是最后一句话去掉每个页面上一半的文字,然后把剩下的文字再去掉一半。虽然这话看上去似乎有点夸张,但我们必须认识到有力的文字都是简洁的,就如画上不应该有多余的线条,机器上不应该有多余的零件一样。欢迎辞更像是闲聊,浪费用户的时间,让文字更简短,让用户在每个页面上一眼看到更多的内容,有效的进行更多的操作,难道不好吗?原文网址:http://www.aliued.cn/2008/03/23/%e3%80%8a%e5%88%ab%e8%ae%a9%e6%88%91%e6%80%9d%e8%80%83%e3%80%8b%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0.html
visual editor俗称ve,现在在官方很难找到他的下载位置了。visual editor是制作JFC/Swing/SWT/RCP的工具,生成的代码比netbeans要简洁的多。整理下ve的在线安装地址eclipse3.6使用ve1.5http://download.eclipse.org/tools/ve/updates/1.5.0/eclipse3.4使用ve1.4http://download.eclipse.org/tools/ve/updates/1.4/ve1.5和1.4的zip离线包下载地址:VE-Update-1.4.0 | VE-Update-1.5.0.zip
notepad++现在是我最常用的文本编辑工具,其中使用的列模式编辑,也是很好使用的。Ctrl-C,Ctrl-X,Ctrl-V,Ctrl-Y,Ctrl-A,Ctrl-F,Ctrl-S,Ctrl-O,Ctrl-N,Ctrl-W,Ctrl-Tab,Ctrl-P,Alt-F4都是基本的快捷键。 整理其他几个快捷键的使用 Ctrl-H 打开Find / Replace 对话框 Ctrl-D 复制当前行 Ctrl-L 删除当前行 Ctrl-T 上下行交换 F3 找下一个 Shift-F3 找上一个 Ctrl-Shift-F 在文件中找 Ctrl-F2 触发书签 F2 到前一个书签 Shift-F2 到下一个书签 F5 打开run对话框 Ctrl-Space 打开CallTip列表框 Tab (selection of several lines) 加入Space Shift-Tab (selection of several lines) 移除Space F11 全屏 Alt-0 折叠全部 Alt-Shift-0 展开全部 Ctrl-U 变为小写 Ctrl-Shift-U 变为大写 Ctrl-Q 块注释/消除注释
睡眠不足会导致大脑功能下降 我们都知道,睡眠不足会削弱日常生理功能。最近研究表明,睡眠不足6小时的中年人在六项不同的认知测试上取得更低的分数,包括推理、词汇、和记忆。 此外,研究还表明,慢性睡眠不足,会导致体内荷尔蒙和某些化学元素失调,增加心脏病、高血压、疾病、糖尿病、肥胖症等疾病的风险。另外,睡眠不足还会影响情绪,导致整体身心健康恶化。结论 研究者在该参与该研究的人员中发现了一个最大的问题,就是他们透支了自己,没有使工作和生活达到平衡。专家认为:睡眠是影响总体健康状况的重要因素,必须和正确的饮食习惯、长期的体育锻炼一样,被予以同等的关注。适当的睡眠是身体机能修复的重要所需,将有益于大脑的健康和性能。成人的睡眠提示1. 将睡眠置于优先位置。此外,创建和保持定期的睡眠、起床时间模式(包括周末),将有益于大脑的自然生理节奏。* 2. 睡前避免工作或其他刺激性的活动。* 3. 建立睡前放松的仪式。如洗个热水澡,读一本书或杂志,或听轻音乐。* 4. 保持健康的体重。超重或肥胖也影响到睡眠。纳豆翻译小组译自:http://www.nativeremedies.com/blog/lack-of-sleep-leads-to-decline-in-brain-function/原文网址:http://www.naadou.com/lack-of-sleep-leads-to-decline-in-brain-function.html