2012年9月27日 星期四

[狗大便] 不容易被發現哪裡出問題的問題 (2) - Int to StringFormat

只要扯到字串,事情就會變得很麻煩。
有學過C就知道,我們看到的字串(string)都是由一組字元(char)陣列組合而成的,而字串最後還有一個'/0'的符號作為字串的結尾。至於要怎麼去操作字串,加大或縮小,複製或貼上,都得用控制陣列的index和動態記憶體配置來實現,而在約耳的書裡也提到,用程式來調配記憶體是最麻煩的一件事。你就知道以前在搞字串的時候有多麻煩。

然而,現在許多高階語言(.NET, Java, ....等)都有字串的原生資料類別,還有武功高強的virtual mechine在OS之上、程式碼之下運作。
那真是一項偉大的發明。不僅減少了開發人員許多麻煩,讓開發應用程式的人越來越不需要考慮太多字元與字元間和記憶體的問題,同時也減少了開發人員靈活動腦的機會(越來越笨囉)


總而言之,這次的問題就是跟字串有關。我相信這雖然似乎在我的部落格中是第一篇和字串有關而且容易debug沒留意到的問題,但不會是最後一篇。因為字串太麻煩了。


--廢話分隔線--


一般人的邏輯裡沒有什麼"整數"和"字串"之間的分別,嘴巴裡講出來的數字能加能減能排序都非常的直覺。但是在寫程式的時候,編輯器可沒這麼聰明。一開始宣告他是哪一種資料型態(data type),它就是該型態,沒給它做特別的動作的話,它就不會變態 (喂)。

今天的問題是什麼呢?反正就是跟資料型態有關。

需求:
我希望在開一張新訂單的時候,訂單編號能夠由系統自己產生,格式為兩位數的西元年份加三位數該年度的訂單數量+1,中間用dash隔開(yy-ccc),如:12-001

聽起來很容易吧?而且需求也非常的明確,應該是不會有什麼大問題?
問題都藏在開發者內心的空隙,也就是粗心啦!

這個簡單的需求分了兩部分:兩位數的西元年份和三位數的訂單數量。我們一個一個來看。

1. 西元年份
.NET的DateTime直接呼叫Now,就會自己回傳本機的系統時間。我們取其中的年(預設為西元年),再取後兩位,就可以得到我們要的部份。
想法很簡單,但是那是聰明如我們才這麼覺得。沒做什麼特別的編程,程式是不會做任何跳躍式的思考的。所以,我們在中間還得再考慮資料型態的問題。

直接用DateTime.Now,取出來的系統時間,資料型態為DateTime。
再拿其中的年,可以得到以int來表示的西元年。
我們要拿西元年的後兩位,必須先把取得的int西元年用ToString()轉成字串以後,再用Substring(2, 2)來取後兩位。
看見沒有?短短一個「兩位數的西元年份」,做了幾次的轉型?串起來的結果就像這樣…

  string strYear = DateTime.Now.Year.ToString().Substring(2, 2);

不過這個問題倒還好。反正中間如果轉型沒轉好,在IDE那裡按下play的時候也不會給過。


2. 訂單數量
訂單數量要從Database裡去得到明確的值,所以現在已假設有一個DAO能回傳正確的當年度訂單數量,我們得到這個值之後再加一,就是我們要的值了。


  string strCount = (dao.getCount() + 1).ToString();


就這麼簡單,就把我們要的搞定了。

事情結束了嗎?



--還沒結束的分隔線--




還沒結束是因為輸出並不如預期。

  string strOutput = strYear + "-" + strCount;

就這樣輸出,結果會變成 12-1, 12-2, 12-3...
關鍵就在於數量被轉成字串的時候沒有特別給他既定的格式,所以直接輸出成沒有補0或其它格式的樣子。

數量被轉成字串之後也來不及再做轉型了。你可能會直覺地去改輸出格式:
  string strOutput = string.Format("{0:00}-{1:000}", strYear, strCount);
輸出結果還是12-1, 12-2, 12-3...
因為字串資料不會因為在format裡面給了哪些pattern而格式特別的變化。


所以,要輸出像是12-001, 12-002這樣的組合字串,要嘛就是在數量被轉成字串之前就先給他pattern
  string strCount = string.Format("0:000", dao.getCount() + 1);
要嘛就是最後輸出的時候再轉成字串。
  int iCount = dao.getCount() + 1;
  string strOutput = string.Format("{0}-{1:000}", strYear, iCount);


這個東西不難,寫過點.NET的學生其實都會。就怕常常一時粗心,這樣的問題卡了三、四百塊

2012年9月14日 星期五

[ 感 ] 從使用者的角度看軟體開發 - 胡言亂語篇


這幾天我購入了一隻$ony的高階智慧型手機,用到現在雖然還不到一個月,但整體來說還算滿意。

開始使用了智慧型手機,就開始關注「它能為我做什麼?」的問題。一夕之間,我從一個才疏學淺的軟體開發人員變成使用者。開始以使用者的角度來看軟體。




