今天咱們要寫一個日曆表,用以存儲全部的節假日。java
雖然這個表設計的並非很妙。可是將就着繼續了。程序員
讓小弟把該表數據初始化3-5年的,結果一上午尚未出來,着急了,本身寫了一個初始化的工具。編程
分享出來。app
1 import java.util.Calendar; 2 3 4 public class CalendarApp { 5 6 7 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"}; 8 String [] workdays = new String[]{"2013-09-30"}; 9 10 public boolean isHoliday(int year, int month, int day) { 11 String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2); 12 for (String d : holidays) { 13 if(d.equals(date)) { 14 return true; 15 } 16 } 17 return false; 18 } 19 20 private String padding(int number, int length) { 21 String text = String.valueOf(number); 22 for (int i = length ; i > text.length(); i--) { 23 text = "0" + text; 24 } 25 return text; 26 } 27 28 public boolean isWorkDay(int year, int month, int day) { 29 String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2); 30 for (String d : workdays) { 31 if(d.equals(date)) { 32 return true; 33 } 34 } 35 return false; 36 } 37 38 public boolean isWeekend(int year, int month, int day) { 39 Calendar cal = Calendar.getInstance(); 40 cal.set(Calendar.YEAR, year); 41 cal.set(Calendar.MONTH, month); 42 cal.set(Calendar.DATE, day); 43 int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); 44 return dayOfWeek > 4; 45 } 46 47 private boolean isDate(int year, int month, int day) { 48 Calendar cal = Calendar.getInstance(); 49 cal.set(Calendar.YEAR, year); 50 cal.set(Calendar.MONTH, month); 51 cal.set(Calendar.DATE, day); 52 int y = cal.get(Calendar.YEAR); 53 int m = cal.get(Calendar.MONTH); 54 int d = cal.get(Calendar.DATE); 55 return year == y && month == m && day == d; 56 } 57 58 public boolean calc(int year, int month, int day) { 59 String date = padding(year,4) +"-"+ padding((month+1), 2) +"-" + padding(day, 2); 60 System.out.println(date); 61 if(isWeekend(year, month, day) ){ 62 if(isWorkDay(year, month, day)){ 63 return false; 64 } 65 return true; 66 } else { 67 if(isHoliday(year, month, day) ){ 68 return true; 69 } 70 return false; 71 } 72 } 73 74 public static void main(String[] args) { 75 CalendarApp app = new CalendarApp(); 76 for (int year = 2013; year < 2016; year ++) { 77 for (int month = 9;month<10;month++) { 78 for (int day=1; day<32;day++) { 79 if (app.isDate(year,month, day)) { 80 boolean vacation = app.calc(year, month, day); 81 CompanyCalendar comCal = new CompanyCalendar(year, month, day, vacation); 82 comCal.save(); 83 } 84 } 85 } 86 } 87 } 88 }
這段代碼大概用了20分鐘寫完的。工具
可是好幾我的在寫這個功能的時候用的時間都要遠遠長於這個時間。測試
那麼咱們就來分析一下爲何你們寫代碼會慢。網站
1. 整理思路搜索引擎
有這樣一種工做方式:在寫代碼以前先要整理思路,在紙上描來畫去,當思路清晰以後纔開始寫代碼。編碼
這個思考的過程佔去了一部分時間。spa
(難道這個時間能夠節省嗎?慢慢來,往下看。)
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
毋庸置疑,若是寫完了代碼有一個事物會告訴你正確了——那它必定是自動測試工具。
寫測試吧。磨刀不誤砍柴工。