山东大学软件开发解决方案复习提纲
写在前面:
期末又到了,这是一份新鲜的软件开发解决方案复习提纲,所有问题均来自于老师最后一节课划重点时使用的ppt,请大家放心使用~
另外,由于这门课程教的知识与企业中真正用的东西严重脱节,所以针对部分内容我添加了一些自己的理解。如果你只想拿个高分,那么就请忽略掉我自己添加的内容。但是如果你真正进入企业进行软件开发时,千万不要照本宣科地按照这门课(或者说这份提纲)的内容去做!
这门提纲仅适用于考试!
这门提纲仅适用于考试!
这门提纲仅适用于考试!
其内容放到企业(或者找工作面试)中基本不适用!
其内容放到企业(或者找工作面试)中基本不适用!
其内容放到企业(或者找工作面试)中基本不适用!
重要的事情说三遍,那么接下来就是复习提纲:
1、软件开发过程
MSF两模型与三原则
两模型:
1、过程模型
2、小组模型
三准则:
1、风险管理准则
2、项目管理准则
3、就绪管理准则
瀑布模型
将软件开发的过程分为多个步骤,开发过程是通过这一系列步骤顺序展开,每个步骤都有一定的反馈。
需求分析——SRS
系统设计——SAD
程序设计——算法和数据描述文档
编码——源程序及注释
单元测试和集成测试——单元测试报告
系统测试——系统测试报告
验收测试——验收测试报告
运行与维护——维护报告
螺旋模型
螺旋模型是一个比较强调风险评估的模型,比较适用于需求不是很明确的、规模比较小的项目的开发。
螺旋模型每次迭代有四个任务,依次是(四个象限):
计划、目标/可选方案、风险评估、 开发与测试。
螺旋模型共有四次迭代,依次是(每个象限的四重循环):
操作概念、软件需求、软件设计、开发与测试。
MSF过程模型
MSF过程模型是将瀑布模型和螺旋模型进行结合后的产物。
它在螺旋模型的基础上增加了每个阶段的里程碑:
MSF中的里程碑分为“主里程碑”和“中间里程碑”。主里程碑是项目阶段的转换点。MSF中主里程碑有“远景/范围认可”、“项目计划认可”、“范围完成”、“发布就绪认可”、“部署成功”。中间里程碑是指两个主里程碑之间的小的工作目标指示物或工作成果。
在对每个版本进行迭代时,都会经过上述五个步骤,如下图:
这是一种“小步快跑”式的版本迭代方案。
具体每个阶段的介绍:
1、构思阶段:创建一个关于项目的目标、限定条件和解决方案的构思。
2、计划阶段:创建解决方案的体系结构和设计方案、项目计划和进度表。
3、开发阶段:完成功能规格说明书中所描述的功能、组件和其他要素。
4、稳定阶段:提高解决方案的质量,满足发布到生产环境的质量标准。
5、部署阶段:把解决方案实施到生产环境之中。
MSF小组模型
重点:不能角色缺失,可以一个人承担多个角色。
产品:定义产品满足什么样的需求,功能是什么,决定要做一款什么产品。其着眼点是客户满意。
程序管理:开发的协调者,项目经理,在客户的约束后交付。
开发:负责编码,按产品规格说明书交付程序。
测试:解决所有问题后发布。
用户教育:培养用户的胜任力。
后勤管理:平滑产品部署。
各个模型优缺点
瀑布模型:
优点:
1、简单性:很容易向用户解释。
2、基础性:是其他更复杂模型的基础(通过加入额外的开发活动和循环)。
3、每个过程都有相应的提交产物,方便进度评估。
缺点:
1、面对需求变动时,该模型无法实际处理重复开发问题。
2、文档转换时有困难。
螺旋模型:
优点:
1、设计上很灵活
2、以小的分段来构建大型系统,使成本计算变得简单容易。
3、客户始终参与每个阶段的开发,保证了项目的可控性。
缺点:
1、模型比较复杂,很难让用户确信这种演化方法的结果是可以控制的。
2、使用螺旋模型开发项目,开发周期长,而软件技术发展比较快,所以经常出现软件开发完毕后,和当前的技术水平有了较大的差距,无法满足当前用户需求。
MSF过程模型:
优点:
1、集合了瀑布模型和螺旋模型的优点,拥有比较高的灵活性,也保证了项目的可控性。
缺点:
1、比较复杂,应对规模比较小的项目时有点大材小用。
里程碑
里程碑是特定的时间节点,标志着活动的结束,通常伴随着提交产物。
比如ABCDEFGHIJKL都是里程碑。
互异三角形
资源(成本)、功能、进度三者不可兼得
2、Spring框架
spring简介
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
Spring框架解决了“接管程序创建对象、资源管理”等问题。
Spring框架实例化bean的默认方式是构造方法。
DI/IOC
依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色需a要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者,因此也称为依赖注入。
所谓控制反转,就是控制权的转移,举例说明:一个人要开车,正常情况下,人应该自己去找车,而实现控制反转后,人就不需要考虑车从哪里来了,直接开就行了,人就把找车的控制权转移给了别的对象。
AOP
Spring框架通过面向切面编程(AOP)完善其依赖注入(DI)的特性,面向切面编程在spring中主要表现为两个方面:
1、面向切面编程提供声明式事务管理
2、spring支持用户自定义的切面
面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
aop从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。
aop框架具有的两个特征:
1、各个步骤之间的良好隔离性
2、源代码无关性
3、JDBC Mybatis Hibernate
JDBC简介
JDBC提供了一系列API,允许用户访问存储在关系数据库中的数据。
开发步骤一般为:
1、首先编写DAO接口。
2、之后继承这些DAO接口,实现这些DAO接口中对应的方法(在这些方法中,我们会使用JDBC的API访问数据库,同时我们也需要在方法中写SQL语句)。
Mybatis简介
MyBatis 是一款优秀的持久层框架,它避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集,它可以使用简单的 XML 来将数据库中的记录映射为Java对象。
优点:
1、把sql从java文件中移到了xml中
2、提供了标签,封装java实体类
3、降低开发量,消除冗余代码
缺点:
1、sql编写量依旧很大
2、不适用于对数据进行整体分析
Hibernate简介
Hibernate是一个对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,是一个全自动的orm框架。hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
优点:
1、对象化,以oo的思想操作数据库。
2、更好的移植性。
3、开发效率更高。
4、提供缓存机制。
缺点:
1、对于持久层的封装过于完整,无法灵活编写sql。
2、配置文件比较庞大。
ORM思想
O代表的是Objcet
R代表的是Relative
M代表的是Mapping
ORM也就是对象关系映射,是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。换句话说,就是将表的关系映射成对象间的关系。
举例来说,下面是一行 SQL 语句。
SELECT id, first_name, last_name, phone, birth_date, sex
FROM persons
WHERE id = 10
程序直接运行 SQL,操作数据库的写法如下。
res = db.execSql(sql);
name = res[0][“FIRST_NAME”];
改成 ORM 的写法如下。
p = Person.get(10);
name = p.first_name;
Mybatis面向接口编程
Mybatis的面向接口编程
1、dao接口与namespace名称相同
2、标签id的值和dao接口相同
3、返回值和dao接口返回值相同
Mybatis接收参数时:1个参数不处理,多个参数用map处理
4、Web开发
静态/动态Web资源
静态Web资源:HTML文件
动态Web资源:jsp等
动态与静态最根本的区别是在网页在服务器端运行状态不同
(以下仅为个人见解,考试时千万别写上去,会挂科的)
不过在现代Web开发当中,由于AJAX技术的广泛应用,动态web资源基本上已经可以被静态Web资源+AJAX所替代了。
所以我们现在在访问网页时,就已经看不到太多使用jsp等技术实现的网页了。
所以也真不知道老师们向我们传授这些过时了三四年的技术的意义在哪里。
J2EE三层架构
1、表现层:
通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
表现层的主流框架有:springMVC
2、业务逻辑层:
针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
业务逻辑层的主流框架有:Spring
3、数据访问层:
该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等。
数据访问层测主流框架有:Hibernate,Mybatis
Web请求提交方式
Web请求的主要提供方式有两种:Get和Post
其区别为(W3C给出的标准答案):
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST没有。另外,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
(以下仅为个人见解,考试时千万别写上去,老师会揍你的)
1、首先从安全性讲,get和post请求其实都差不多,get请求参数在url上,直接暴露,post请求的参数虽然不在url上,但是按F12后查看network也直接暴露了,所以两者安全性其实没啥区别。
2、GET参数通过URL传递,POST放在Request body中其实不是很准确,post请求也可以没body,也可以在url传递。
5、SpringMVC
SpringMVC简介
springMVC是一种web层mvc框架,用于替代java servlet来处理/响应网络请求。
MVC三者关系
Model(模型):模型代表一个存取数据的对象。它也可以带有逻辑,在数据变化时更新控制器。
View(视图):视图代表模型包含的数据的可视化。
Controller(控制器):控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
框架的本质
一堆jar包,jdk的扩展,解决开发中的特定需求,对于现有技术的优化。
(以下仅为个人见解,考试时千万别写上去,我估计不会得分)
首先说一句,这里的框架,仅仅指的是“Web框架”。
每一个程序员,对于“框架的本质”的理解,都应该有自己的理解,比如我们老师教给我们的就是上述几句话。但是随着你开发经验的积累,你会发现上述的理解实在是太浅了。
我个人对于框架的理解是这样的——框架是一种“约束”,一种“使用’能给你提供某些功能的半成品’对你开发软件的约束”,并且这些“约束”对你项目的开发有极大的帮助,比如提高软件的可读性、可维护性和开发速度等等。
当然,每个人对这件事都会有自己的理解,每种理解我觉得都没有对错之分。
我只是很讨厌这种需要按照老师的理解背提纲得分的现象。
SpringMVC的优势
1、在MVC三者之间有一个更清晰的划分。
2、任何一个类都可以做控制器。
3、对参数进行了一定的封装。
4、提供中央处理器DispatcherServlet,控制其它组件执行,统一调度,降低组件之间的耦合性,提高每个组件的扩展性。
(以下仅为个人吐槽,考试时千万别写上去,我估计老师会骂你)
SpringMVC优势这个问题实在是太大了,以上四条仅为老师给出的四个标准答案,如果只是想要拿分,背诵即可。但真正做技术交流或者写代码的时候,千万不要照本宣科。
6、前端框架
Bootstrap简介
目前最受欢迎的前端框架,基于 HTML、CSS、JavaScript。
Bootstrap 提供了一个带有网格系统、链接样式、背景的基本结构。
通过使用Bootstrap,我们能够很简单地实现响应式布局。
(这里我真的忍不了了,作为一个前端开发工程师,我看到这答案的第一句话我觉得这就是在误人子弟……各位看官就理性地背诵吧,如果你是一名前端开发工程师,千万别说出来目前最受欢迎的框架是Bootstrap,会笑死人的。根据GitHub的一项调查表示,目前最受欢迎的前端框架分别为React.js、jQuery、Vue.js以及Angular.js)
JQuery简介
jQuery针对一些常用的JavaScript方法进行了封装,为开发者提供了丰富实用的API。
选择器:
$(“p”)
$("#id")
$(".class")
AJAX:
$.ajax()
$.get()
$.post()
HTML操作:
text()——获取纯文本
html()——获取块内html
val()——获取value中的值
attr()——获取属性
append()——在被选中的元素内部的末尾添加元素
prepend()——在被选中的元素内部的前面添加元素
after()——在被选中的元素后添加元素
before()——在被选中的元素前添加元素
remove()——删除当前元素及子元素
empty()——删除子元素
实用jQuery的好处:
1、拥有强大的选择器
2、出色的DOM和封装
3、完善的AJAX机制
4、不污染顶级变量(具体可以看我的博文:jQuery中$的实现原理)
5、优秀的浏览器兼容性
(以下是个人理解,别写,不得分)
jQuery的确是一个优秀的框架——以至于jQuery的某些API直接纳入了新一代的JavaScript ES标准,成了JavaScript的原生特性。
但是随着axios(ajax请求)、babel(浏览器兼容性)、新的ES规范的普及,jQuery正在渐渐丧失其优势地位,以至于越来越多的前端项目开始不使用甚至是剔除jQuery,这是对jQuery来说真的是很可惜的,但同时,这也的确是技术进步的一种体现吧。
7、数据库设计
为什么要进行数据库设计
当数据库比较复杂时,我们需要先设计数据库,这样能够:
1、节省数据的存储空间。
2、能够保证数据的完整性。
3、方便进行数据库应用系统的开发。
4、避免数据更新和插入的异常。
数据库范式
1NF:数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
2NF:在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
3NF:在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
BCNF:在3NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖)
概念模型、数据模型、物理模型
概念模型是现实世界到信息世界的第一层抽象,主要是对信息的一种描述,通常作为业务人员和技术人员之间沟通的桥梁。
下图为现实世界转换为概念模型:
逻辑模型是对概念模型进一步具体化,在概念模型定义实体的基础上定义了各个实体的属性,是用户从数据库的角度能够看到的数据的模型。这种数据模型架起了用户和系统之间的桥梁,既要面向用户,同时也考虑到了所用的DBMS所支持的特性。
物理模型是在逻辑模型的基础上,综合考虑各种存储条件的限制,进行数据库的设计,从而真正实现数据在数据库中的存放。其主要的工作是根据逻辑模型中的实体、属性、联系转换成对应的物理模型中的元素,包括定义所有的表和列,定义外键以维持表之间的联系等。
下图为逻辑模型转换为物理模型:
8、编码规范
列举常用的编码规范:
(送分题,随便举一些编码规范即可,一般每个开发团队都会有自己的编码规范)
对于java:
1、类名:大驼峰命名
2、方法名:小驼峰命名
3、常量:大写匈牙利命名
9、原型设计
程序原型简介
什么是程序原型?
一种部分开发的产品,用来让用户和开发者共同研究,提出意见,为最终的产品定型。
原型设计的意义是?
1、使开发者更容易地提高软件质量。
2、可以提供多种解决方案供用户选择。
10、前后端调试
前端开发者模式
使用chrome,按F12,或者右键选择“检查”
设置断点
断点,debugger的功能之一,可以让程序中断在需要的地方,从而方便分析程序运行时的状况。
log4j简介
通过使用Log4j,我们可以很方便地输出控制日志信息到控制台、日志文件等地方。我们也可以控制每一条日志的输出格式。通过定义每一条日志信息的级别(OFF - FATAL - WARN - INFO - DEBUG - TRACE - ALL),我们能够更加细致地控制日志的生成过程。另外,我们可以通过一个配置文件来灵活地对日志信息进行配置,而不需要修改应用的代码。
11、软件设计
设计原则
1、单一职责原则:每个类只有一个职责。
2、组合复用原则:优先使用组合复用,而不是继承。
3、开闭原则:对扩展开放,对修改封闭。
4、里氏替换原则:任何父类出现的地方,子类都可以代替父类。
5、依赖倒转原则:抽象不应该依赖于细节,细节应该依赖于抽象。
6、接口隔离原则:类和类之间使用接口练习
7、迪米特法则:一个对象应该对其他对象尽可能少了解。
12、SVN版本控制
SVN简介及优势
SVN是一个版本控制工具,用于多个人共同开发同一个项目,实现共享资源,实现集中式的代码管理;SVN可以记录文件的每一次修改,并且可以恢复到任意版本;每个开发人员可以在自己的客户端进行独立的开发工作,并且可以随时将新代码提交给服务器,同时也可以通过更新操作获取服务器上的最新代码,从而保持与其他开发者所使用版本的一致性。
版本冲突
因为同时有多个人对同一个文件进行操作从而导致后来者无法正常提交的现象我们称之为冲突。冲突的本质其实就是在我们执行更新操作时服务器上的文件版本和我们之后执行提交操作时的文件版本已经变得不一致。
举个例子:
在SVN服务器上有一个java类Emp.java,由项目经理上传,版本为1.0
然后甲和乙两名程序员分别将其更新到本地进行修改。
甲在原有基础上添加了job属性,然后将版本信息改为了2.0,将作者信息修改为自己的名字,最后执行提交操作,成功提交之后,SVN服务器上的文件将更新为甲修改后的版本。
同时,乙也在本地对该文件进行修改,添加了sex属性,修改版本信息和作者,但是最后一步的提交操作将不被SVN服务器允许。
如果要避免冲突,就要保证你的代码一直与SVN中的代码一致,但这实际上是不可能的,就算你在每次写代码前都update一下代码,冲突依旧可能产生。
所以这时候我们就要解决冲突——如果可以直接merge,那么就直接merge。如果不能merge,就得手动合并代码了,如果冲突过于复杂,很难进行合并,那么就必须有一方进行回滚操作了。