身為一個窮酸的宅宅,平常上班和在家的時間都接觸得到網路,隨時隨地使用網路的需求就沒這麼急迫,所以就沒有再加上吃到飽。簡單來說,我等於是帶著一台可以放在口袋裡的、而且可以打電話但是沒網路的電腦在身上

在這種條件之下,我要用它來做什麼呢?

打電動?這種需求我曾經和內人討論過:用潮機在公開場合打電動到底算潮還算宅?就算機器拿得再潮,做的事情還是跟宅宅無異,而要打電動打得盡興應該還有更專業的機器才對…
老子才不要變成那樣!要打我也要打高級遊戲!

聽音樂?....雖然我喜歡聽音樂,而且喜好廣泛,但是還是希望在一個人(?)的時候保持內心的沉靜。

看電視? 嗯,我喜歡看日本動畫,但是我不想在搭車的時候暴露這個個人特色XD。而且我也不喜歡在走路的時候邊走邊看畫面,這會讓我容易跌倒或撞到東西。

    謎之音:這個傢伙有夠難搞的。
    我也覺得。


我仔細想像自己需要這台「隨身電腦」可以幫我完成哪些事。
憑良心說,會真正使用手機"do something"的時間實在是不太多。上班和在家都有網路可以用,沒必要上個facebook也要用手機來上,而騎機車的時候又不好拿手機出來(我很重視在交通上的專注),能用手機的時間,說穿了就他媽的只有在搭捷運或在外面等人的時候。
所以其實使用的時間上是很零零碎碎的,不會特別把一天中挖一塊時間特別來使用手機在做什麼事。
  1. 基本手機功能:打電話、傳簡訊、照相.....之類的
  2. 記帳:以前在記帳的時候總是因為要再拿個筆和小本子出來記,久了就嫌麻煩而放棄。希望能夠透過手機來完成這個目的。
  3. 行事曆:出了社會以後,最重要的就是我學生時期所最缺乏的時間觀念。事情一件一件來,什麼事情需要在什麼時間內完成或交辦,這些在個人時間管理上都是很重要的課題。在電腦上我可以用Google Calendar來完成這件事,希望在手機上不只能達到同樣的目的,同時能夠和Google Calendar維持同步。
  4. 筆記:想到什麼記什麼,畢竟靈感稍縱即逝。可能利用一點瑣碎的時間把工作中該仔細思考的流程圖或關聯圖設計好,以利接下來工作的進行;或是記下什麼東西要買,什麼事情確定要做,做一個checklist,看到一個就點掉一個這樣。
  5. 優化OS:電源管理、存取空間管理.....等






好的,本篇的重點不在"我需要什麼"(至少現在不是),而是,我從一個身兼分析設計和時程管理的半調子軟體開發人員,切換角色成一個「使用者」。列出我的需求,就像寫Story一樣。只差沒有一個開發團隊可以為我量身打造我所想要的軟體。
於是,我根據我的需求上Google Play找一些有的沒的。看起來像是能滿足我需求的軟體就都把它載下來玩一玩,不喜歡、不好用就解除安裝、真的很喜歡就會考慮付費買專業版。


在我沉浸在這種輪迴時才驚覺一件事:軟體業一樣是相當現實殘酷的。被我扔掉的軟體,背後一定也是一個(或一組)開發人員花了不知道多少時間才做出來的,而我用十分鐘就把它刪掉了。
而我們立場轉換一下,變成開發軟體的開發商。如果不是專案的客戶沒有足夠的選擇空間,我們是不是還能夠從他們手上拿到足夠養活自己還仍有盈餘的費用?

這樣講雖然不夠客觀,畢竟專案客戶在選擇開發商的時候不只看軟體,還會看專案的時程和管理方法,能夠滿足客戶需求並且在限時內完成,就是好的開發商。但是,只要考慮到使用者在操作軟體時的感受,我們這種軟體工程師是不是還能很大聲地跟他們講「你們就這樣這樣做就可以達到目的了!」只要使用者的選擇夠多,我們產出來的軟體是不是還能在萬軍之中騷到敵將的癢處?
所以,使用者介面的操作設計和基本功能的品質是何其重要?尤其在競爭激烈的環境-行動裝置的APP、包起來在外面賣的軟體或遊戲……等-使用者只要再另外花三分鐘,就可能會找到比你做出來的還要更優秀的軟體。

這告訴我們什麼?無法掌握使用者操作軟體功能的感受,就等著看使用者的臉色喝西北風。



約耳在他的blog裡提到(現在有中文版的書,以下非原文):
暢銷的軟體,應該要簡單容易上手,而且功能穩定品質良好。這些條件必須快速做到定位,以取得市場的佔有率。
千萬不要畫了一個超大大餅,然後因為時程壓力把做到一半功能不完整的東西扔出來讓使用者玩,那只會讓人感到這個軟體爛到令人印象深刻。

偉哉約耳大大,他在好多年前講的東西,現在在我心中得到了印證。
至於另一本書的哪個資深的開發人員所強調的「快速開發以取得先機,讓市場先認識我們的軟體」,.....嗯,我只能說自我感覺太過良好。我記得講出這句話的資深開發人員,他們做出來的東西超爛的。




我積了好多主題沒有po....