[習題]ASP.NET的 簡易投票區 #3 -- 程式可以寫(改)得更好

第一個投票的範例,還有很多的改善空間。
我們一起討論看看。

是否有哪些地方可以改善得更好?





有一位朋友一直默默地在給我建議,

      不管是我的書本內容、Blog上的程式碼.....該如何改進?  每一次都因為他的指導,讓我更進步了。

 

不瞞各位說:前兩篇文章還是有缺失的,我們以第一個投票範例來說明好了

      (請看:[習題]ASP.NET的 簡易投票區 #1 -- 長條圖(繪製圖表)

 

 

 

缺失一:  採用這樣的資料表,第一次辦投票時,必須新增一筆記錄,

          讓所有候選人的「得票數」都歸零。

否則第一次執行會出錯。

   資料存放的樣子如下圖。

我的設計方法,是「每舉辦一次投票」當作一列記錄!

不然的話,就要寫一段判別式去處理,「如果」每一欄都是null值,就必須新增一筆歸零的紀錄。

 

 

缺失二:程式的執行效率不彰。

在第一個範例裡面,我們原本的寫法。

        For i As Integer = 0 To (RadioButtonList1.Items.Count - 1)

            If RadioButtonList1.Items(i).Selected Then

                '--- 處理投票動作的 ADO.NET程式 (很長,在此省略)
                Exit For   '--完成後,脫離 For迴圈
            End If

       Next

 

如果改成下面這樣,會有何變化?

        For i As Integer = 0 To (RadioButtonList1.Items.Count - 1)

            If Not RadioButtonList1.Items(i).Selected Then
                Continue For   '--執行 For迴圈的下一輪
            End If

            '--- 處理投票動作的 ADO.NET程式 (很長,在此省略)
            Exit For   '--完成後,脫離 For迴圈

       Next

因為第一個範例,是「單選」的投票。如果透過 For迴圈一個接一個的檢查,勢必浪費時間。

所以我寫了 Exit For,一旦投票成功,後續的選項就不需要再檢查了。(因為一人只能投一票)

上述的作法,跟原本的作法,各位可以比較一下,多少還是有差異的。

至少上面的新寫法,可讀性高得多。

 

 

缺失三:SQL指令的部份。

原本第一個範例的程式,事先撈出每一個候選人的得票數(Select指令)

然後把得票者的「票數加一」,回寫到DB裡面(Update指令)。......請看下面「灰底」的字,作了兩次資料存取的動作!

上述這兩個動作,可以簡化成一句:(改善後,請看紅字部份)

            '************************************************
            Dim Conn As New SqlConnection(WebConfigurationManager.ConnectionStrings("testConnectionString").ConnectionString)
            Conn.Open()   '---- 連結DB

            '--比較爛的寫法--
            'Dim dr As SqlDataReader = Nothing
            'Dim cmd As SqlCommand = New SqlCommand("select top 1 * from Vote_1 order by id DESC", Conn)
            'dr = cmd.ExecuteReader()   '---- 執行SQL指令,取出每一位候選人的得票數
            'dr.Read()
            'Dim vote_no As Integer = dr.Item(i + 1)

            'If Not (dr Is Nothing) Then
            '    cmd.Cancel()
            '    dr.Close()
            'End If

            'Dim Update_SQLstr As String = "Update Vote_1 set vote_" & (i + 1) & " = " & (vote_no + 1)

            '-- 比較好的寫法,一行就改進了! --
            Dim Update_SQLstr As String = "Update Vote_1 set vote_" & (i + 1) & " = vote_" & i & " + 1 where id in (select top 1 id from vote_1 order by id DESC)"

            Dim cmd_vote As SqlCommand = New SqlCommand(Update_SQLstr, Conn)
            cmd_vote.ExecuteNonQuery()
                Conn.Close()
                Conn.Dispose() 
            '************************************************

 上述的紅字,採用的SQL寫法是「update 資料表 Set 欄位A = 欄位A+1

 

 

缺失四:投票完成後的「長條圖」,"寬度"可能過長,畫面不美觀。

原本的作法,是把圖片的寬度(width)依照得票數來延長。

如果一個候選人,得票一萬。.......我的天啊!那麼一張「寬度一萬」的圖片,會把這個網頁撐開~~變得很醜很醜!

該怎麼改進呢?

           本來想寫在書裡面,日後才公開的。     今天被抓包了,只好寫出來....哈哈~)

我的作法是:計算每一個候選人「得票率(%)」。    

      個人得票數 / 總投票數 = 得票率(%)

      這個數學公式,小學生就會了。

 

因為改成%比例,所以大家的得票率就算是80%、10%、 5%.......。

把它放進圖片的寬度裡面,也不會出現圖片過長的缺失了。

例如: <img src="圖片1.gif" width="(得票率% * 100) * 100">這樣的寫法。     黃底的部份,可以依照實際狀況修改。

 

 

缺失五、前兩篇文章的範例,目前都預設「一次只進行一份投票」

如果要改成一次進行多筆投票也不難啦。  各位動動腦筋就能解了

 

 

 

 =========================================================================

本範例與完整說明,已經改寫成書本內的文章,

    並集結出書,收錄 在「[新書上市]ASP.NET專題實務 II(下集):範例應用與4.0新功能

 =========================================================================

 

講完了,

程式不光是會跑而已。    真的要改進、要精簡、要更順暢地執行......那是一門永無止盡的功夫。

最好的方法有兩個:

    第一、隔一陣子再來回頭看看,因為自己有進步了,回頭看以前寫的程式,就會有很大的修改空間。

    第二、請別人看。透過不同的思維,來思考同一件事,就會有討論與進步的空間囉。

 

 

這一連串的投票程式,最後有一個範例給大家參考。

就算看不懂,應該也能自己安裝起來用。....[習題]ASP.NET的 簡易投票區 #4 -- 自動化投票區!!

 

 本系列的「投票區」範例,C#請由此下載:[習題][下載]ASP.NET的 簡易投票區 #5 --C#範例下載

 

 

 

 

 

 

 

 

 今日值班正妹,白歆惠

      這裡有酒商的發表會,白歆惠是主秀,有照片---- http://wine.u-car.com.tw/winedetail.asp?articleid=99

 

我將思想傳授他人, 他人之所得,亦無損於我之所有;

猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson

線上課程教學,遠距教學 (Web Form 約51hr)  https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015

線上課程教學,遠距教學 (ASP.NET MVC 約75~88hr)  https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab

ASP.NET MVC線上課程 第一天 免費看 (5.5小時) 

寫信給我,不要私訊 --  mis2000lab (at) yahoo.com.台灣  或  school (at) mis2000lab.net


ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。 

................   facebook社團   https://www.facebook.com/mis2000lab   ......................

................  YouTube (ASP.NET) 線上教學影片  https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/

 

Blog文章 "附的範例" 無法下載,請看 這裡 ...... https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download

請看我們的「售後服務」範圍(嚴格認定)

...................................................................................................................................................... 

[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講

事先錄製好的影片,並非上課時側錄!   觀看影片時,有如我「一對一」跟您面對面講課

 

ASP.NET MVC 5 線上教學

         累積時數約 75~ 88小時...... 第一天(5.5小時)完整內容,"免費"讓您評估