今天我们要写一个日历表,用以存储所有的节假日。

虽然这个表设计的并不是很妙。但是将就着继续了。

让小弟把该表数据初始化3-5年的,结果一上午还没有出来,着急了,自己写了一个初始化的工具。

分享出来。

  1. import java.util.Calendar;
  2.  
  3. public class CalendarApp {
  4.  
  5. String [] holidays = new String[]{"2013-10-01","2013-10-02","2013-10-03","2013-10-04", "2014-10-01","2014-10-02","2014-10-03","2014-10-04"};
  6. String [] workdays = new String[]{"2013-09-30"};
  7.  
  8. public boolean isHoliday(int year, int month, int day) {
  9. String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2);
  10. for (String d : holidays) {
  11. if(d.equals(date)) {
  12. return true;
  13. }
  14. }
  15. return false;
  16. }
  17.  
  18. private String padding(int number, int length) {
  19. String text = String.valueOf(number);
  20. for (int i = length ; i > text.length(); i--) {
  21. text = "0" + text;
  22. }
  23. return text;
  24. }
  25.  
  26. public boolean isWorkDay(int year, int month, int day) {
  27. String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2);
  28. for (String d : workdays) {
  29. if(d.equals(date)) {
  30. return true;
  31. }
  32. }
  33. return false;
  34. }
  35.  
  36. public boolean isWeekend(int year, int month, int day) {
  37. Calendar cal = Calendar.getInstance();
  38. cal.set(Calendar.YEAR, year);
  39. cal.set(Calendar.MONTH, month);
  40. cal.set(Calendar.DATE, day);
  41. int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
  42. return dayOfWeek > 4;
  43. }
  44.  
  45. private boolean isDate(int year, int month, int day) {
  46. Calendar cal = Calendar.getInstance();
  47. cal.set(Calendar.YEAR, year);
  48. cal.set(Calendar.MONTH, month);
  49. cal.set(Calendar.DATE, day);
  50. int y = cal.get(Calendar.YEAR);
  51. int m = cal.get(Calendar.MONTH);
  52. int d = cal.get(Calendar.DATE);
  53. return year == y && month == m && day == d;
  54. }
  55.  
  56. public boolean calc(int year, int month, int day) {
  57. String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2);
  58. System.out.println(date);
  59. if(isWeekend(year, month, day) ){
  60. if(isWorkDay(year, month, day)){
  61. return false;
  62. }
  63. return true;
  64. } else {
  65. if(isHoliday(year, month, day) ){
  66. return true;
  67. }
  68. return false;
  69. }
  70. }
  71.  
  72. public static void main(String[] args) {
  73. CalendarApp app = new CalendarApp();
  74. for (int year = 2013; year < 2016; year ++) {
  75. for (int month = 9;month<10;month++) {
  76. for (int day=1; day<32;day++) {
  77. if (app.isDate(year,month, day)) {
  78. boolean vacation = app.calc(year, month, day);
  79. CompanyCalendar comCal = new CompanyCalendar(year, month, day, vacation);
  80. comCal.save();
  81. }
  82. }
  83. }
  84. }
  85. }
  86. }

这段代码大概用了20分钟写完的。

但是好几个人在写这个功能的时候用的时间都要远远长于这个时间。

那么我们就来分析一下为什么大家写代码会慢。

1. 整理思路

有这样一种工作方式:在写代码之前先要整理思路,在纸上描来画去,当思路清晰之后才开始写代码。

这个思考的过程占去了一部分时间。

(难道这个时间可以节省吗?慢慢来,往下看。)

2. 敲击键盘的方法

不熟悉键盘,不熟悉IDE,都是效率的杀手。写的时候还要自己输入Tab或者空格来对齐。

这些都会造成时间的浪费。

(这也太狗血了吧。不过的确很现实)

3. 不熟悉API

由于对于API的熟悉程度不够,有些东西要重新发明轮子,有些东西要绕弯路,这些也是时间浪费的元凶之一。

(这个的确是,但是这个得靠经验吧。嗯,差不多是这样,但是可以问啊。)

时间飞逝。

4. 方法总是在变

