背单词软件-设计于实现

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);

表现层

表现层包括界面设计以及状态。以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>

我们可以看到,永久层的属性有: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     }

窗口之间传递数据

这里主要通过两种方法:

  • 通过公开的属性
  • 单独设个类,通过静态set和get方法

设置信息处理

设置信息见上一篇设置功能,一般可以存放在xml配置文件中。但为了程序更简单,把这些信息放在注册表中。set,get注册表的静态方法都放在Utility.cs文件中。

经验于教训



返回

参考

时间: 2024-12-25 18:40:23

背单词软件-设计于实现的相关文章

和我一起开发Android应用(一)——开发一款安卓多功能背单词软件

大家好,很久没有在博客园写过东西.前一段时间尝试学过一段时间cocos2d,但是由于学习资料有限,文档较少,一直难有进展,因此在刚刚过去的三周里,我又回到了我的老本行:java ,Android.在假期里我算是正式开发了我的第一个安卓应用: i背单词.经过三个星期的磕磕绊绊,终于写出一个较稳定的版本,现在这款应用已经成功上架GooglePlay,并且很快会在百度移动应用和安智网上架.当然由于这款软件只是由我个人维护,我也不奢求会有多大的下载量了呵呵,但我想有必要把这短时间开发应用的体会做一个总结

背单词软件

1 //JerryZheng版权所有 2 #include<iostream> 3 #include<fstream> 4 #include<ctime> 5 #include<cstdlib> 6 #include<string> 7 #include<conio.h> 8 #include<windows.h> 9 using namespace std; 10 11 string s[128],stemp; 12 i

背单词系统 数据结构课程设计

     数据结构     课程设计说明书           题目:          轻松背单词   学生姓名:       啦啦啦 学    号:    201406060306      院 (系):    电气与信息工程 专    业:   计算机科学与技术 指导教师: 2016  年  1 月 15 日 目 录 1.设计任务 1 2. 需求分析 1 3. 概要设计 1 3.1 基本功能 1 3.2 函数说明 1 3.3 变量和结构体说明 2 3.4 单词存储简要分析 2 3.5 功能

和我一起开发Android应用(二)——“悦词-i背单词”项目功能分析

好几天没有更新了,给关心这个系列的朋友们说声抱歉.今天我们开始第二节,项目功能分析.因为这个背单词软件虽说功能比较简单,但要真正实现起来也挺麻烦的.所以今天我们首先分析一下这个应用的功能,然后逐条慢慢实现. PS:这款应用已经上线91助手,百度移动应用和应用宝,有兴趣下来研究的可以百度搜索“悦词i背单词91”就可找到,我想真正用一下这个应用再看这个教程会有比较直观的理解.好废话不多讲,进入正题. 功能分析: 功能1.查单词. 实现方法:金山词霸开放平台提供了一个开放API,通过Http访问金山词

背单词APP你用对了吗?五大主流背单词APP测评

本文转载至桂林锐拓官网www.ruituo.net 想了解更多信息请加QQ:3167750573 欢迎转载,转载请注明! 我想大多数手机背单词APP用户和锐拓君相同并非英语牛人(当然牛人不用这么费尽心力背单词了),所以估量对背单词软件最垂青的和锐拓君的请求也是相同的: 1.是不是能够让我记牢 ?2.是不是能够有用鼓励我坚持学习 ?当然,一款好的背单词软件,它需求在各个方面都出色,才会全体给用户带来较高的体会,锐拓君将主要从以下几个要素评估一下市面上锐拓君接触到的背单词APP: ?[回忆方法--词

凡是背单词背词汇表,都是傻×行为

原文标题:重点谈单词就是死!这个小组连存在都没必要 觉得说得太对了,转过来给大家看看,原文链接:重点谈单词就是死!这个小组连存在都没必要 凡是背单词被词汇表,都是傻×行为,我们高帅富的透析英语根本就不屑跟你们这些人玩儿 用扇贝背单词,基本上就是一背一个死啊! 之前小组有人发帖讨论扇贝之类的软件(拓词也好,百词斩也好),我就把其中reasonable的建议放这里 "扇贝我之前坚持了1年多,它刚建起的时候我就在那了,和cheka他们也挺熟,不过后来觉得没什么用,平时看书用透析就可以了.所以我放弃了,

背单词app测试

基本任务 1.计划说明 本组选择的对比测试产品A为百词斩,产品B为不背单词. 测试进度表: 项目 内容说明 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划  30  30 · Estimate · 估计这个任务需要多少时间  30  30 Testing Design 测试设计  180  180 · Analysis · 需求和测试需求分析  60  60 · Design Test Cases · 设计测试用例  120  120 Testing Environment 搭建

和我一起开发Android应用(三)——“悦词-i背单词”词典功能实现

接上一讲.本节我们把词典功能基本实现,首先上一个效果图,我发现大家比较关心界面方面的东西,我之前写的一个关于QQ界面的项目就很受欢迎,当然我现在能写出远比那个好看的界面.但是我想一个应用最核心的东西不完全在界面,一个好的创意,一个好的后台服务才是成功的关键,这也是我不断学习的方向. 另外我发现在百度搜“悦词背单词91”搜索结果全是我在博客园的博文了...所以我把这个项目在91应用市场的下载地址粘上来吧,十分欢迎大家试用一下,有什么改进的意见请写在下面的评论里!地址:http://apk.91.c

bing背单词交互流程--Chongyang Bai

昨天和travis,钟秋开会确认了bing背单词的手机界面交互流程.我在这里简单描述一下,设计页面暂时不能贴出来,期待大家的宝贵意见 b( ̄▽ ̄)d. 单词本浏览界面:单词本被分为两类,用户单词本和单词书.每个单词本条目有一个小图标,点击图标则进入单词总览,点击条目其它部分则展开单词本的统计信息和学习情况. 单词本展开子页面:除了统计信息(如总词数,已学词数等)和学习情况外,还有两个按钮,开始学习和更改计划.若选择更改计划,则进入长期背单词计划设置,比如完成天数:若从未设定过计划,则点击开始背词