背單詞軟體-設計於實現

來源:互聯網
上載者:User

標籤:winform   style   blog   http   color   os   io   strong   ar   

2014-08-28

三層結構

  資料訪問層

  商務邏輯層

  表現層

資料結構

技術要點

經驗於教訓

參考

三層結構

 返回

三層結構優點:職責明確,易於理解,提高代碼重用率,便於改動。

三層結構缺點:上層依賴下層,下層修改,上層也得相應修改。

圖1 Solution

從圖1可知,軟體是三層結構,分別是表現層、商務邏輯層、資料訪問層。三層結構都是上層調用下層:表現層->商務邏輯層->資料訪問層,表現層->資料訪問層亦可。

資料訪問層 

資料訪問層提供對永久層資料(比如:檔案,資料庫)的簡單操作(增刪改查)。

注意:這一層操作邏輯一定要簡單,便於商務邏輯層調用。

圖2是TaskDataAccess的方法和屬性,只有對xml檔案增刪改查、建立、儲存操作

圖2 TaskDataAccess

商務邏輯層

如果資料訪問層方法的比較簡單,那麼資料訪問層的方法相對複雜,粒度更大,加入更多判斷和相關操作。

下面是TaskDataControl.cs的主要的公用方法:

 1 public void Refresh(); 2 public List<string> ReciteUnitNow(); 3 public void AutoChangeRecitePeriod(string unitName, DateTime dt); 4 public void RedoRecitePeriod(string unitName); 5 public void RedoReciteUnit(string unitName); 6 public void ReDoFilterUnit(string unitName); 7 public void CompleteRecitePeriod(string unitName); 8 public void CompleteReciteUnit(string unitName); 9 public void DeleteUnit(string unitName);10 public void FilterUnit(string unitName);11 public void ReciteUnit(string unitName);
View Code

 

表現層

表現層包括介面設計以及狀態。以frmReciteWord_Task為例,它包括介面frmReciteWord_Task、幕後代碼,還有TaskDiplay.cs。其中,TaskDisplay.cs主要負責介面狀態,把它分離出來,主要是為了方便理解,和重用。

資料結構

返回

永久層

檔案TaskFile.xml

 1 <?xml version="1.0"?> 2 <Units> 3   <Unit Name="Lession01" UnitStatus="Complete" /> 4   <Unit Name="Lession02" UnitStatus="Start"> 5     <Detail Period="2" PeriodStatus="Complete" CurrentReciteTime="8/27/2014 11:04:26 PM" /> 6   </Unit> 7   <Unit Name="Lession03" UnitStatus="Start"> 8     <Detail Period="2" PeriodStatus="Start" CurrentReciteTime="8/27/2014 11:04:26 PM" /> 9   </Unit>10   <Unit Name="Lession04" UnitStatus="Start">11     <Detail Period="0" PeriodStatus="Start" CurrentReciteTime="8/27/2014 11:01:26 PM" />12   </Unit>13   <Unit Name="Lession05" UnitStatus="Start">14     <Detail Period="0" PeriodStatus="Start" CurrentReciteTime="8/27/2014 09:01:26 PM" />15   </Unit>16   <Unit Name="Lession06" UnitStatus="Filter" />17   <Unit Name="Lession07" UnitStatus="Raw" />18 </Units>
View Code

我們可以看到,永久層的屬性有:Name, UnitStatus, Period, PeriodStatus, CurrentReciteTime

商務邏輯層

檔案TaskDataControl.cs

圖3 Task Business data constructor

商務邏輯層屬性有:Name, UnitStatus, Period, PeriodStatus, CurrentReciteTime, Priority, NextReciteTime。其中,Priority, NextReciteTime是計算出來的。

在這些屬性中,UnitStatus和PeriodStatus比較相似,他們的值,我用枚舉一一列出來了:

1 enum EnumTaskUnitStatus { Start, Complete, Raw, Filter }2 enum EnumTaskPeriodStatus { Start, Complete }

我們可以看到兩個狀態中都有Start和Complete。因為要把課文中單詞永久記住,需有多個周期的記憶、遺忘。UnitStatus的Start和Complet指的是開始學習,到最後結束;而PeriodStatus的Start和Complete只當前周期的開始結束。

注意:資料結構中,對某個屬性理解比較模糊時,一定要停下來思考清楚。清晰的設計,帶來輕鬆的實現。

當然,永久層的資料結構和商務邏輯層的資料結構不必完全一一對應,視實際情況而定。 

痛點與解決方案

 返回

Recite的自動播放功能

當時想用線程實現,然後線上程中直接更改winForm中控制項的值來更改winForm的介面顯示。但這樣做會拋出異常:

Cross-thread operation not valid: Control accessed from a thread other than the trhead it was created on. 

解決方案是通過control.invoke來更改控制項的值。具體原理 橫刀天笑 寫的部落格 WinForm二三事:

WinForm二三事(一)訊息迴圈

WinForm二三事(一)補遺

WinForm二三事(二)非同步作業

WinForm二三事(三)Control.Invoke&Control.BeginInvoke

Recite的播放暫停功能

上面提到自動播放是通過thread實現的,原本暫停功能想通過thread內建方法suspend()實現,但高版本net framework mark這個方法depreciated。因此,另找出路,用AutoResetEvent類來通知thread wait or contiune。看程式碼範例:

 1     public partial class Form1 : Form 2     { 3         System.Windows.Forms.Timer tm = new System.Windows.Forms.Timer(); 4  5         //through autoEvent notify a thread waiting or continue 6         AutoResetEvent autoEvent = new AutoResetEvent(false);         7  8         public Form1() 9         {10             InitializeComponent();11             ProgressBar.CheckForIllegalCrossThreadCalls = false;12 13             14             tm.Interval = 1;15             tm.Tick += new EventHandler(tm_Tick);            16         }17 18         void tm_Tick(object sender, EventArgs e)19         {20             autoEvent.Set(); //allow waiting thread proceed    21         }22         23 24         //method for thread   25         private void DoWork()26         {27             while (progressBar1.Value < progressBar1.Maximum)28             {29                 progressBar1.PerformStep();30                 System.Threading.Thread.Sleep(100);31                 autoEvent.WaitOne();  //Block current thread until autoEvent.Set()    32             }33         }34 35         private void btnStart_Click(object sender, EventArgs e)36         {37             tm.Start();38 39             Thread t = new Thread(DoWork);40             t.Start();41             t.Suspend();42         }43 44         private void btnSuspend_Click(object sender, EventArgs e)45         {46             tm.Stop();47         }48 49         private void btnResume_Click(object sender, EventArgs e)50         {51             tm.Start();52         }   53     }
View Code視窗之間傳遞資料

這裡主要通過兩種方法:

  • 通過公開的屬性
  • 單獨設個類,通過靜態set和get方法 
設定資訊處理

設定資訊見上一篇設定功能,一般可以存放在xml設定檔中。但為了程式更簡單,把這些資訊放在註冊表中。set,get註冊表的靜態方法都放在Utility.cs檔案中。

經驗於教訓

 返回

參考

背單詞軟體-設計於實現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.