软件工程附加篇章:进阶四则运算和Core对接
0x01 :计算模块(Core)和前端对接
首先特别结对编程刘乾组(SivilTaram)提供的计算模块(Core),http://www.cnblogs.com/SivilTaram/p/4859934.html

在Core模块的说明文档中,我们可以清晰发现在计算模块Core主要实现了表达式计算、四则运算表达式生成、题目文件和答案文件的审核的功能;
但在设计思路上:
在整体的设计思路上,SivilTaram组的Core模块同样将写入和读取文件的逻辑封装在计算模块中;但在自己的前后端的设计中,完全将计算模块设计为单纯的计算功能
在参数设置的方式上,SivilTaram组的Core将全部的setting更改为XML文件的读写,在自己在Core上将setting全部嵌入到计算模块中,但是由于XML文件的读写和setting的实现方法并没有引起较大的冲突,仅在“设置”部分调用了此函数,因此,我们这里完全能够通过XML的读写函数来封装setting函数;
在文件的读写中,SivilTaram组的Core直接将试题的生成和答案的生成直接写入文件,而自己在设计中将文件的读写全部置于前端,计算模块仅生成能够读写入文件的内容(string或string[]类型等),这里我们不妨在此将CoreInterface接口的内容再次列在下面
interface CoreInterface
{
void setting(int MinRange, int MaxRange,
int minOp, int maxOp, long number,
bool isFactor, bool isDecimal, bool isMin,
bool isBracket, bool isMul);
bool setJudge();
string CreateSingleExpression();
string[] CreateExpression();
string[] CorrectionJudge(string exercise, string answer);
string Calc(string formula);
}
因此,考虑到整体的设计思路我们不妨可以通过读写临时文件ConfigurationTextForWinform[1-3].txt的方式,将SivilTaram组的Core中写入文件的部分重新读写,并通过中间层实现SivilTaram组的Core模块由中间层ConfigureCore : CoreInterface解析为基本的自己的Core的方法,从而使得前端几乎不需要任何修改,即可实现前后端的耦合,总体用于中间层的代码量不超过100行,因此得益于前端较高的独立性,和SivilTaram组功能封装明确的Core模块,最终整体的耦合并未花费较长时间,但在耦合的过程中也存在了一些问题,不妨将它简单罗列与0x02中,将此分享
0x02 :计算模块(Core)和前端对接中的问题
0x0204 :前端模块和计算模块
首先开启对自己计算模块和前端模块的吐槽部分,在耦合的过程中,在基本功能的实现中,即表达式计算、四则运算表达式的生成、题目和答案文件的检测,由于在封装的过程中完全调用了Core实现的接口,此过程并没有出现其他问题,整体耦合相对较优;但在额外添加功能的过程中,由于涉及已知答案和目标答案的比较,这里由于用户的输入可能存在浮点数、真假分数、带分数等多种不同形式的表达,因此这里采用设置精度e的方式,通过全部解析为decimal类型的数据,进行“约等于”的比较;这里由于扩展功能时为想清楚这其中必要的联系,不得以采用基础类Factor和ParseNumber方法类保证此部分功能的实现,导致前端中不仅存在了Core的计算模块,还包含Factor的基础模块,使得前后端的耦合过程中,若不取消试题挑战功能,必须保留Factor基础类。但最终,通过Core.Calc的方法直接获取结果的字符串形式,最终在前端封装private decimal(string result)函数和private bool near(string resultA, resultB, precision)函数来实现这一过程,避免对底层类的调用。
0x0208 :.NET框架的安装说明
事实证明在处理意外问题上总是拖延了过长的时间,由于SivilTaram所提供的dll文件是基于4.5.2 .NET Framework框架生成,因此在耦合过程中会存在警告信息,“ 未能解析主引用“Core, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL”,因为它是针对“.NETFramework,Version=v4.5.2”框架生成的。该框架版本高于当前目标框架“.NETFramework,Version=v4.5“”,因此,我们这里需要在VS 2013中配置.NET Framework 4.5.2框架,这里中间经历了一定的时间,具体的方法说明于如下链接:
http://stackoverflow.com/questions/31189154/how-do-i-get-visual-studio-2013-to-allow-me-to-target-net-framework-4-5-2
这里额外说明,一定要下载Developer Pack Of the .NET Framework,否则在配置过程中VS2013的目标框架中将始终不存在这一选项
0x0208 :.NET框架的安装说明
这里展示部分的代码框架来说明中间层的设计思路
public class ConfigureCore : CoreInterface
{
private Core.Configure con;
private static long tick = DateTime.Now.Ticks;
public static Random rand = new Random((int)(tick & 0xffffffffL) | (int)(tick >> 32));
public ConfigureCore(Random rand)
{
ConfigureCore.InitialXmlFile();
rand = ConfigureCore.rand;
}
public void setting(int MinRange, int MaxRange,
int minOp, int maxOp, long number,
bool isFactor, bool isDecimal, bool isMin,
bool isBracket, bool isMul){}
public bool setJudge(){}
public string CreateSingleExpression(){}
public string[] CreateExpression(){}
public string[] CorrectionJudge(string exercise, string answer){}
public string Calc(string formula){}
//XML Part For Inital Of UI
public static void InitialXmlFile(){}
private static void CreateNode(XmlDocument xmlDoc, XmlNode parentNode, string name, string value){}
public static string ChangeXml(string name, string NewValue){}
public static string ReadXml(string name){}
}
0x03 :计算模块(Core)和前端对接中的反思
最终,在几乎未改动前端模块的前提下,通过中间层的搭建完成了SivilTaram组的Core计算模块和自己UI前端的耦合,总体而言,此次中间层的代码量并非很大,但在此附加题的过程中也主要存在着一些感想:
接口设计思路:在从需求分析到设计部分,在起初自己忽略了前后端的功能划分,但在第二天的接口设计的过程想到此问题才开始重构;因此,此次接口设计思路是耦合过程中的显著问题,信息封装过程是否封装了大量必要信息导致前后端代码量出现不匹配的状况,依赖倒置原则中是否在前端中使用了过多的底层类,导致对底层类的依赖性更强,而违背这一原则等等
功能实现的区别:因此四则运算的生成和计算能够生成很多功能:从最简单的单词挑战、评分等功能的实现,因此个人认为从功能的角度,最好能将Core接口封装为单纯的计算模块,由中间层或前端完成文件本身的读写操作;因此,此次由于计算模块的接口未规定,也导致不同层次的功能封装在不同模块,耦合的时候会需要大量的中间层代码去兼容,而不是通过接口去完成耦合
结对编程的团队拼接:事实证明,愈加提前的沟通效率越是能降低后期修改、耦合的时间,如果能在结对编程中提前设计一套统一的接口,那么在前后端的直接耦合上,可能会仅需简单的参数设置完成之间的修改吧
0x04 :尾序:写于团队编程的前夕
并非所有的记忆都被冠以再也不见的标语,
就仿佛青春算得好相聚算得好嬉戏却依旧算不好分别
既然说了再见,也一定会再次相见
散落天涯,不过是为了更好的相见
再见啦,这个骄阳似我回忆似沙春风十里不抵嫣然笑靥的夏天
一切安好~
——《夏洛特烦恼》第二章
软件工程附加篇章:进阶四则运算和Core对接的更多相关文章
- 软件工程驻足篇章:第十七周和BugPhobia团队漫长的道别
0x01 :序言 I am a slow walker, but I never walk backwards. 成长于被爱,学着爱人 成长的故事 也是年少的星期六结束的故事 就仿佛我和BugPhob ...
- 结对作业——随机生成四则运算(Core 第7组)
结对作业 ——随机生成四则运算(core第7组) 吕佳玲 PB16060145 涂涵越 PB16060282 GITHUB地址 https://github.com/hytu99/homework_2 ...
- Core 第三组 结对作业——四则运算 Part1. Core代码编写
结对作业——四则运算 Part1. Core代码编写 PB15061303 刘梓轩PB16061489 艾寅中 GITHUB 地址 戳这里 目录 (因为内容较多,分为了三个部分,但作业系统中只能提交一 ...
- 软件工程启程篇章:结对编程和进阶四则运算(197 & 199)
0x01 :序言:无关的事 I wrote a sign called "Dead End" in front of myself, but love crossed it wit ...
- 软件工程启程篇章:C#和四则运算生成与运算
0x01 :序言 I leave uncultivated today, was precisely yestoday perishes tomorrow which the person of th ...
- 佛系结对编程---四则运算(Core 第四组)
----by core 第四组 ( 邹卫其 范力 ) 一. 项目介绍 1. 能自动生成小学四则运算题目并给出答案,生成题目时可以选择下列参数: 1)生成题目数量 2)每道题目中运算数数量 ...
- 四、附加到进程调试(.NET Core)
1.安装.net core windows server托管工具包: 1.下载https://dotnet.microsoft.com/download/thank-you/dotnet-runtim ...
- Asp.Net Core对接钉钉群机器人
钉钉作为企业办公越来越常用的软件,对于企业内部自研系统提供接口支持,以此来打通多平台下的数据,本次先使用最简单的钉钉群机器人完成多种形式的消息推送,参考钉钉开发文档中自定义机器人环节,此次尝试所花的时 ...
- 开发进阶:Dotnet Core多路径异步终止
今天用一个简单例子说说异步的多路径终止.我尽可能写得容易理解吧,但今天的内容需要有一定的编程能力. 今天这个话题,来自于最近对gRPC的一些技术研究. 话题本身跟gRPC没有太大关系.应用中,我用 ...
随机推荐
- 百度-淘宝-360搜索引擎搜索API
百度(baidu) Api地址:http://suggestion.baidu.com/su?wd=设计&p=3&cb=window.bdsug.sug window.bdsug.su ...
- centos7下安装docker(3.1创建镜像commit)
docker commit创建镜像 步骤:1.运行容器 2.修改容器 3.将容器保存为镜像 1. 注:-it是以交互模式进入容器,并打开终端 2.安装一个vim进行修改镜像 yum install - ...
- 分布式消息列队RocketMQ部署
模式: 多Master多Slave模式,异步复制: 每个 Master 配置一个 Slave,有多对Master-Slave,HA 采用异步复制方式,主备有短暂消息延迟,毫秒级. 优点:即使磁盘损坏, ...
- $Matrix-Tree$定理-题目
$Matrix-Tree$ 其实矩阵树的题挺好玩的,一些是套班子求答案的,也有一些题目是靠观察基尔霍夫矩阵性质推式子的. 文艺计算姬:https://www.lydsy.com/JudgeOnline ...
- ARDUINO 中断
设置中断函数 attachInterrupt() attachInterrupt(interrupt, function, mode) 描述: 当发生外部中断时,调用一个指定函数.当中断发生时,该 ...
- mybatis基础系列(二)——基础语法、别名、输入映射、输出映射
增删改查 mapper根节点及其子节点 mybatis框架需要读取映射文件创建会话工厂,映射文件是以<mapper>作为根节点,在根节点中支持9个元素,分别为insert.update.d ...
- Qt warning: 构建目录必须和源文件目录为同级目录
从一台电脑转移项目到另一电脑, 路径发生变化,重新构建运行时会出现“QT 构建目录必须和源目录为同级目录”提示,解决办法很加单.如下: 方法一: 点击 project(项目)->然后,看看Bui ...
- OpenCV——轮廓填充drawContours函数解析
函数的调用形式 void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const ...
- async源码学习 - 控制流程waterfall函数
waterfall函数会连续执行数组中的函数,每次通过数组下一个函数的结果.然而,数组任务中的任意一个函数结果传递失败,那么该函数的下一个函数将不会执行,并且主回调函数立马把错误作为参数执行. 以上是 ...
- element vuex 语音播报
data () { return { showDetail: false, height: 1, // 1 不可用 0 正常 2运维中 result: [], tableData: [], // 应用 ...