实验08《训练功能的业务逻辑编程》实验指导书
文/尚小卫
本实验为业务逻辑编程实验,
【工作目标】
1 完成期限:4小时。
2 工作成果:实现一个游戏、训练业务流程的业务逻辑部分
根据原始版整理完成全部UI。
根据原始版完成全部UI界面。
实现一个完整的业务流程,包括:
游戏界面、题目管理逻辑、标准题目数据访问等,重点完成题目管理的编程。
题目的管理模块(出题的算法、题目的管理、标准接口等)
题库管理和出题策略(入库策略、选题策略、出题策略)
完成一个继承的标准题目管理模块
在父类的基础上扩展新的功能,而且随着标准模块的升级而升级。掌握:
-标准BT组件 btSHFQuestion、 btSHFQuestions。
3 验收要求:接口规范,程序运行稳定,信息入库。
根据原始版验收更新版的业务流程:
验收内容:全部业务流程。
验收要求:实现到业务环节。
1 把UI组装到应用程序中。
2 将未实现的部分使用土黄色显示,已实现的功能用新颜色标识出来。
3 对照原始版可以逐项显示对应的功能和功能点。
没有原始版的需要补充一个用户需求列表:
角色:功能。
物体:功能。
功能和实现:至少实现一个题目管理业务模块。
验收内容:
完成一个扩展的题目业务逻辑模块。
实现一个题目业务逻辑的编辑显示窗口。
可以将数据库中题目内容显示在窗口中。
可以将编辑窗口中的内容填写到业务对象中,写入数据库。
在实验窗体中添加题目编辑和显示的实验业务流程。
验收要求:
本次完成的业务逻辑可以取代实验07中用户窗体中的业务功能。
业务逻辑通过题目测试窗口。
业务模块设计:模块结构清晰,流程完整:
验收内容:扩展的方法和业务流程。
验收要求:
1 扩展的功能能够正确运行;
2 方法说明用XML标注方法中文名称和功能;
3 算法说明,用注释行切分算法步骤;
4 数据说明,说明每个变量的含义;
5 物理结构-层次清楚,代码组合,(模块常数、模块字段、构造函数、方法过程、事件过程等);
6 逻辑结构-业务流程各环节划分清楚,接口明确(初始化、启动、处理、结束、退出、异常处理等)。
需求列表:V07-2.08版,完善应用程序部分。
原始版核心业务内容。
继承标准组件扩展部分功能。
程序列表:V07-2.08版,内容与作业源程序一一对应。
工作日志:与模板一致,Word文档实现。
1 日志内容:工作项目名称、开始时间、结束时间。完成那些具体工作。
2 验收要求:Word 文档,格式与模板相同。
实验报告:
1 报告内容:图示纪录实际操作步骤,重点是编程实验部分的各个步骤。
2 验收要求:其他同学可以按照提交的实验报告重复实现相同的实验。
项目验收:符合下列全部条件的同学可以申请结题。
1 已经完成全部原始版和升级版业务流程。
2 已经完成8个的实验全部通过审核。
3 对分数不敏感。
4 对编程没有兴趣。
【实验目的】
本实验为架构实验的业务层编程实验,学生需要掌握对象编程,实现一个业务功能程序模块。
1 学生通过创建或扩展题目管理业务逻辑模块,进一步建立程序基本结构单位--程序模块的概念;
2 学生通过继承已有业务类,建立继承概念,掌握继承的编程方法,重点如何应用这些方法编程。
3 本次实验不再给出可重复的实验步骤,而只给出方法,学生需要独立完成设计和编程。
【实验环境与工具】
Microsoft Visual Studio .NET 2008
C#编程语言
《尚府教学》实验工具,标准组件V07-2.03版
-标准BT组件 btSHFQuestion、btSHFQuestions。
题目类btSHFQuestion说明
属性:详见数据字典 btSHFQuestions表的说明
public TimeSpan AverageTime { get; set; }
public int ProgramID { get; }
public string Question { get; set; }
public string QuestionAnswer { get; set; }
public string QuestionCode { get; set; }
public int QuestionDiff { get; set; }
public int QuestionID { get; set; }
public string QuestionNote { get; set; }
public string QuestionNumber { get; set; }
public int QuestionScore { get; set; }
public string QuestionSolution { get; set; }
public string QuestionSubject { get; set; }
public string QuestionTag { get; set; }
public int QuestionType { get; set; }
构造函数
public btSHFQuestion();
public btSHFQuestion(int id);
public btSHFQuestion(int id, string unm, string ucd, int qtp);
public btSHFQuestion(int pid, int id, string qnm, string qcd, string qtg, int qtp, int qdf, int qsc, TimeSpan atm, string qsb, string qtn, string qsl, string qa, string qnt);
方法:
public void CopyToMe(btSHFQuestion us);
简易加法扩展数据和方法
public struct sppQuestionstruct
{
public int aNumber;
public int fNumber;
public string oPerator;
public int sNumber;
}
public btSHFQuestion.sppQuestionstruct sppQuestion;
public btSHFQuestion GetQuestion(btSHFQuestion q);
public void MakeQuestion(ref btSHFQuestion mq);
题目管理类btSHFQuestions说明
public btSHFQuestions();
public btSHFQuestions(string callStr);
public int CheckOne(string itemSubj);
public int AddOne(btSHFQuestion myItem);
public int UpdateOne(btSHFQuestion myItem);
public int DeleteOne(int itemId);
public ArrayList GetAll();
public btSHFQuestion GetByID(int itemId);
public btSHFQuestion GetOne(int itemId);
public void ReadOne(int itemId);
public string ToSqlSelectString();
【实验过程与步骤】
准备工作:存档、升级、创建第8版作业文件夹。
编程实验
业务说明
本次业务层编程是一个简易加法的业务逻辑层,出题业务要求:
1 题目从题库中选取。
2 如果题库中没有,就随机出题,新题写入数据库。
3 其他要求见实例的注释代码。
完善全部业务流程到业务环节:
UI项目
补齐窗体:按照原始版或用户需求列表检查业务环节,用继承标准组件方式补齐所有窗体。
补齐功能:按照原始版或用户需求列表检查各个窗体上的各个功能是否具备,补齐所有不足的功能(本节课不要求全部实现)。
调整形式:调整界面功能的表现形式与原始版一致。
演示功能:编写简单演示程序,演示原始版业务流程和业务功能。
组装应用:按照原始版业务功能,组装应用程序的V07-2.08版应用程序。
注:
1 如果业务功能已经实现,可以跳过演示部分直接运行已经完成的业务功能。
2 未实现的功能背景设置为土黄色,实现演示功能的功能背景设置为橙色,已经完成的业务功能背景设置为蓝色,通过审核的业务功能背景设置为绿色。
实验程序项目
在实验窗体上完善各个业务流程,用规定色彩标识各个业务环节的启动按钮。
UI项目添加业务模块
添加一个题目编辑测试窗体,上部显示标准题目类(btSHFQuestion)各项信息和说明信息,以及方法按钮,下部显示扩展内容的各项信息和说明信息,以及扩展的方法按钮。
BT项目添加扩展题目类 btSHFXXXQuestion
用继承标准题目类(btSHFQuestion)的方法添加一个btSHFXXXQuestion类,在其中添加扩展的题目处理逻辑和题型处理算法。
继承方式添加类:
扩展题型处理算法: 实现具体应用程序不同题型的处理功能。
BT项目添加扩展题目管理类 btSHFXXXQuestions
在BT项目中,用继承标准题目集类(btSHFQuestions)方式添加题库管理业务类,在其中添加扩展的题库管理逻辑和出题策略算法。重点:(出题的算法、题目的管理、标准接口、不同题型处理逻辑)。
继承方式添加管理类:
扩展题库管理方法: 查询本程序和单元相关题目。
扩展出题算法:题库添加题目算法;选题算法(随机、顺序、时间间隔--扩展用户题目关系表、熟练程度-根据单项成绩表)
BT项目中添加其他类:根据具体应用而定。
添加业务流程类--如:按顺序依次运行各个业务环节。
实验项目编程实例:题目类btSHFQuestion编程
属性:详见数据字典 btSHFQuestions表的说明
public TimeSpan AverageTime { get; set; }
public int ProgramID { get; }
public string Question { get; set; }
public string QuestionAnswer { get; set; }
public string QuestionCode { get; set; }
public int QuestionDiff { get; set; }
public int QuestionID { get; set; }
public string QuestionNote { get; set; }
public string QuestionNumber { get; set; }
public int QuestionScore { get; set; }
public string QuestionSolution { get; set; }
public string QuestionSubject { get; set; }
public string QuestionTag { get; set; }
public int QuestionType { get; set; }
构造函数
public btSHFQuestion();
public btSHFQuestion(int id);
public btSHFQuestion(int id, string unm, string ucd, int qtp);
public btSHFQuestion(int pid, int id, string qnm, string qcd, string qtg, int qtp, int qdf, int qsc, TimeSpan atm, string qsb, string qtn, string qsl, string qa, string qnt);
方法:
public void CopyToMe(btSHFQuestion us);
简易加法扩展数据和方法
public struct sppQuestionstruct
{
public int aNumber;
public int fNumber;
public string oPerator;
public int sNumber;
}
public btSHFQuestion.sppQuestionstruct sppQuestion;
public btSHFQuestion GetQuestion(btSHFQuestion q);
public void MakeQuestion(ref btSHFQuestion mq);
#region sppQuestion 字段说明
/// <summary>
/// V05-2.08 发布版:尚 小 卫 2008.08.15.
/// </summary>
///Random rNumber = new Random();//实例化一个随机数对象
///rNumber.Next(1,10);//产生一个1到10之间的任意一个数
///rNumber.Next(1,1000);//产生一个1到1000之间的任意一个数
private Random rnmb = new Random();
public struct sppQuestionstruct
{
public int fNumber;
public int sNumber;
public string oPerator;
public int aNumber;
}
public sppQuestionstruct sppQuestion = new sppQuestionstruct();
#endregion
#region sppQuestion SPP与标准的转换方法
/// <summary> 生成训练题
///
/// </summary>
/// <param name="qt"> 问题类型 </param>
/// <param name="qd"> 问题难度 </param>
/// <param name="sc"> 此题分值 </param>
/// <param name="q"> 问题对象 </param>
private void sppMakeQuestion(int qt, int qd, int sc, btSHFQuestion q)
{
int i;
switch (qt)
{
case 1: sppQuestion.oPerator = "+";break;
case 2: sppQuestion.oPerator = "-";break;
case 3: sppQuestion.oPerator = "×";break;
case 4: sppQuestion.oPerator = "÷";break;
default: sppQuestion.oPerator = "+";break;
}
switch (qd)
{
case 1:
sppQuestion.fNumber = rnmb.Next(1, 9);
i = 9 - sppQuestion.fNumber;
sppQuestion.sNumber = rnmb.Next(1, i);
q.QuestionNumber = "2008-02-04-01-03-01";
q.QuestionCode = "DIAMOND";
break;
case 2:
sppQuestion.fNumber = rnmb.Next(5, 10);
i = 19 - sppQuestion.fNumber;
sppQuestion.sNumber = rnmb.Next(5, i);
q.QuestionNumber = "2008-02-04-01-03-02";
q.QuestionCode = "APPLE";
break;
case 3:
sppQuestion.fNumber = rnmb.Next(10, 25);
i = 50 - sppQuestion.fNumber;
sppQuestion.sNumber = rnmb.Next(10, i);
q.QuestionNumber = "2008-02-04-01-03-03";
q.QuestionCode = "ABACUS";
break;
default:
sppQuestion.fNumber = -1;
sppQuestion.sNumber = -1;
q.QuestionNumber = "";
q.QuestionCode = "";
break;
}
q = sppQuestionToSHFQuestion(q, sppQuestion);
q.QstnScr = sc;
//q.QstnSbjct = sppQuestion.fNumber.ToString() + "," + sppQuestion.oPerator + "," + sppQuestion.sNumber.ToString();// 题干
//q.QstnSltn;// 解答
//q.QstnAnswr = sppQuestion.aNumber.ToString();// 答案
}
/// 文本->>对象 题目文本转换对象值20080606转换算法
private sppQuestionstruct SHFQuesitonTosppQuestion(btSHFQuestion shfQ)
{
//SWF.MessageBox.Show("StartReceive: " + strUC);
string s = shfQ.QuestionSubject;
sppQuestionstruct q = new sppQuestionstruct();
try
{
//检查 s 的有效性
if (s.Length > 1 && s.IndexOf(",") > 0)
{
//数据 5 项
q.fNumber = System.Convert.ToInt32(s.Substring(0, s.IndexOf(","))); s = s.Remove(0, s.IndexOf(",") + 1);//r.UsrIDI =0;
q.oPerator = s.Substring(0, s.IndexOf(",")); s = s.Remove(0, s.IndexOf(",") + 1);
q.sNumber = System.Convert.ToInt32(s);
q.aNumber = System.Convert.ToInt32(shfQ.QuestionAnswer);
}
}
catch (Exception ex)
{
throw new System.ApplicationException("sppQuestionstruct " + ex.ToString());
}
return q;
}//sppQuestionToSHFQuestion
/// 对象->>文本 题目对象值转换文本20080606转换算法
private btSHFQuestion sppQuestionToSHFQuestion(btSHFQuestion q, sppQuestionstruct sppQ)
{
q.QuestionSubject = sppQ.fNumber.ToString() + "," + sppQ.oPerator + "," + sppQ.sNumber.ToString();
q.Qstn = "=";// 提问
sppQ.aNumber = sppQ.fNumber + sppQ.sNumber;
q.QuestionAnswer = sppQ.aNumber.ToString();
return q;
}//SHFQuesitonTosppQuestion
#endregion
#region 外部开放 出题方法
public void MakeQuestion(ref btSHFQuestion mq)
{
int i = 0;
//btSHFQuestion mq = new btSHFQuestion();
//sppMakeQuestion(QstnTp, QstnDff, 5, q);
mq.QuestionScore = 5;
i = NewQuestion(ref mq);//
}
/// <summary> 出新题
/// 根据题目设置,出一道新题,更新题目内容。
/// </summary>
btSHFQuestions myItems = new btSHFQuestions();
public btSHFQuestion GetQuestion(btSHFQuestion q)
{
throw new Exception("The method or operation is not implemented.");
//q.QuestionSubject = "The method or operation is not implemented.";
//return q;
}
#endregion
#region 内部实现 出题方法
private int NewQuestion(ref btSHFQuestion q)//
{
int i, id = -1;
//
try
{
// 生成新题
sppMakeQuestion(q.QuestionType, q.QuestionDiff, q.QuestionScore, q);
// 新题入库
i = myItems.CheckOne(q.QuestionSubject);
if (i == 0)
{
myItems.AddOne(q);
}
id = q.GetQuestionID(q);
q = q.GetOne(id);
if (q.QuestionID <= 0)
{
throw new Exception("btSHFQuestion NewQuestion 生成新题异常!");
}
return id;
}
catch
{
throw new Exception("btSHFQuestion NewQuestion 生成新题异常!");
//return -1;
}
//return q;
// 库里读题 GetQuestion
// 出新题 NewQuestion
// 添加到题库
}
// 获取题目
private btSHFQuestion GetOne(int qID)
{
btSHFQuestion q = new btSHFQuestion();
btSHFQuestions qs = new btSHFQuestions();
q = qs.GetByID(qID);
q.sppQuestion = this.SHFQuesitonTosppQuestion(q);
return q;
//throw new Exception("The method or operation is not implemented.");
}
private int GetQuestionID(btSHFQuestion q)
{
btSHFQuestions qs = new btSHFQuestions();
int i = qs.GetQuestionID(q);
return i;
//throw new Exception("The method or operation is not implemented.");
}
#endregion
冒烟试验
启动应用程序--对照原始版和用户需求,检查到业务功能实现程度,在需求列表中用色彩标识出来。
启动作业程序--选择实验程序,检查题目编辑、显示窗体,检查题目环节。
编写技术文档
需求列表:
修改日期和版本编号;V07-2.08
应用程序部分--核心业务部分完成的教学业务流程到产品功能点。
作业程序部分--添加升级版实验窗体新增加的核心业务窗体和功能。
程序列表:
修改日期和版本编号;V07-2.08
根据升级版实验窗体新增核心业务流程及实验功能后实现的V07-2.08版程序完善程序列表:
UI和BT项目--新增的业务模块。
UI项目--uiSHFXXX_AppMain应用程序新增的功能。
教学实验项目--SHFXXX_TestV072.新增的核心业务流程,检查每个核心业务环节。
数据字典:
修改日期和版本编号;V07-2.08
扩展的题目类和题目管理类。
完成工作文件
工作日志:1 实际工作日日期:开始时间、结束时间、工作项目名称和内容。
实验报告:
1 报告内容:图示纪录实际操作步骤,重点是编程实验部分的各个步骤。
准备提交作业
程序代码1项:选定解决方案-右键-清理解决方案-关闭VS2008
技术文档3项:将项目需求列表、程序列表、数据字典添加到源程序文件夹。
工作文档2项:将工作日志、实验报告添加到源程序文件夹。
小组提交1项:选定源程序文件夹-右键-压缩打包-完成V07-2.08版源程序-保存-提交组长审核。
邮件提交2项:技术文档、工作文档发送到作业邮箱,分别独立发送,要求作业发送格式正确。
截至时间:2010年05月26日 23:50