有许多标准和实践准则可适用于Java开发者,但此处要说的,是每个Java开发者需坚守的基本原则。
一、为代码加注释。虽然每个人都知道这点,但有时却不自觉忘了履行,今天你“忘了”加注释了吗?虽然注释对程序的功能没什么“贡献”,但过一段时间,比如说两星期之后或者更长,回过头来看看自己的代码,说不定已经记不住它是干什么的了。如果这些代码是你个人的,那还算是走运了,不幸的是,当然了,大多数时候都是别人的不幸,很多时候大家都是在为公司写代码,写代码的人也许早已经离开了公司,但别忘了一句古话,有来有往嘛,为他人,也为我们自己,请为你的代码加上注释。
二、不要让事情复杂化。程序员有时候总是对简单问题想出复杂的解决方案,比如说,在只有五个用户的程序中引入EJB、对程序实现了并不需要的框架(framework),之类的还有属性文件、面向对象解决方案、多线程等等。为什么要这样做呢?也许我们并不知道是否这样会更好,但这样做也许可以学到一些新东西,或者让自己更感兴趣一些。如果是不知道为什么这样做,建议多请教经验丰富的程序员,如果是为了个人的目的,麻烦让自己更专业一点。
三、始终牢记——“少即是好(Less is more)并不总是对的”。代码效率虽然很重要,但在许多解决方案中,编写更少的代码并不能改善这些代码的效率,请看下面这个简单的例子:
if(newStatusCode.equals("SD") && (sellOffDate == null ||
todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&
todayDate.compareTo(lastUsedDate)>0)) ||
(newStatusCode.equals("OBS") && (OBSDate == null ||
todayDate.compareTo(OBSDate)<0))){
newStatusCode = "NYP";
}
能看明白if条件语句是干什么的吗?能想出来是谁写的这段代码吗?如果把它分成两段独立的if语句,是不是更容易理解呢,下面是修改后的代码:
if(newStatusCode.equals("SD") && (sellOffDate == null ||
todayDate.compareTo(sellOffDate)<0 || (lastUsedDate != null &&
todayDate.compareTo(lastUsedDate)>0))){
newStatusCode = "NYP";
}else
if(newStatusCode.equals("OBS") && (OBSDate == null ||
todayDate.compareTo(OBSDate)<0))
{
newStatusCode = "NYP";
}
是不是读起来容易多了呢,在此只是多加了一个if和两个花括号,但代码的可读性与可理解性就一下子提高了一大截。
四、请不要硬编码。开发者经常有意“忘记”或忽略掉这点,因为有些时候开发日程逼得实在太紧。其实,多写一行定义静态变量的代码能花多少时间呢?
public class A {
public static final String S_CONSTANT_ABC = "ABC";
public boolean methodA(String sParam1){
if (A.S_CONSTANT_ABC.equalsIgnoreCase(sParam1)){
return true;
}
return false;
}
}
现在,每次需要将“ABC”与其他变量进行比较时,不必记住实际代码,直接引用A.S_CONSTANT_ABC就行了,而且在今后需要进行修改时,也可在一处修改,不会翻遍整个源代码逐个修改了。
五、不要“创造”自己的框架(framework)。确切来说,有数以千计的各种框架存在,而且大多数是开源的,这些框架都是优秀的解决方案,可用于日常程序开发中,我们只需使用这些框架的最新版本就行了,至少表面上要跟上形势吧。被大家广为接受的最为明显的一个例子就是Struts了,这个开源web框架非常适合用在基于web的应用程序中。是不是想开发出自己的Struts呢,还是省点力气吧,回头看看第二条——不要让事情复杂化。另外,如果正在开发的程序只有3个窗口,就不要使用Struts了,对这种程序来说,不需要那么多的“控制”。
六、不要使用println及字符串连接。通常为了调试方便,开发者喜欢在可能的所有地方都加上System.out.println,也许还会提醒自己回过头来再来删除,但有些时候,经常会忘了删除或者不愿意删除它们。既然使用System.out.println是为了测试,那么测试完之后,为什么还要留着它们呢,因为在删除时,很可能会删除掉真正有用的代码,所以不能低估System.out.println危害啊,请看下面的代码:
public class BadCode {
public static void calculationWithPrint(){
double someValue = 0D;
for (int i = 0; i <10000; i++) {
System.out.println(someValue = someValue + i);
}
}
public static void calculationWithOutPrint(){
double someValue = 0D;
for (int i = 0; i < 10000; i++) {
someValue = someValue + i;
}
}
public static void main(String [] n) {
BadCode.calculationWithPrint();
BadCode.calculationWithOutPrint();
}
}
从测试中可以发现,方法calculationWithOutPrint()执行用了0.001204秒,作为对比,方法calculationWithPrint()执行可是用了10.52秒。
要避免浪费CPU时间,最好的方法是引入像如下的包装方法:
public class BadCode {
public static final int DEBUG_MODE = 1;
public static final int PRODUCTION_MODE = 2;
public static void calculationWithPrint(int logMode){
double someValue = 0D;
for (int i = 0; i < 10000; i++) {
someValue = someValue + i;
myPrintMethod(logMode, someValue);
}
}
public static void myPrintMethod(int logMode, double value) {
if (logMode > BadCode.DEBUG_MODE) { return; }
System.out.println(value);
}
public static void main(String [] n) {
BadCode.calculationWithPrint(BadCode.PRODUCTION_MODE);
}
}
另外,字符串连接也是浪费CPU时间的一个大头,请看下面的示例代码:
public static void concatenateStrings(String startingString) {
for (int i = 0; i < 20; i++) {
startingString = startingString + startingString;
}
}
public static void concatenateStringsUsingStringBuffer(String startingString) {
StringBuffer sb = new StringBuffer();
sb.append(startingString);
for (int i = 0; i < 20; i++) {
sb.append(sb.toString());
}
}
在测试中可发现,使用StringBuffer的方法只用了0.01秒执行完毕,而使用连接的方法则用了0.08秒,选择显而易见了。
七、多关注GUI(用户界面)。再三强调,GUI对商业客户来说,与程序的功能及效率同等重要,GUI是一个成功程序的最基本部分,而很多IT经理往往都没注意到GUI的重要性。在现实生活中,许多公司可能为了节省开支,没有雇用那些有着设计“用户友好”界面丰富经验的网页设计者,此时Java开发者只能依赖他们自身的HTML基本功及在此领域有限的知识,结果,很多开发出来的程序都是“计算机友好”甚于“用户友好”。很少有开发者同时精通软件开发及GUI设计,如果你在公司“不幸”被分配负责程序界面,就应该遵守下面三条原则:
1、 不要再发明一次轮子,即不做无用功。现有的程序可能会有类似的界面需求。
2、 先创建一个原型。这是非常重要一步,用户一般想看到他们将使用的东西,而且可以先利用这个原型征求用户的意见,再慢慢修改成用户想要的样子。
3、 学会换位思考。换句话来说,就是从用户的角度来审查程序的需求。举例来讲,一个汇总的窗口可以跨页或者不跨页,作为一个软件开发者,可能会倾向于不跨页,因为这样简单一些。但是,从用户的角度来看,可能不希望看到上百行数据都挤在同一页上。
八、文档需求不放松。每个商业需求都必须记录在案,这可能听上去像童话,似乎在现实生活中很难实现。而我们要做的是,不管开发时间多紧迫,不管最终期限多临近,对每个商业需求都必须记录在案。
九、单元测试、单元测试、单元测试。关于什么是单元测试的最好方法,在此不便细说,只是强调,单元测试一定要完成,这也是编程中最基本的原则。当然了,如果有人帮你做单元测试自然是最好,如果没有,就自己来做吧,当创建一个单元测试计划时,请遵守以下三条最基本的原则:
1、 先于编写类代码之前编写单元测试。
2、 记录单元测试中的代码注释。
3、 测试所有执行关键功能的公有方法,这里不是指set和get方法,除非它们是以自己独特方式执行set和get方法。
十、质量,而不是数量。有些时候因为产品问题、期限紧迫、或一些预料之外的事情,导致常常不能按时下班,但一般而言,公司不会因为雇员经常加班而对之表扬和奖励,公司只看重高质量的工作。如果遵守了前九条原则,你会发现自己写出的代码bug少且可维护性高,无形中质量提高了一大步。
- 浏览: 52746 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
啊哈小小勇:
找一个好老师,自己勤动手!
有理想的程序员必须知道的15件事 -
showzh:
...
hibernate 数据源配置汇总 (jdbc,jndi+dbcp, proxool ,c3p0) -
Frederic:
兄弟,callback是在spring中的!
hibernate中使用原生sql语句 -
fucktianya:
垃圾方法,还不如用callback呢
hibernate中使用原生sql语句 -
Frederic:
仅此而已 写道方法过时, 不推荐使用。那你推荐使用哪种方式使用 ...
hibernate中使用原生sql语句
Java开发者需坚守的十大基本准则
发表评论
-
充分使用HTML5特性进行搜索引擎优化(SEO)
2014-03-14 15:02 844随着越来越多的网站和应用采用HTML5方式编写,如何和海量信 ... -
Perl、PHP、ASP、JSP技术进行比较
2014-03-14 14:48 1373很多人在刚开始学 ... -
可预判的超链接打开方式
2012-08-26 20:51 1100不知道博友们有没有这么一种需求,或是一个隐性需求--“可预判的 ... -
eclipse启动出现 An internal error occurred during: "Refreshing external folders".
2012-08-16 15:20 2390这是一个eclipse的bug,如果各位遇到如下图情况 问题 ... -
开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
2013-08-28 21:55 1453首先借用有心人士的一张相当直观清晰的图来划分各种协议:以下是上 ... -
Java编程中“为了性能”要注意的几点
2012-04-06 00:10 10431. 尽量在合适的场合使用单例 使用单例可以 ... -
Jsp或JS获取用户来源
2012-03-05 13:32 1610Jsp或JS获取用户来源 问题描述 ... -
android实例收藏
2012-02-20 23:52 1169分享45个android实例源码 ... -
权限管理基本分类
2012-02-20 16:55 1650权限有三种最基本分类 1、登录权限 该账户是否有登 ... -
郁闷的win7 断电 +东芝笔记本L600-59R
2011-06-04 10:45 1665症状:断电后win7不能正常启动,修复黑屏,安全模式无法进入 ... -
有理想的程序员必须知道的15件事
2011-05-11 22:47 952作为程序员,要取 ... -
泄露你的JavaScript技术很烂的五个表现
2011-05-11 22:42 905Javascript在互联网上名声 ... -
javaee 操作数据库乱码
2011-03-03 11:35 1859检查你的数据库使用的是什么编码?上篇也有详细说明,这里 ... -
hibernate 数据源配置汇总 (jdbc,jndi+dbcp, proxool ,c3p0)
2011-03-03 11:32 4457汇总 Hibernate 与 jdbc,jndi+db ... -
java Context(上下文)释义
2011-02-20 16:53 14972最近学习中经常看到Context,没能明白中文含义,一 ... -
struts2 No result defined for action那些事
2011-02-19 21:47 1489注意:下面红色字体为关键部分。 问题: 兄弟们在使用str ... -
字符串操作集锦(更新中...)
2011-01-25 15:41 1027以下字符串的操作,多用于自己用jdbc写o/r mapping ... -
java 中聚合与组合以及has a、is a关系说明
2011-01-25 12:30 4919概念 聚合:表示两个对象之间是整体和部分的弱关系,部分的生 ... -
“切客”,未来之趋势
2010-11-03 09:16 980先来说说概念概念: ...
相关推荐
请随时记住。 有许多标准和实践准则可适用于Java开发者,但此处要说的,是每个Java开发者需坚守的基本原则。
有许多标准和实践准则可适用于Java开发者,但此处要说的,是每个Java开发者需坚守的基本原则。
有许多标准和实践准则可适用于Java开发者,但此处要说的,是每个Java开发者需坚守的基本原则,要想要开发出好的java实用程序,这些规则和建议将会对你终身受益哦
chromedriver-linux64-V124.0.6367.91稳定版
在官方的基础上改了检测头、导出onnx(适配tensorrt pro 项目)、测试demo等代码。 能够使用清华V2X数据集进行训练和测试。 https://www.bilibili.com/video/BV1Wd4y1G78M/?vd_source=0223c707743ff3013adaeff54aee3506 数据集来源:https://thudair.baai.ac.cn/index 基于Yolov7 tiny,加入了距离回归 模型没收敛完,随便试了下,所以预测有抖动 使用TRT加速,在AGX Xavier上推理大约4ms V2X使用tools/convertlabel2yolo.ipynb 进行数据集转换
基于STM32F101单片机设计Bluetooth Sentinel 主板硬件(原理图+PCB)工程文件,仅供学习设计参考。
【前端热门框架【vue框架】】——条件渲染和列表渲染的学习的秒杀方式 (2)
liba2ps1-4.14-bp155.4.9.aarch64
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
基于嵌入式
基于matlab实现关于语音信号声源定位DOA估计所用的一些传统算法.rar
sdk.config
海康威视DS-K1T342M人脸识别门禁机升级固件
2024-2030全球与中国太阳能发电机市场现状及未来发展趋势
毕业设计:基于springboot的中小企业财务管理系统(源码 + 数据库 + 说明文档) 2 开发技术简介 6 2.1 基于B/S结构开发 6 2.2 jsp语言简介 6 2.3MYSQL简介 6 2.4 eclipse工具 7 3 需求分析 7 3.1 可行性分析 7 3.1.1 经济可行性 7 3.1.2 技术可行性 7 3.1.3 操作可行性 7 3.2 功能需求分析 8 3.3 非功能需求分析 8 4 系统设计 9 4.1 数据库设计 9 4.2 系统模块总体设计 10 5 系统详细设计 10 5.1 后台登录页面 10 5.2 管理员信息 11 5.3 财务人员信息 11 5.4 资产负债 12 5.5 税收管理 12 6 系统测试 13 6.1 测试的目的 13 6.2 测试的方法 13 6.3 测试的重要性 14 6.4 测试内容 14 6.5 测试结果 14
python tkinter-08-盒子模型.ev4.rar
HAL 驱动库和 LL 驱动库函数说明 介绍各个函数的使用方法 包含HAL库和LL库 这个官网是PDF格式的 体积巨大 这个 WORD 格式的体积小巧 介绍 HAL 驱动库已经实现了适用于 PY32F0xx 系列芯片的一整套 APIs,这些 APIs 能够使应用程序与底层硬 件之间的交互更加简单、方便。 在 HAL 驱动库中用户能够调用的 APIs 可以分为两类:通用 APIs 和扩展 APIs。通用 APIs 为所有 PY32F0xx 系列芯片提供通用功能的驱动。扩展 APIs 则根据不同型号提供扩展功能的 APIs。 HAL 驱动库并不是基于 IP 所构建的,而是基于外设的特性和功能实现的。例如,USART 拥有 UART 和 USART 两种功能,每种功能都拥有一组独立的驱动程序来支持,并且它们的驱动程序是相互分离的。 HAL 驱动库函数的入口处均有断言函数,断言函数用来校验输入参数是否合法。这种校验方式提高了驱 动程序的健壮性。用户也可以使用断言函数来进行编写和调试应用程序。 HAL 驱动库提供的 APIs 均具有很高的可移植性,并且它们对用户屏蔽了 MCU 和底层硬
2024年全球电大提琴行业总体规模、主要企业国内外市场占有率及排名
Bug Bounty Tip - i春秋Self-XSS变废为宝的奇思妙想 i春秋技术分享,将self-xss利用扩大化,奇思妙想可以借鉴。