思路不固定,写的时候发现,这儿不好,那儿不行,这里要改进,那里要完善,于是,在反反复复中度过了很多时间。

(那发现错了还不改吗?得改,但是别改来改去又改回来,犹豫是大敌)

犹豫来犹豫去,时间就没了。

5. 寻找捷径

有些时候回想,会不会有捷径能够完成这个任务呢,也许真的有,但是如果知道有,马上可以用那就用。

如果不知道,或者需要查很久,那么何不先直接写下来一个比较笨的,然后再改进呢?

寻找捷径的时间比正常笨办法走过去的时间还要长。

6. 不会用搜索引擎

(别搞笑了,写代码,和搜索引擎有什么关系?)

哇哦,那你不会的时候怎么办?是不是要搜索。(哦)

可是你输入的是什么关键词?你得到的答案有多少是可用的,又有多少页面给出了答案了呢?

宝贵的时间就在低效的搜索中度过了。

7. 不会Debug

不会Debug,断点设置了一大堆,但是没有几个是有用的,结果每次执行都要被打断,打断再打断。

还不如插个Log快呢。

时间就这么滑过去了。

8. 不会用测试

不会测试,采用System.out.println然后肉眼观察。

其实,JUnit一个TestCase可能就搞定了。

而且在跟踪的时候不会用Log,输出的内容总是不在点上。

很多时间就不过去了。

宝贵的时间就这么流逝了。

这就是你写代码变慢的几个常见的原因。

那么怎么解决呢? 好的,我们来看看怎么才能够加快写代码的速度。

1. 去掉纸上设计

纸上设计的最大问题在于,你没办法校验设计的正确性。即使UML工具也没办法告诉你可能出现编译错误、逻辑错误。

那怎么办?答案就是去掉纸上设计。难道一点设计都没有写代码能够可靠吗?

那如果你听过极限编程(XP)那你就一定会知道,有那么一小撮人,写代码真的没有设计。

没有设计听起来天方夜谭。实际上并不是没有设计,而是进行最简单的设计,简单的模型,就开始编码,让IDE告诉程序员,

哪个地方编译不通过,哪个地方逻辑复杂度偏高,哪里会出现重复...

然后利用重构工具,将这些代码一一改过来。

逐步的就形成了正确的设计,这就是演进式设计。由于直接写的是可以工作的代码,所以,节省了大量的时间。

2. 熟记快捷键,利用IDE特性

   IDE会帮助你格式化代码,无需一个个的Tab去敲。

IDE会帮助你重构,而无需用检索 -> 替换,那有可能让你替换了不该替换的代码。

IDE会帮你快速定位代码,而不需要连续按动上下箭头,或者是拉动滚动条。

.一下就会告诉你这个对象可以有哪些变量供访问,哪些方法供调用。

3. 熟记常用API

常用的API需要熟记,这样才能够信手拈来。

比如,如何从一堆数据中过滤出来符合条件的数据,可能是采用lambda表达式最好。

如果无法用lambda表达式,那么试试CollectionUtils。

重新发明轮子可能不仅仅是造成时间浪费,有时候还会引入Bug。

4. 学会用搜索引擎

当你想要寻找捷径的时候,问问搜索引擎。

当然你得学会如何利用关键词提高搜索出答案的概率。你也得了解哪些网站会给你正确的答案,而哪些网站,问了也不会有下文。

最好的搜索引擎恐怕就是你的QQ群,微博上关注的某几个高手。但是高手未必有时间来回答你的问题,所以你可能会感到不好意思。

那么,一次生两次熟,问问高手如何思考,如何搜索,你就会逐步的学会。

不耻下问,上问也不必羞。

5. 改变思路,另辟蹊径

也许一个Java问题困惑了你很长时间,但是SQL可能马上就可以解决。

也许一个List需要很长的循环才能搞定的事情,Map只需要3-5行。

6. 停止Debug

我很少见到人用Debug工具很高效的。采用Debug Log,它不会让你的程序断,也不会让你在大脑里记忆很多东西。

它很连贯,但是要善于写Log。

7. Test Automation

毋庸置疑,如果写完了代码有一个事物会告诉你正确了——那它一定是自动测试工具。

