




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件系统设计——帮助你从程序员上升为系统设计师——搞清楚“设计什么”以及“如何设计”
linrui@上海漫索计算机科技有限公司目录1.软件系统设计基本概念2.体系结构设计3.用户界面设计4.数据库设计5.模块设计6.数据结构与算法设计7.小结参考书:《软件工程与项目管理解析》,林锐著,电子工业出版社,20031.软件系统设计基本概念1.1基本概念
设计师与程序员的地位。系统设计的技术难度要比编程、测试的高。所以程序员、测试员称为“员”,而设计师尊称为“师”。
系统设计的好坏在根本上决定了软件系统的优劣。我们可以断言“差的系统设计必定产生差的软件系统”,但是不能保证“好的系统设计必定产生好的软件系统”。因为在设计之前有需求开发工作,在设计之后还有编程、测试和维护工作,无论哪个环节出了差错,都会把好事搞砸了。
据说上帝把所有的女士都设计成天使,可是天使们在下凡的时候,有些人双脚先着地,有些人脸先着地。上帝的这一疏忽让很多女士伤透了心。所以我们在开发软件时,一定要吸取这个教训。
系统设计之源是软件需求,包括“功能性需求”与“非功能性需求”。系统设计的目标就是使所设计的系统能够被开发方顺利地实现,并且恰如其分地满足用户的需求,使开发方和用户的利益极大化。开发人员不万不能偏离需求,为了追求技术的先进性而开展系统设计工作。
依据“分而治之”的思想,我们把系统设计过程划分为两个阶段:高层设计阶段和详细设计阶段。高层设计阶段的重点是体系结构设计。详细设计阶段的重点是用户界面设计、数据库设计、模块设计、数据结构与算法设计等。
著名3D游戏软件Quake设计师MichaelAbrash的总结:“所有真正杰出的设计一旦被设计好,看起来都是那么的简单和显而易见。但是在获得杰出设计的过程中,需要付出令人难以置信的努力。”
1.软件系统设计基本概念1.2软件系统与人体的比喻
体系结构如同人的骨架。如果某个家伙的骨架是猴子,那么无论怎样喂养和美容,这家伙始终都是猴子,不会成为人。人的身材大小取决于骨架大小,天生小个子的人基本上不可能成为威猛的大汉,后天再努力(例如锻炼和吃喝)也白搭。由此可见,体系结构乃是系统设计的重中之重。
用户界面如同人的外表,最容易让人一见钟情或一见恶心。象人类追求心灵美和外表美那样,软件系统也追求(内在的)功能强大和(外表的)界面友好。我们在设计软件时不要沉迷于技术,而要多多思考什么样的界面才能让用户更加喜欢。数据库是存储和处理数据用的。人体的数据库是大脑,知识相当于数据,全存在大脑里。如果脑子里存储的知识很多,那么这个人就显得博学。如果脑子处理知识的速度很高,那么这个人就显得聪明。数据库设计的主要挑战是“高速处理大容量的数据”。
模块如同人的器官。每个器官都具有特定的功能,器官们依附在骨架上。模块是软件系统的部件,它们安插在体系结构上(否则运行起来掉光光了)。在设计模块时要重视功能独立性,还要追求“高内聚、低耦合”。
数据结构与算法如同人的神经和肌肉,它分布在全身,让器官具有生命并能发挥功能。人之所以能够全身运动,那是无数的神经和肌肉在起作用。如果局部的神经和肌肉失效了,那么会导致对应的器官残废。如果全局的神经和肌肉失效了,那么人就瘫痪了。同理,数据结构与算法也有全局和局部之分,都要慎重设计。
1.软件系统设计基本概念1.3漫谈设计模式
20世纪90年代,面向对象(Object-Oriented)方法与技术在国内软件业界十分火爆,人们热衷于谈论“对象”并引以为荣。十多年来,人们发表、出版了无数的文章和书籍。现在,该写的似乎都写完了,没有新花样玩了,真是一片无聊。设计模式(DesignPattern)及时问世,面向对象爱好者们终于有了新的追求。1995年,ErichGamma,RichardHelm,RalphJohnson,JohnVlissides(戏称“四人帮”)出版了DesignPatterns:ElementsofReusableObject-OrientedSoftware,该书的中译本已于2000年出版.“四人帮”这本书的主要贡献是:确立了设计模式这个术语,创导了一种新的面向对象设计思潮。该书出版后,全世界参与设计模式研究的人数呈爆炸性地增长。该书的负面效应是:这本书深奥无比,读者被分成两类,即“看得懂设计模式的”和“看不懂设计模式的”,后者居多。很多人刚入门时就被吓住了,知难而退。
何为“模式”和“设计模式”?模式描述了在我们周围不断重复发生的问题,以及该问题的解决方案的核心,这样你就能一次又一次地使用该解决方案而不必重复劳动。模式就是一种公式化的表现,究竟公式化是不是好事?(蔡学庸精辟的解释)尽管软件技术发展非常快,但是仍然有非常多的设计模式可以让我们套用,包括体系结构模式、数据结构模式、接口模式等。 小结:设计模式的应用价值在于它能帮助人们简便地复用以前成功的设计方案。设计模式不是凭空产生的,只有对应用域问题及其解决方案进行抽象和分析,发现本质,并按照一定的格式记录下来,才能成为可以被人们复用的设计模式。2.体系结构设计2.1体系结构设计原则中国科学院的杨叔子院子如是言:文学中有科学,音乐中有数学,漫画中有现代数学的拓扑学。漫画家可以“几笔”就把一个人画出来,不管怎么美化或丑化,就是活像。为什么?因为那“几笔”不是别的,而是拓扑学中的特征不变量,这是事物最本质的东西。体系结构是指软件系统的基本和主体的形态,也就是软件系统中“最本质”的东西。一个软件系统的体系结构设计得好不好,可以用“合适性、结构稳定性、可扩展性、可复用性”这些特征量来评估。合适性:即体系结构是否适合于软件的“功能性需求”和“非功能性需求”。设计师可以充分发挥主观能动性,根据需求的特征,通过推理和归纳的方法设计出合适的体系结构。经验不丰富的设计师往往把注意力集中在“功能性需求”而疏忽了“非功能性需求”,殊不知后者恰恰是最能体现设计水平的地方。高水平的设计师高就高在“设计出恰好满足客户需求的软件,并且使开发方和客户方获取最大的利益,而不是不惜代价设计出最先进的软件。(以设计住宅为例)…对于软件系统而言,能够满足需求的设计方案可能有很多种,究竟该选哪一种?此时商业目标是决策依据,即选择能够为开发方和客户方带来最大利益的那个设计方案。大部分软件开发人员天生有使用新技术的倾向,而这种倾向对开发商业产品而言可能是不利的,切记切记。
2.体系结构设计可复用性
:复用就是指“重复利用已经存在的东西”。被复用的对象可以是有形的物体,也可以是无形的知识财富。复用不是人类懒惰的表现而是智慧的表现。因为人类总是在继承了前人的成果,不断加以利用、改进或创新后才会进步。复用的有利于提高产品的质量、提高生产率和降低成本。由经验可知,通常在一个新系统中,大部分的内容是成熟的,只有小部分内容是创新的。一般地可以相信成熟的东西总是比较可靠的(即具有高质量),而大量成熟的工作可以通过复用来快速实现(即具有高生产率)。勤劳并且聪明的人们应该把大部分的时间用在小比例的创新工作上,而把小部分的时间用在大比例的成熟工作中,这样才能把工作做得又快又好。复用的意义很容易理解,人们也乐意复用以前的成果,但是前提条件是该成果具有比较好的可复用性。可复用性是指成果被复用的容易程度。可复用性是设计出来的,而不是偶然碰到的。要使体系结构具有良好的可复用性,设计师应当分析应用域的共性问题,然后设计出一种通用的体系结构模式,这样的体系结构才可以被复用。
2.体系结构设计2.2体系结构设计流程体系结构设计流程:6个步骤《体系结构设计报告》模板见word文档
2.体系结构设计2.3层次结构介绍层次结构是最常见的体系结构模式,它体现了“分而治之”的思想:当我们没法一口气解决复杂的原始问题时,就把该问题切割成许多个小的相对简单的问题,然后逐个解决。水平方向切割产生的层称为Layer,而竖直方向切割产生的层称为Tier。层次结构在人类社会里随处可见。有个村长曾得意地向老婆吹牛:“全中国只有四个人比我的官儿大,乡长、县长、省长和国务院总理”。政府的行政结构应当划分为多个Layer和Tier。如果Layer和Tier的数目太少了,那么各级政府的领导人会非常劳累。反之如果Layer和Tier的数目太多了,那么导致政府机构太臃肿,办公效率极低。古代中国文人的学历大体分为两层:秀才和举人。这种划分太粗了(即Layer数目太少),对发展教育是很不利的。很多老百姓读不起几年书,拿不到秀才毕业证书的人就被归类为文盲,不幸成为社会下层人物。虽然社会上的秀才人数也不少,但是从秀才到举人的跨度太大、门槛太高,很多秀才考举人考了一辈子也考不上。典型的例子是《儒林外史》里的范进,范进在青年时期就成为秀才,可惜他考举人考了几十年!等他碰巧考上举人的时候,已经是个老头了,只给朝廷增加负担而没有贡献。后人吸取了经验教训,于是逐步建立了现代的学历层次结构,将学历划分为5个层次:小学、中学、学士、硕士、博士。这样人们读书的选择面广了,工作面也广了。“层次结构”是应用最为广泛的体系结构模式。其最大的优点是具有良好的可扩展性,人们在扩充或修改功能时,基本不会破坏原有结构的稳定性。但是万事有利必有弊,层次结构的系统的主要缺点是:管理多个Layer和Tier比较麻烦,运行效率可能比较低。所以,一个具备良好层次结构的系统,其Layer和Tier的数目要恰如其分。
3.用户界面设计3.2开发人员的能力缺陷尽管国内有很多技术出色、聪明过人的软件开发人员,但是他们未必开发得出“易用”的和“美观”的软件。主要原因有:国内绝大多数大学的计算机学科教育存在缺陷:没有开设人机工程学、美学、心理学这些必修课。由于学生们接受的教育几乎全是科学与技术,他们根本不知道怎样才能设计出易用、美观的用户界面,很多人甚至想都没有想过。当他们毕业后真正参与软件产品开发时,只好凭着个人的经验与感觉设计软件的用户界面,这样产生的界面往往得不到大众用户的认可。开发人员在设计用户界面方面不仅存在先天的教育缺陷,更加糟糕的是还常常犯“错位”的毛病,即他以为只要自己感觉用户界面漂亮、使用起来方便,那么用户也一定会满意。俗话说“王婆卖瓜,自卖自夸”。当开发人员向用户展示软件时,常会得意地讲:“这个软件非常好用,我操作给你看,……是很好用吧!蛮漂亮的吧!”软件是否易用、是否美观要让用户来评价。如果用户对界面很不满意,开发人员不要有逆反心里“到哪里找来的笨蛋!”。其实不是用户笨,是自己开发的软件太笨了。当用户真的感到软件很好用时,一股温暖的感觉油然而生,于是就用“界面友好”来表扬这个软件。3.用户界面设计3.3用户界面设计原则(10个)用于提高易用性的界面设计原则有8个:用户界面适合于软件的功能容易理解风格一致及时反馈信息出错处理适应各种用户国际化个性化用于提高美观程度的设计原则有:合理的布局和谐的色彩3.用户界面设计设计原则1:用户界面适合于软件的功能用户界面的合适性是指界面与软件功能相融洽的程度。软件的功能需要通过用户界面来展现。毫无疑问,用户界面一定要适合于软件的功能,这是最基本的要求。否则用户无法通过这个界面来使用软件,如果连用都不能用,“易用性”根本就无从谈起。例如,对于一个三维建模软件而言,如果用户不能使用鼠标对模型进行旋转、移动、缩放等操作,那么这个软件的用户界面就不适合于软件的功能。如果不改进用户界面的话,即使软件的内核功能很强(如算法很先进),这个软件也很难卖得出去。合适性差的界面无疑会混淆软件意图,致使用户产生误解。即使它不损害软件功能与性能,也会使用户产生不该有的情绪波动。“用户界面适合于软件的功能”是基本的设计原则,它提醒设计者不要片面追求界面外观漂亮而导致华而不实。界面的合适性既提倡外美内秀,又强调恰如其分。
设计原则2:容易理解。如果用户很难理解界面的意图,那么他使用起来肯定很费劲。所以“容易理解”是“容易使用”的前提条件。提高用户界面可理解性的一些规则如下:界面中的所有元素(如菜单、工具条等)没有错误,也不会让人误解。所有的界面元素应当提供充分而必要的提示,例如当鼠标移动到工具条上的某个图标按钮时,应当在该图标旁边出现功能提示。界面结构能够清晰地反映工作流程,以便用户按部就班地操作。对于复杂的用户界面而言,最好提供界面“向导”,及时让用户知道自己在界面结构中所处的位置。例如对于基于Web的应用软件,应该在界面上显示“当前位置”,否则用户很容易在众多的页面中迷失方向。3.用户界面设计设计原则4:及时反馈信息用户进行某项操作后,如果过了一会儿(几秒钟)用户界面一点反应都没有,这将使用户感到迷茫和不安,因为他不知道是自己操作错了还是软件死机了。所以及时反馈信息很重要,至少要让用户心里有数,知道该任务处理得怎么样了,有什么样的结果。例如下载一个文件,界面上应当显示“百分比”或相关数字来表示下载的进度,否则人们不知道要等待多少时间。如果某些事务处理不能提供进度等数据,那么至少要给出提示信息如“正在处理,请等待…”,最好是提供合适的动画让用户明白软件正在干活、没有死机。设计原则5:出错处理。用户在使用软件的过程中,不可避免地会出现一些错误的操作。在设计用户界面时必须考虑出错处理,目的是让用户不必为避免犯错误而提心吊胆、小心翼翼地操作。常见的错误处理方式有:
提供对输入数据进行校验的功能。当用户输入错误的数据时,及时提醒用户改正数据。对于在某些情况下不应该使用的菜单项和命令按钮,将其“失效”(屏蔽)可以有效防止该项功能被错误地使用。例如:对于某些管理软件,不同的用户有不同的操作权限。如果低权限的用户登录到系统,那些只有高级权限用户才能使用的功能应当被屏蔽(如变成“灰色”不可操作)。提供Undo功能,用以撤销不期望的操作。执行破坏性的操作之前,应当获得用户的确认。例如用户删除一个文件时,应当弹出对话框:“真的要删除该文件吗”,当用户确认后才真正删除文件。3.用户界面设计设计原则6:适应各种用户一个软件产品可能有许多类型的用户,例如有些用户对计算机比较外行,有一些用户可能是计算机的行家。在设计用户界面必时应当尽可能多地了解用户的需求和技能水平,努力使用户在操作软件的时候感觉不到差异和麻烦。为了达到这个目标,一般需要提供多种操作途径以适应各种水平的用户。例如使用Windows下的文件管理器,对于一个初学者来说,他愿意使用鼠标和菜单一步一步地操作;而对于技术专家而言,他也许更愿意使用热键来获取更高的效率。更了不起的是,一些优秀的软件为患有疾病的人们提供了很好的用户界面。例如全世界的计算机用户中可能有成千上万的人患有色盲或色弱,他们都是正常人,但是当他们面对花花绿绿的软件时会一片茫然。因此通用的软件如浏览器、字处理软件等都要经过色盲人群的测试。设计者越为用户着想,用户就越喜欢这样的软件。设计原则7:国际化中国已经进入了WTO,软件的国际化是大势所趋。为了能够更好地适应国内和国际市场,在设计用户界面的时候应当充分考虑语言和文化的差异。尽可能使用标准的图解方式和国际通行的语言,要求简单易懂,易于翻译,方便于不同母语的用户。特别要留意下列易变的元素:字体、提示信息、在线帮助;货币、度量单位;数字、日期格式;人的名字、电话号码、通信地址;图标、标签;声音;阅读顺序或习惯;
3.用户界面设计设计原则8:个性化用户界面的“个性化”与“一致性”之间存在微妙的矛盾关系。对于一些非常注重安全性的商业软件(如银行软件)而言,用户界面的“一致性”要比“个性化”重要得多,因为一致的界面可以减少用户出错的几率。例如,国内所有银行的自动取款机的用户界面都是非常相似的,谁也不会想着设计一些新花样。而对于普通的应用软件(尤其是娱乐领域的软件)而言,有个性化的界面自然比泯然于众的界面更具有吸引力。设计人员应当根据软件的需求以及广大用户的喜好,在使用户界面具备必要的“一致性”的前提下,突出该软件的“个性”。不仅让用户使用起来方便,而且对软件留下深刻的印象。设计原则9:合理的布局首先,界面的布局应当符合逻辑,最好能够与工作流程吻合。界面设计人员只有仔细地分析软件的需求,才能提取对界面布局有价值的信息。其次,界面的布局应当整洁(整齐清爽)。界面元素应当在水平或者垂直方向对齐,行、列的间距保持一致。窗体的尺寸要合适,各种控件不能过分拥挤也不能过分宽松。要善于利用窗体和控件的空白,以及分割用的线条。3.用户界面设计3.4用户界面设计流程文档模板略示例及细节设计规则见《软件工程与项目管理解析》4.数据库设计4.1概念首先要搞清楚容易混淆的两个概念:“数据库系统”和“应用软件的数据库”。数据库系统是指数据库厂商提供的数据库服务器,目前著名的大型数据库系统有Oracle、DB2、Informix、Sybase,中型数据库系统如MicrosoftSQLServer。而应用软件的数据库则是指开发者在数据库系统中创建的库,用于存储应用软件的数据。一般地,人们可以从上下文判断“数据库”究竟是指哪一个?
简而言之,数据库是存储和处理数据用的。数据库设计的主要工作是:(1)设计数据库的表(数据就存在表里面),表的结构就是数据的存储结构。(2)对这些表中的数据进行操作,常见操作如查询、插入、修改、删除等。数据库设计的难易程度取决于两个要素:“数据关系的复杂程度”和“数据量的大小”。如果应用软件只涉及几张简单的表,并且数据量特别小,那么设计这样的数据库就非常容易(例如设计一个班级的学生成绩单数据库)。但是你绝对不能盲目乐观:以为所有的数据库设计都是那么简单。
从前有个财主姓万,他请了一个秀才教儿子写字。…软件开发人员学习数据库设计的特点是:入门很容易,但是成为高手非常难。大家千万不要学万公子写字噢。
4.数据库设计4.2数据库设计的主要困难与对策一、开发与平台无关的数据库应用程序
目前国际上应用最广泛的数据库系统有Oracle、DB2、Informix、Sybase和SQLServer。这些数据库系统之间的激烈竞争即有好处又有坏处。竞争的好处是使数据库系统不断发展和完善,并且避免价格垄断。竞争的最大坏处是逼迫数据库厂商不断开发出独特的功能以吸引更多的用户,所以各个数据库系统的独特功能无法形成统一标准,导致用户难以开发出与平台无关的数据库应用程序,因为用户很难抵御数据库系统独特功能的诱惑。SQL是数据库系统的标准查询语言。可是数据库厂商提供了太多超出SQL标准的特色功能,使人们陷入了进退两难的境地:(1)如果你想使程序与数据库平台无关,那么只能使用SQL,放弃各个数据库系统的独特功能。(2)如果你超越SQL,使用了某个数据库系统的独特功能,那么这样的程序就是与平台相关的。类似问题也存在于操作系统、Web浏览器这些领域。理论上讲,只有绝对垄断才能形成绝对统一的标准,但是人们既希望打破垄断又希望有统一的标准,这种矛盾无法彻底解决,只能折衷、妥协。如果你开发的是通用的数据库应用软件,不想让应用软件与特定的数据库系统捆绑在一起,那么你就老老实实地用SQL语言写程序。如果你开发的是行业专用的数据库应用软件,并且这个行业已经指定了数据库系统(这种局部垄断现象普遍存在),最近若干年都不会改变的话,那么你可以超越SQL使用该数据库系统的独特功能。(例如公安部采用Oracle,银行采用Informix)
4.数据库设计4.3数据库设计流程数据库设计一般要经历“逻辑设计—>物理设计->安全性设计->性能优化”等步骤,通常要迭代进行。《数据库设计报告》的模板见word文档。5.模块设计5.1何为“模块”与“模块化”
对于软件而言,我们习惯从功能角度描述模块。所以模块泛指软件系统的功能部件。在软件的体系结构设计完成之际,我们就已经确定了所有模块的功能,并且把模块们安放在体系结构的恰当位置上。每个模块都具有特定的、明确的功能(否则不能成为模块)。人们在设计模块时应当尽量使模块的功能独立,因为功能独立的模块可以降低开发、测试、维护的代价。但是功能独立并不意味着模块是绝对孤立的。所有的模块应当能够被集成为一个系统,所以模块之间必定要交流信息、相互配合。比如手和脚是两个“功能独立”的模块。没有脚时,手照样能干活。没有手时,脚仍可以走路。但如果想让人跑得快,那么迈左脚时一定要伸右臂甩左臂,迈右脚时则要伸左臂甩右臂。所以在设计模块时不仅要考虑“这个模块应当有什么样的功能”,还要考虑“这个模块应该怎样与其它模块交流信息”。“模块化”(Modularization)是指:将系统分解为一系列功能模块,然后逐一实现这些模块,最后把所有的模块集成为原来的系统。这样做的好处是能够大大降低系统的开发难度。是否将系统分解得非常细、得到的功能模块越多越好呢?不是的。虽然这样做可以使实现模块的代价更低,但是把功能模块集成为原来系统的代价却增大了很多,得不偿失,所以一个系统的模块数量不能过多也不能过少。那么多少算是恰如其分呢?不知道,要靠设计师的判断。6.数据结构与算法设计6.1学生的掌握情况数学系和物理系的学生通常对科学计算算法比较精通,但是对数据结构知之甚少。尽管他们能够编写出诸如解微分方程这等复杂的算法,但是不懂得有效地组织程序,甚至连指针、链表都不会用。程序之中充满了数组和变量,冗长无比。计算机系的学生熟悉常用的数据结构与算法,编程技能高超。但是很多学生没有学过“科学计算算法”,面对具有数学难度的软件,根本无从下手。我曾经多次在软件工程培训课上测试这样的小题目:请编写浮点变量x与零值比较的if语句,竟然有50%以上的程序员这样写 if(x==0) DoSomething();他们根本没有意识到浮点变量有精度限制,x不能用“==”或者“!=”直接与数值比较。很多程序员在读书的时候没有学过数值计算,在工作的时候连基本的误差处理都不会。6.2观点学会设计数据结构与算法,可以让我们编写出高效率的程序。也许有人要问,在计算机速度日新月异的今天,为什么还需要高效率的程序?因为我们的雄心与能力是一起增长的,技术进步最快也快不过人们欲望的增长。计算速度和存储容量上的革新仅仅提供了处理更复杂问题的有效工具,所以高效率的程序永远不会过时。设计高效率的程序是基于良好的数据结构与算法,而不是基于编程小技巧。因此,大学里计算机科学(或工程)系都把“数据结构与算法设计”作为本科生的必修课程。6.数据结构与算法设计6.3设计理念每一种数据结构与算法都有其时间、空间的开销和收益。当面临一个新的设计问题时,设计者要彻底地掌握怎样权衡时空开销和算法有效性的方法。这就需要懂得算法分析的原理,而且还需要了解所使用的物理介质的特性(例如数据存储在磁盘上与存储在内存中,就有不同的考虑)。与开销和收益有关的是时间——空间的权衡。通常可以用更大的时间开销来换取空间的收益,反之亦然。时间——空间的权衡普遍地存在于软件开发的各个阶段中。程序员应该充分地了解一些常用的数据结构与算法,避免不必要的重复设计工作。数据结构与算法为应用服务。我们必须先了解应用的需求,再寻找或设计与实际应用相匹配的数据结构。6.4一般流程数据结构与算法有全局和局部之分,先设计全局的,后设计局部的(通常在模块设计时进行)。根据问题的特征,先查找已经存在的数据结构与算法,挑选最合适的(并不一定是最先进的)。如果不存在现成的,那么自己设计。设计并且编写代码之后要进行测试,如果不满足性能要求,那么要进一步优化数据结构和算法。A1D5G8JbNeQiTlWo#r%u(y+B3E6H9LcOfRjUmYp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A2D5G8KbNeQiTlXo#r%v(y+B3E6I9LcOgRjUmYp!t&w)z1C4F7JaMePhSkWnZq$u*x+A2D5H8KbNfQiUlXo#s%v(y0B3E6I9LdOgRjVmYp!t&w-z1C4G7JaMePhTkWnZr$u*x+A2E5H8KcNfQiUlXp#s%v)y0B3F6IaLdOgSjVmYq!t*w-z1D4G7JbMePhTkWoZr$u(x+A2E5H9KcNfRiUlXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A2D5G8KbNeQiTlWo#r%v(y+B3E6H9LcOgRjUmYp!s&w)z1C4F7eQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8KbNeQiTlWo#r%v(y+B3E6H9LcOgRjUmYp!s&w)z1C4F7JaMdPhSkWnZq$u*x-A2D5H8KbNfQiTlXo#s%v(y0B3E6I9LcOgRjVmYp!t&w)z1C4G7JaMePhSkWnZr$u*x+A2D5H8KcNfQiUlXo#s%v)y0B3F6I9LdOgSjVmYq!t&w-z1D4G7JbMePhTkWnZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr%u(x+B2E5H9KcOfRiUmXp#s&v)y0C3F7IaLdPgSjVnYq$t*w-A1D4G8JbNeQhTlWoZr%u(y+B2E6H9KcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8KbNeQiTlWo#r%u(y+B3E6H9LcOfRjUmYp!s&w)z0C4F7JaMdPhSkVnZq$u*x-A2D5G8KbNfQiTlXo#r%v(y0B3E6I9LcOgRjVmYp!t&w)z1C4F7JaMePhSkWnZq$u*x+A2D5H8KbNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYq!t&w-z1C4G7JbMePhTkWnZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0B3F6IaLdOgSjVmYq!t*w-z1D4G7JbMeQhTkWoZr$u(x+B2E5H9KcNfRiUmXp#s&v)y0C3F7IaLdPgSjVnYq$t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp!s&v)z0C3F7IaMdPgSkVnYq$t*x-A1D5G8JbNeQiTlWo#r%u(y+B3E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A2D5G8KbNeQiTlXo#r%v(y+B3E6I9LcOgRjUmYp!t&w)z1C4F7JaMePhSkWnZq$u*x+A2D5H8KbNfQiTlXo#s%v(y0B3E6I9LdOgRjVmYp!t&w-z1C4G7JaMePhTkWnZr$u*x+A2E5H8OgRjUmYp!t&w)z1C4F7JaMdPhSkWnZq$u*x-A2D5H8KbNfQiTlXo#s%v(y0B3E6I9LdOgRjVmYp!t&w-z1C4G7JaMePhTkWnZr$u*x+A2E5H8KcNfQiUlXp#s%v)y0B3F6I9LdOgSjVmYq!t&w-z1D4G7JbMePhTkWoZr$u(x+A2E5H9KcNfRiUlXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTkWoZr%u(x+B2E5H9KcOfRiUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8KbNeQiTlWo#r%v(y+B3E6H9LcOgRjUmYp!s&w)z1C4F7JaMdPhSkWnZq$u*x-A2D5H8KbNfQiTlXo#r%v(y0B3E6I9LcOgRjVmYp!t&w)z1C4G7JaMePhSkWnZr$u*x+A2D5H8KcNfQiUlXo#s%v)y0B3F6I9LdOgSjVmYq!t&w-z1C4G7JbMePhTkWnZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr%u(x+B2E5H9KcNfRiUmXp#s&v)y0C3F7IaLdPgSjVnYq$t*w-A1D4G8JbNeQhTlWoZr%u(y+B2E6H9KcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8JbNeQiTlWo#r%u(y+B3E6H9LcOfRjUmYp!s&w)z0C4F7JaMdPhSkVnZq$u*x-A2D5G8KbNfQiTlXo#r%v(y0B3E6I9LcOgRjUmYp!t&w)z1C4F7JaMePhSkWnZq$u*x+A2D5H8KbNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYq!t&w-z1C4G7JbMePhTkWnZr$u(x+A2E5H8KcNfQiUlXp#s%v)y0B3F6IaLdOgSjVmYq!t+A2D5H8KbNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYq!t&w-z1C4G7JaMePhTkWnZr$u*x+A2E5H8KcNfQiUlXp#s%v)y0B3F6IaLdOgSjVmYq!t*w-z1D4G7JbMeQhTkWoZr$u(x+B2E5H9KcNfRiUmXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp!s&v)z0C3F7IaMdPgSkVnYq$t*x-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A2D5G8KbNeQiTlXo#r%v(y+B3E6I9LcOgRjUmYp!s&w)z1C4F7JaMdPhSkWnZq$u*x-A2D5H8KbNfQiTlXo#s%v(y0B3E6I9LdOgRjVmYp!t&w-z1C4G7JaMePhTkWnZr$u*x+A2E5H8KcNfQiUlXo#s%v)y0B3F6I9LdOgSjVmYq!t&w-z1D4G7JbMePhTkWoZr$u(x+A2E5H9KcNfRiUlXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr%u(x+B2E5H9KcOfRiUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9KcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8KbNUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D5G8JbNeQhTlWoZr%u(y+B2E6H9KcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8KbNeQiTlWo#r%v(y+B3E6H9LcOgRjUmYp!s&w)z0C4F7JaMdPhSkVnZq$u*x-A2D5G8KbNfQiTlXo#r%v(y0B3E6I9LcOgRjVmYp!t&w)z1C4G7JaMePhSkWnZr$u*x+A2D5H8KcNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYq!t&w-z1C4G7JbMePhTkWnZr$u(x+A2E
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合同结束赔偿金协议
- 建材配件团购合同协议
- 工程机具回收合同协议
- 上门拆旧服务合同协议
- 建筑土渣运输合同协议
- 废品收购合同协议书范本
- 马鞍山危废处置合同协议
- 4s店提车协议合同
- 香港员工聘用合同协议
- 废弃果园转让合同协议
- 水生花卉资料课件
- 耳鼻咽喉科-咽肿瘤
- 高中地理·第一节人类面临的主要环境问题幻灯片
- 拟经营的食品种类、存放地点
- 益生菌与健康课件
- 2022医学课件医院获得性肺炎(HAP)诊治指南最新综述(精)
- 如何提高小学数学课堂教学地有效性讲座
- 05 【人教版】七年级下期中数学试卷(含答案)
- GB_T 31148-2022木质平托盘 通用技术要求_(高清-最新版)
- 固体物理(黄昆)第一章
- 认识餐饮环境(课堂PPT)
评论
0/150
提交评论