人物設定:
小菜:具備基礎的計算機理論知識,剛畢業(yè)參加工作初斑,從事Java開發(fā)辛润,對技術很有熱情,凡事愛問個為什么见秤,但是缺少項目實戰(zhàn)經(jīng)驗砂竖,需要進一步培養(yǎng)。
老鳥:高級Java開發(fā)鹃答,在工作流方面有較多研究乎澄,在編程的過程中走過很多彎路,踩過很多坑之后测摔,愿意把自己的經(jīng)驗置济、教訓分享給大家解恰。
小菜加入公司之后,就參與一個OA系統(tǒng)的請假業(yè)務的開發(fā)浙于,業(yè)務場景如下:
請假人填報請假類型护盈、請假天數(shù)、開始時間羞酗、請假原因后腐宋,根據(jù)請假天數(shù),小于等于2天由本部門部門經(jīng)理審批檀轨,大于2天由人事部門審批胸竞,審批拒絕后退回到填報人修改,通過后請假生效参萄,在請假到期后卫枝,請假人及時在系統(tǒng)中辦理銷假。
小菜拿到需求后讹挎,二話不說就開始寫代碼了校赤,首先定義個請假實體
ID,userId(請假人)淤袜,days(請假天數(shù))痒谴,startDate(開始時間),reason(請假原因)铡羡,vacationType(請假類型)
然后編寫了請假申請的頁面积蔚,部門經(jīng)理審批、人事部門審批烦周,辦理銷假的頁面尽爆;一天過去了,小菜做得很有成就感读慎,這樣明天再完善漱贱,測試一下就應該差不多了。
快到下班的時候夭委,小菜很自信的通過svn提交了自己的代碼幅狮,看來今天不用加班了。這時老鳥從小菜身旁走過株灸,問了下小菜今天的工作崇摄,小菜說今天做了個請假流程,定義了實體慌烧,編寫了頁面逐抑,完成基本的CURD操作,明天再努力一把屹蚊,爭取做完厕氨。老鳥笑道:小伙子效率挺高的嗎进每,讓我看看你的代碼。小菜拿過自己電腦命斧,熟練的打開了intellij田晚,黑色的主題色立馬讓桌面顯得高達上。老鳥看著代碼国葬,臉上的笑容慢慢收斂肉瓦,眉頭緊鎖,程序員特有專注的表情在他臉上蔓延胃惜。旁邊的小菜也跟著認真緊張起來。
5分鐘后哪雕,老鳥轉(zhuǎn)向小菜船殉,問道
- 請假人能隨時修改請假信息嗎?比如我請假2天斯嚎,請假審批通過后利虫,我能改成10天嗎?
- 怎么確定是由部門經(jīng)理審批堡僻、還是人事部門審批糠惫?
- 部門經(jīng)理、人事部如何獲取待辦钉疫?
- 審批人拒絕后請假人怎么修改硼讽?
一連串的問題,問的小菜有點不知所措牲阁,果然不愧是老鳥固阁,一下子就問到問題的關鍵。小菜略微尷尬的回答:“這個問題我還沒想好城菊,我打算明天邊做邊想备燃,不過我……”×杌#“你最好要改掉邊做邊想的毛病”并齐,不等小菜說完,老鳥打斷了他客税,“編程需要抽象性思維况褪、全局性思維,當你拿到一個需求或者碰到一個問題的時候霎挟,首先是要進行充分的思考窝剖,理解問題的本質(zhì),而不是倉促的動手酥夭,倉促編程的結(jié)果是設計缺少完整性和連貫性赐纱,后期會面臨大概率的返工脊奋,還有編程不是代碼越多越好,也不是越快越好疙描,而是又快又好诚隙,編程就像寫作,不只是自己看懂起胰,也要讓別人看懂久又,你的代碼還有很多可以精簡的地方”。小菜認真地聽著效五,很肯定地“嗯”了一聲地消,若有所思的點點頭,心里想到畏妖,要是拿到需求的時候能請教下老鳥就好了脉执。
“你剛才說,不過什么”戒劫,老鳥接著問道半夷。“不過我剛想到一個解決辦法迅细,就是在請假實體上新增一個字段state巫橄,用于標識不同流程狀態(tài),然后根據(jù)不同的狀態(tài)茵典,限制表單是不是可以編輯”湘换,說完,小菜拿起筆在紙上寫了起來敬尺。
0=草稿狀態(tài)枚尼;填報人可編輯,可提交
1=審批中砂吞;部門經(jīng)理審批署恍,填報人只讀
2=審批中;人事部門審批蜻直,填報人只讀
3=審批退回盯质;填報人可編輯,可提交
4=審批結(jié)束概而;填報人只讀
小菜寫完后呼巷,看了看老鳥,他的表情不像先前那么嚴肅赎瑰,仿佛示意他說下去王悍,小菜接著說道:“在獲取待辦的時候,可以根據(jù)不同的狀態(tài)來識別是部門經(jīng)理的待辦還是人事部門的待辦”餐曼,
“那填報人的銷假待辦呢压储,如果現(xiàn)在需求變了鲜漩,大于2天小于10天的請假依然由人事部門審批,但是大于10天的請假人事部門審批后集惋,還需要總經(jīng)理審批孕似,該如何處理?”老鳥問道刮刑。
小菜又陷入沉思喉祭,看著那張紙,突然靈光一閃雷绢,拿起來在原來的那張紙又畫了起來:
0=草稿狀態(tài)泛烙;填報人可編輯,可提交
10=審批中翘紊;部門經(jīng)理審批胶惰,填報人只讀
20=審批中;人事部門審批霞溪,填報人只讀
30=審批中;總經(jīng)理審批(大于10天)中捆,填報人只讀
40=審批退回鸯匹;填報人可編輯,可提交
50=銷假泄伪;填報人銷假
60=審批結(jié)束殴蓬;填報人只讀
“加大狀態(tài)碼之間的間隔,這樣隨時便于插入新的節(jié)點蟋滴,可以應對流程的變化”染厅,小菜自豪地說道。
“這確實是一種解決流程問題的思路津函,很多業(yè)務在相對固定的業(yè)務流程中使用狀態(tài)標識的方式來做流程肖粮,但是在一些流程頻繁變化的業(yè)務中,這樣的處理方法卻不合適尔苦,這里面會存在一些問題涩馆,你能說說嗎?”
剛才在紙上寫的時候允坚,小菜已經(jīng)意識到這樣做似乎有些不妥魂那,正好借著這個問題,他說道:“最大的問題是稠项,業(yè)務流程變化總導致代碼的修改涯雅,還有就是,多一個節(jié)點就要多做一個界面展运,界面相似活逆,卻要通過Ctrl+C,Ctrl+V來操作”精刷。
“重要的兩點都說對了,你說的核心關鍵字是解耦
和復用
划乖,如何保證流程能夠隨需應變贬养,面對需求的變化,盡量少地去修改代碼琴庵,通過業(yè)務和流程盡可能地解耦误算,來達到代碼盡量地復用,這是流程需要重點考慮的問題迷殿《瘢”老鳥果然是老鳥,侃侃而談庆寺,專業(yè)術語一個個蹦出來蚊夫。
“業(yè)務表單在多個環(huán)節(jié)處理流轉(zhuǎn),從而使得業(yè)務得到自動化處理懦尝,這就是工作流知纷,其實類似的流程處理都可以用工作流來處理”,老鳥說道陵霉。
工作流琅轧?這個概念小菜還是第一次聽到,恨不得立馬百度一番踊挠,看看到底是個什么東西乍桂?
“交給你一個任務,晚上查查工作流的概念效床,建議用工作流把重新做一遍睹酌,會比現(xiàn)在要好多,我以前剛做類似業(yè)務的時候剩檀,和你一樣憋沿,也是用狀態(tài)標記業(yè)務狀態(tài),到后來狀態(tài)越來越多沪猴,程序內(nèi)部變得越來越臃腫卤妒,難以維護”,老鳥說著字币,仿佛從小菜的身上看到了當年的影子则披。
“但是我今天寫了一天,重寫的話怪可惜的洗出,能不能把這個做完士复,后面如果有新的類似需求再用工作流”,小菜想著今天的任務要推到重來,有些不情愿地說道阱洪。
“作為一個剛?cè)肼毜膯T工便贵,想盡快地做出成果,完成工作任務固然重要冗荸,但作為一個程序員承璃,必須要對自己要有嚴格的要求,要時刻想著有沒有更好的設計蚌本,有沒有更好的編碼實現(xiàn)盔粹,有沒有更好的算法提高系統(tǒng)性能,能不能通過自動化的工具來減少自己的重復工作程癌,這些對程序員未來的發(fā)展很重要舷嗡,所謂經(jīng)驗,就是由不斷踩坑不斷填坑的過程嵌莉,坑填多了进萄,總結(jié)多了,下次碰到坑就能繞過去锐峭,經(jīng)驗就漲了中鼠,如果只踩坑,不填坑沿癞,不總結(jié)就光漲工作年限兜蠕,如果我現(xiàn)在告訴你前面有坑,你又什么要跳進去抛寝?,我見過很多程序員曙旭,有的工作了幾年盗舰,和畢業(yè)相比沒什么長進,有的短短一年就比有三年工作經(jīng)驗的進步快桂躏,這正是對自我嚴格要求钻趋,對新技術保持足夠的熱枕,并勇于實踐剂习÷唬”老鳥語重心長地說道。
“好的鳞绕,我晚上就看工作流”失仁,停了老鳥一席話,小菜的戰(zhàn)斗力又回來们何。
老鳥看看了時間萄焦,不自覺已經(jīng)和小菜談了一個多小時,收拾了下,和收獲滿滿的小菜下班了拂封。
“要是拿到需求多問一下茬射,多研究思考下,說不定今天的工作就不用白做了” 小菜想到冒签。
下篇文章談談如果自己實現(xiàn)一個工作流在抛,應該如何設計并實現(xiàn)。
向《大話設計模式》致敬萧恕。歡迎訪問我的網(wǎng)站
JavaCode:http://code.admineap.com
AdminEAP:http://www.admineap.com