当前位置:文档之家› 软件架构设计文档

软件架构设计文档

密级:内部公开文档编号:1002版本号:V3.0测测(基于安卓平台的测评软件)软件架构设计文档中国石油大学(华东)计算机与通信工程学院天师团开发团队目录1.文档介绍 (4)1.1文档目的 (4)1.2文档范围 (4)1.3读者对象 (4)1.4参考文献 (4)2.架构设计思想 (5)3.架构体系描述 (5)4.views (5)4.1 Module structs (5)4.2 Component & Connector(组件-连接器视图) (7)4.3 Allocation (8)5.Mappping between views (8)5.1 Class map to Package (8)5.2 Package map to Allocation (8)6.Utility tree (9)6.1 Quality attribute scenario (质量属性场景) (9)6.2 Utility tree (11)6.3 Tactics (12)7. Architecture (13)7.1 WebService (13)7.2 MVC (Model View Controller) (16)7.3 Publish/Subscrib (18)1.文档介绍1.1文档目的本文档是对于测测软件系统进行详细设计和编码的重要依据。

对该软件的整个系统的结构关系进行了详细描述,阐述了系统的总体框架,包括物理、逻辑结构,说明了体系结构所采取的设计策略和所有技术,并对相关内容做出了统一的规定。

为今后的设计、编码、测试都提供了可以参考的模版并且提高效率,使整个开发过程做到资源利用最大化,减少由于需求变更而修改的时间,大大的降低了成本,节约了时间,也使得客户更加的满意。

1.2文档范围本文档包含以下几个部分:1、架构设计思想2、架构体系描述3、系统模块化分4、系统模块描述5、模块接口设计1.3读者对象本文档主要读者包括:1、本系统的设计人员:包括模块设计人员(理解用户需求,在设计时把握用户需求)。

2、本系统的系统开发人员:编码人员(了解用户需求,为编码提供模版)。

3、本系统的测试人员(了解用户需求,为测试提供参考)。

4、客户(检查是否满足要求)。

1.4参考文献《软件工程讲义》《测测需求规格说明书》2.架构设计思想为了降低系统耦合度,增加系统内聚性,在需求发生更改时能在较短的时间内对系统做出修改,并重新投入使用,我们决定以分层体系架构风格作为整个系统的体系风格,严格按照一定的规则来进行接口设计,并以之为根据进行详细设计。

分为数据层、业务逻辑层、表示层。

3.架构体系描述整个系统顶层架构采用分层的风格,整个系统的体系结构非常清晰,使得后期易于详细设计、编码、维护以及适应需求变更。

通过分层,定义出层与层之间的接口,使得在更加规范的同时拥有更为多台花的接口描述,使得层与层之间的耦合度降低,增强了模块的服用型和可扩展性以及可维护性。

同时,分层也有益于项目模块的划分以及任务的分配,通过明确清晰的接口,降低集成的难度,提高效率。

4.views4.1 Module structs(1)具有三层结构的测测软件包图:图4.1.1领域模型图(2)测测软件领域模型图:图4.1.2领域模型图(3)测测软件类图:图4.1.3类图(4)测测系统用例图:图4.1.4系统用例图4.2 Component & Connector(组件-连接器视图)(1)性格测试顺序图:图4.2.1性格测试顺序图4.3 Allocation(1)测测软件部署图:图4.3.1部署图5.Mappping between views5.1 Class map to Package(1)类图中的TTestController类、UserContainer类、TendencyContainer类对应于包图中表示层的UI包。

(2)类图中的TTest类、User类、Test类、InteligentTest类、CharactTest类、Tendency 类、Daily Trend类、ServiceController类对应于包图中业务逻辑层的测试模块包和评价模块包。

(3)类图中的DataHelp类、I/OEventStream类、QuestionBase类、UserInfo类对应于包图中数据层的题库管理包和用户管理包。

5.2 Package map to Allocation(1)包图中的UI包、测试模块包、评价模块包位于部署图中的C/S客户端。

(2)包图中的题库管理包和用户管理包位于部署图中的客户端数据库和数据库服务器。

6.Utility tree6.1 Quality attribute scenario (质量属性场景)(1)可用性:策略:异常检测异常处理(2)互操作性:策略:发现服务(3)可修改性:策略:减少耦合提高内聚封装(4)性能:策略:同时计算(5)安全性:策略:拒绝攻击反应攻击确定用户(6)可测试性策略:限制复杂性(7)易用性6.2 Utility tree6.3 Tactics一,安全性策略:1、反应攻击2、确定用户二,可用性策略:1、异常检测2、异常处理3、实时监听三,安全性策略1、加密数据2、拒绝攻击3、反应攻击4、确定用户四,可修改性策略1、降低依赖2、减少耦合3、提高内聚4、封装五,性能策略1、同时计算7. Architecture根据软件的重要需求,确定了本软件所采用的设计模式:7.1 WebService决定运用该模式的需求:(1)客户端数据库与服务器同步,采用双数据库实现效率提高。