写测试吧。磨刀不误砍柴工。

why you write code so slow.的更多相关文章

  1. Is your JDeveloper Slow? - It shouldn't be!(转)

    我的Jdeveloper随便点一个AM,code的显示速度和手指的反应速度跟不上,真的是着急,忍了好久,找到以下教程. 经过考虑,仅仅只是在jdev.conf(jdevbin/jdev/bin/jde ...

  2. Javascript Code Style Guide

    本指南采用的Airbnb发布的基于ES5的JavaScript Code Style. ES5 英文版:https://github.com/airbnb/javascript/tree/es5-de ...

  3. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  4. 【转】JavaScript 风格指南/编码规范(Airbnb公司版)

    原文转自:http://blog.jobbole.com/79484/ Airbnb 是一家位于美国旧金山的公司,本文是其内部的 JavaScript 风格指南/编码规范,在 Github 上有 11 ...

  5. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  6. [译]JavaScript规范-葵花宝典

    [译]JavaScript规范 译自:https://github.com/airbnb/javascript 类型 原始值: 相当于传值 string number boolean null und ...

  7. Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx  (windows下nginx安装.配置与使用) 四.Nginx之反向代理 五.Nginx之负载均衡  (负载均衡算法:nginx负载算法 up ...

  8. Nginx反向代理 负载均衡 页面缓存 URL重写及读写分离

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  9. Nginx的反相代理, 负载均衡

    转自 http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

随机推荐

  1. Windows 8.1 归档 —— Step 3 软件的选择与安装

    这里我将列举出一些 Windows 8.1 下实用的软件 --运行库-- 用精简版系统或者绿色版软件时,使用软件经常遇见的情况是“由于应用程序配置不正确,应用程序未能启动”,提示缺少dll文件等.大部 ...

  2. 如何评价微信小程序?

    这次我不站张小龙,虽然他说的「用完即走」的道理在,但我并不认为小程序会形成生态. (一) 仅仅从抽象场景上来讲,小程序当然很美好. 对开发者来说,不用费尽心思开发好多平台的 APP 了,不用考虑适配各 ...

  3. css3 选择器记

    css3 选择器 根据所获取页面中元素的不同,把css3选择器分为五大类: 基本选择器 层次选择器 伪类选择器 动态伪类选择器 目标伪类选择器 语言伪类选择器 UI元素状态伪类选择器 结构伪类选择器 ...

  4. Spring(3.2.3) - Beans(8): 基于 Annotation 的配置

    除了基于 XML 的配置外,Spring 也支持基于 Annotation 的配置.Spring 提供以下介个 Annotation 来标注 Spring Bean: @Component:标注一个普 ...

  5. django 学习-4 模板标签

    1.第一个标签是 if 标签 vim  learn/home.html <!DOCTYPE html><html><head>        <title&g ...

  6. Linux C编程--格式化I/O

    printf(格式控制,输入表列) 例:printf("%d%d",a,b) (1)d格式符:输出一个有符号的十进制整数 (2)c格式符:输出一个字符 (3)s格式符:输出一个字符 ...

  7. jFinal中报对应模型不存在的错误(The Table mapping of model: demo.User not exists)

    jFinal中报对应模型不存在的错误(The Table mapping of model: demo.User not exists) 贴出错误: java.lang.RuntimeExceptio ...

  8. iOS开发 中的代理实现

    iOS开发 中的代理实现 关于今天为什么要发这篇文字的原因:今天在和同事聊天的时候他跟我说项目中给他的block有时候不太能看的懂,让我尽量用代理写,好吧心累了,那就先从写个代理demo,防止以后他看 ...

  9. 【leetcode】365. Water and Jug Problem

    题目描述: You are given two jugs with capacities x and y litres. There is an infinite amount of water su ...

  10. Mac OS X安装OpenCV 3.1.0

    在我的上一篇文章“”中已经介绍了Linux下OpenCV的安装配置方法,在这里仅仅记录Mac上相对于Linux的一点点差异. 1. 安装依赖包 Mac上安装软件包使用的工具是brew,用此来替代Ubu ...