松耦合实现方案
本次程序实现了一个小学生算术题出题系统。主要实现了以下三个功能:
出题、判断答案对错、计算。
出题阶段,用户可以指定出题的要求,如运算中是否出现负数、括号、乘除等。
本程序由Core、UI、Console三部分组成。Core承担了核心功能,即接收用户输入,返回用户期望的结果;UI提供了一个简单的图形界面交互;Console部分实现了命令行方式的调用。
Core部分对外提供两组API:
1.统一的一个接口
public string Process(string[] args)。直接将用户参数传入到命令行,调用Process方法即可执行。返回值全部为string类型,如果是需要返回值的功能(如判断对错),则正常情况下返回结果,错误返回特定标识符标记失败;对于无需返回结果的功能(如生成),则返回成功或失败标记。特别的,对于失败情况,会抛出经过封装的相应异常,上层可以根据异常信息判断错误,并反馈给用户。
2.划分功能的多个接口
public void Generate(int cnt, int maxvalue, int maxsize, bool fraction, bool muldiv, bool bracket, bool positive)
public string Check(string pathQ, string pathA)
public string Calc(string str, int precision)
使用这三个接口,上层调用者传入合适的参数,即可执行。三个函数根据需要有或无返回值,遇到异常情况均会抛出相应的异常供调用者分析。
对于异常:
程序中自定义了
public class FormulaNotLegalException : Exception
public class ParameterErrorException : Exception
两个异常,使用了运行时的堆栈异常和除零异常,实现了所有情况的异常处理。前端只需要判断异常类型,即可知道用户是否输入合法或程序是否正确执行。
实现中特别注意的地方:由于对于算式输入的定义不同,有些算式存在空格,有些不存在空格。本程序在实现时做成两种情况都可以处理。算法上,程序实际处理的是不包含空格的情况,对于含有空格的,全部替换成空串后进行处理。
容易出现的问题:
虽然接口的定义可以处理大多数情况的出现,但是还是存在一些问题。
本程序计算模块对于输入算式的要求中有:所有负数必须用小括号括起来,但是衔接的用户界面并没有对这个要求作出检查,导致本应合法的算式被判定成非法。
改进方法:使用中间层,如果用户输入不满足核心模块要求,根据实际情况给前端反馈错误或处理成可以满足要求的输入格式。