(2)需调用API,进行每日运势分析。

WebService 调用每日星座运势API核心代码如下:private void updateEverydayFortune() {if(isNetworkAvailable()){//有网络就更新//启动更新数据线程new Thread(new updateEverydayFortuneRunnable()).start();}}private class updateEverydayFortuneRunnable implements Runnable{ SimpleDateFormat simpleDateFormat= new SimpleDateFormat("yyyy-MM-dd");String now = simpleDateFormat.format(new Date());SharedPreferences sharedPreferences= MainActivity.this.getSharedPreferences("xzlm",Context.MODE_WORLD_ READABLE);@Overridepublic void run() {//将值取获,然后保存for(int i=1;i<=12;i++){//判断是否要更新String date = sharedPreferences.getString(i+"_date", "NoDate");if(date.equals("NoDate")||!date.equals(now)){//需要更新的星座就去更新。

sendInfo(i);}}}}private StringBuffer json;private void sendInfo(int constellationid) {// 发送http请求URL url = null;HttpURLConnection conn = null;DataOutputStream outputStream = null;BufferedInputStream bufferedInputStream = null;String requestUrl = "astro/astro.http.php";String param = "fun=day&id="+ EverydayFortune.httpConstellationNumber[constellationid - 1] + "&format=json";byte[] entity = param.getBytes();try {url = new URL(requestUrl);conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5000);conn.setDoOutput(true);conn.setUseCaches(false);conn.setRequestMethod("POST");conn.setRequestProperty("Charset", "UTF-8");conn.setRequestProperty("Content-Length",String.valueOf(entity.length));outputStream = new DataOutputStream(conn.getOutputStream());outputStream.write(entity);outputStream.flush();if (conn.getResponseCode() == 200) {bufferedInputStream = new BufferedInputStream(conn.getInputStream());byte[] bf = new byte[1024];int i = 0;json = new StringBuffer();while ((i = bufferedInputStream.read(bf)) != -1) {String str = new String(bf, 0, i);json.append(str);}}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}if (json != null) {// 有数据返回,下面解析这些数据,并保存resolveJSONAndSave(constellationid);}//解析回传的jsonprivate void resolveJSONAndSave(int constellationid) { JSONArray array;try {array = new JSONArray(json.toString());String zhys = array.getJSONObject(0).getString("rank");String aqys = array.getJSONObject(1).getString("rank");String gzzk = array.getJSONObject(2).getString("rank");String lctz = array.getJSONObject(3).getString("rank");String jkzs = array.getJSONObject(4).getString("value");String stzs = array.getJSONObject(5).getString("value");String xyys = array.getJSONObject(6).getString("value");String xysz = array.getJSONObject(7).getString("value");String spxz = array.getJSONObject(8).getString("value");String zhgs = array.getJSONObject(9).getString("value");String date = array.getString(11);//保存到sharedPreferencesSharedPreferences sharedPreferences = MainActivity.this.getSharedPreferences("xzlm",Context.MODE_WORLD_WRITEABLE);Editor editor = sharedPreferences.edit();editor.putString(constellationid+"_zhys", zhys);editor.putString(constellationid+"_aqys", aqys);editor.putString(constellationid+"_gzzk", gzzk);editor.putString(constellationid+"_lctz", lctz);editor.putString(constellationid+"_jkzs", jkzs);editor.putString(constellationid+"_stzs", stzs);editor.putString(constellationid+"_xyys", xyys);editor.putString(constellationid+"_xysz", xysz);editor.putString(constellationid+"_spxz", spxz);editor.putString(constellationid+"_zhgs", zhgs);editor.putString(constellationid+"_date", date);mit();} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 判断有没有网络* @return是否有网络*/private boolean isNetworkAvailable() {Context context = getApplicationContext();ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);if (connectivity != null) {NetworkInfo[] info = connectivity.getAllNetworkInfo();if (info != null) {for (int i = 0; i < info.length; i++) {if(info[i].getState() == NetworkInfo.State.CONNECTED) {return true;}}}}return false;}7.2 MVC (Model View Controller)决定运用MVC模式的需求:(1)实现测试题目选项统计,进行测试结果分析。

相关主题