中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

精益求精,抑或得過且過

  程序員面臨的最痛苦之事,莫過于修改舊代碼;如果還有比這更痛苦的,就是修改糟糕透頂,亂得一團糟的爛代碼。最近因為手底下一幫程序員都在忙,市場部正好又反饋過來一個要命的bug,一時手癢,就領下了這個任務。我們這個產品是針對教育行業(yè)的,它是在好幾年前開發(fā),然后不斷完善和維護。這些階段都是在我來到這家公司之前完成的。所以,我對于產品的代碼并不熟悉。

  原來的需求是假定客戶設置分數(shù)段時,不同的分數(shù)段有不同的有效分,對應著也就有不同的名次。這些數(shù)據(jù)都是經(jīng)過分析器分析獲得,并持久化到數(shù)據(jù)庫中。當我們需要生成學生報告時,再從數(shù)據(jù)庫中獲取,并將數(shù)據(jù)填充到iReport設置好的模板中,一個是二維表,一個是柱狀和曲線圖。

  現(xiàn)在,我們發(fā)現(xiàn)某些學校需要給不同的分數(shù)段設置完全相同的有效分,以及相同的名次。報告打印出來,二維表沒有錯,曲線圖卻出現(xiàn)了“缺斤少兩”的現(xiàn)象。例如設置五個分數(shù)段,卻可能只顯示了四條曲線。

  閱讀代碼,我明白了原因。在原來的實現(xiàn)中,由于默認不同分數(shù)段有不同名次,因此,在獲取這些分數(shù)段的值時,是將它們放入到一個Map<Subject, Map<Integer, Double>>中。這個Map是根據(jù)科目進行分類的,子Map的key值為Integer類型,其實就是分數(shù)段對應的名次,value則是設置的有效分。由于現(xiàn)在的名次存在重復,導致Map中的元素存在偏差。這就是五個分數(shù)段只顯示四條曲線的緣由。

  事實上,在我看到這樣的Map時,就明白這種“超級強大”的容器,事實上往往會成為壞代碼的泥沼。當我們將這樣的對象作為參數(shù),在方法之間傳來傳去的時候,會帶來諸多問題:
  1)性能影響。這種可能比較龐大的容器對象,有可能會形成性能瓶頸;
  2)強類型。雖然這里使用了泛型,但泛型類型卻使用了基本類型;
  3)封裝性不夠好。這樣的容器對象暴露了太多的數(shù)據(jù)細節(jié),且不利于為其定義職責行為。
  4)可讀性差。看到這樣的Map,你并不會在第一時間明白它到底存放了什么。
  5)可擴展性差:當這個Map作為方法的參數(shù)時,相當于這個參數(shù)沒有被對象化。如果擁有這個參數(shù)的方法被公開,且廣泛調用,一旦需要改變參數(shù),牽連到的代碼就會非常多。

  事實正是如此。當我在分析我們的遺留代碼時,發(fā)現(xiàn)很多地方都在重復獲取這個Map對象,并且這個Map對象也在多個方法之間傳遞。因為這種容器對象自身的缺陷,為我的bug修復帶來了很多阻礙。要解決這個Bug,就不能再將名次作為Map的key值。查看相關的數(shù)據(jù)表,事實上我們還給出了一個分數(shù)段的名稱。當名次和有效分存在重復的情況下,結合分數(shù)段名稱就能確定唯一值。因此,一個簡單地做法就是將Map的key修改為名次加名稱的組合,即將Integer修改為String。

  現(xiàn)在,我需要決策。如果希望一勞永逸,就應該摒棄這種Map的做法。我們應該利用封裝來實現(xiàn)這一目標。例如定義ValidScore和ValidScoreRange。后者相當于之前的Map<Integer, Double>。ValidScore則包含屬性:Rank, LineName, Score。事實上,ValidScoreRange正是ValidScore的集合。我們還可以在ValidScore和ValidScoreRange中定義許多與該領域相關的行為。通過這樣的封裝,問題會變得簡單許多。

  然而,思考良久,我卻放棄了這個符合OO原則的做法。原因在于,遺留代碼中使用Map<Subject, Map<Integer, Double>>的類和方法有很多,特別讓人煩惱的是在這些方法中,有很多還定義在某些公共類中,被系統(tǒng)的大多數(shù)Client所調用。例如這樣的代碼:

public static JFreeChart createEliteTotalChart(Grade grade, String partial,
ExamSet es, Student stu, Map subToStuTotalMap,
Map
<Subject, Map<Integer, Double>> subToValidScoreMap,
List subList,
long stuRank,
String[] validLineSeries,
double barWidth,Color barColor) {
if (subToStuTotalMap == null || subList == null) {
return null;
}
Color[] color
= {Color.RED,Color.BLUE,Color.GREEN,
Color.CYAN,Color.BLACK,Color.MAGENTA};
CategoryDataset[] dataset
= EIDatasetFactory.createEliteTotalDataset(
subToStuTotalMap, subToValidScoreMap, subList,validLineSeries);

  //......為清晰起見,其余代碼略
}

it知識庫精益求精,抑或得過且過,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 久久久久久久久久爱 | 二区中文| 国产精品视频一区二区三区不卡 | 97国产爽爽爽久久久 | 日韩久久久久久 | 日韩欧美网 | 91久久精品日日躁夜夜躁国产 | 免费午夜电影 | 日韩1区| 免费一级做a爰片久久毛片潮喷 | 日本久草视频 | 日韩免费av一区二区 | 依人成人| 久久久久久国产精品久久 | 日本成人在线播放 | 欧美天堂在线观看 | 四虎影院在线免费观看 | 日本一区二区高清不卡 | 国产精品久久久久久 | 午夜免费观看体验区 | 成人免费视频观看 | 久久福利网站 | 精品国产第一区二区三区 | 成人欧美一区二区三区黑人孕妇 | 在线啊v| 国产精品一区二区在线 | 亚洲成人黄色 | 久久久国产亚洲精品 | 国产精品久久久久一区二区三区 | 亚洲第一成年免费网站 | www.中文字幕.com| 久久夜夜| 韩日在线视频 | 亚洲网站在线播放 | 日日夜夜狠狠操 | 国产丝袜一区二区三区免费视频 | 久在线 | 中文字幕视频网 | 尤物在线| 欧美激情久久久 | 精品99在线 |