1. 程式人生 > >機房收費系統一些小Tips

機房收費系統一些小Tips

      做重構已經有一段時間了,在這段時間裡面學了很多新東西,感覺自己的雞窩做得越來越好了。這裡,寫下一些小Tips,記錄下一些自己感覺很有意思的東西。

     一,還是分層的問題

         在上下機加完模式後,總感覺很詭異,我的上下機是加完模式後的,第一次這麼做,還有點兒生疏,看了半天,才發現我上下機的邏輯居然在U層,如圖:

    三個類定義在了U層:

     

     然後在下機的時候呼叫:

    雖然能實現下機,但是具體的邏輯還是在U層裡面,因為我是在U層定義在U層引用的。想完這個,深感自己對分層的理解才剛剛開始唉~

      當自己不知道該把某塊東西放在哪層的時候,這時候要問自己:這塊程式碼是做什麼用的,更加貼近哪一層?


    二,常用類定義為Shared

         在D層,我們抽象了SqlHelper,加入了實體-datatable轉換類EntityConverter,雖然減少了連線資料庫,讀取資料庫,關閉資料庫和具體的錶轉換實體的細節問題,但是還是存在重複。例如,如每次執行sql語句,都要new個sqlHelper,不知不覺中,多了很多重複內容,以至於到了最後,又開始了copy的方法來new這些東西。其實,可以為要共享的過程或函式定義為shared或者更大方點兒,類也shared了,用的時候直接等就可以了。

        

    三,返回多個不同型別實體時,可以將所要返回的實體寫到引數裡面

            在使用實體作為返回值的時候,有時回有這樣的問題:比如,需要某個學生的充值資訊,顯示在窗體上的時候,要顯示充值教師的資訊(教師姓名,使用者名稱,級別等。),學生本人的充值資訊(金額,日期時間等。)。這兩種資訊我是寫在兩個實體中的。但是function只能返回一個實體,怎麼辦?

       先想想我們一起是怎麼辦的:在上一版機房中,我們是直接選擇兩各表的,然後返回一個表集。利用datatable可以返回兩個表的資訊。但是現在返回的是實體,然後有人就想,回去改實體,在一個實體中,加入另一個實體的欄位,雖然可以實現返回值的問題,但是不覺得冗餘太多了嗎?

     我們還有很多很溫柔的方法來實現。比如,將返回值隱含到引數裡面。

    例如:

    下機完成之後,需要返回學生的上下機資訊和學生部分基本資訊,如圖,引數和返回值正常寫:

      

      查完datatable之後,將一個datatable轉換為兩個實體集合:

 

 既然引數可以隱含到引數裡面,那麼,是不是可以再隱含一下,將function直接寫成sub? 童鞋們有興趣可以試試,感覺這樣去掉return其實挺好的,更加優化記憶體。

   四,解決實體欄位和表字段不一致的問題

          前段時間,有個小孩紙問完我datatable如何轉換為實體集合的原理後,感慨萬千:我的表字段和實體欄位不對應呀,還得去修改實體欄位,前面做好的程式都要改啦!其實,只要在select的時候,加上一個as,就可以解決這個欄位不一致的問題,具體為啥自己實踐下就明白了。例如:

   五,DataGridView類資料來源=多個實體集合 如何顯示問題

       在結賬的時候,遇到個充值資訊的顯示問題,要顯示如下資料:

   

   但是充值資訊的實體裡面根本沒有學號這個欄位,學號這個欄位只在基本資訊裡面才有,怎麼辦?當初想過利用隱含的返回值,返回兩個實體集合,然後將兩個實體集合都繫結到dataGridView上。但是沒有實驗了很久,沒有實現。後來想到了一個比較損的辦法,暫時解決了問題。

   還是利用as進行轉換,例如:

   

      這樣,臨時把學號欄位值存入實體的狀態這個屬性裡面,在學號顯示的時候,只需將dataPropertyName改為狀態就ok了。

   六,設定預設值

         在很多地方,為了減少程式碼量,一個很好的方法就是設定預設值,只需在特殊的情況下指明一下。

      目前感覺到設定預設值有兩個好處:1,只需對特殊的地方進行處理,一般地方使用預設值就可以了;

                                                               2,如上圖,在儲存過程中為變數設定預設值,當查出為NULL時,系統 會 自動返回預設值0,不用再拿到程式中去轉換了。

    另外,這裡還要補充下對Null值的處理:

     很多時候,我們用AVG(),或者是SUM()進行計算,結果出來後確實null值,如果放到程式裡面去處理,又覺得麻煩,這時候,我們也可以對這種情況使用。如圖:利用ISNull函式,可以很好的解決這一問題。

    

     七,使用資料庫的時間

            對 資料庫的時間的使用按照使用的位置可以分為兩個地方,一個是在程式碼裡:

在主窗體上顯示時間的地方,要用一個timmer迴圈讀取伺服器中時間,然後顯示。

另一個用到時間的地方就是在資料庫裡面:


           強烈建議改掉以前用now()什麼的讀取本機時間,然後寫回資料庫的習慣。