目录
软件工程实务导论:
在当今数字化的世界中,软件已经成为了各行各业的核心。从智能手机应用到企业级软件系统,软件的重要性和需求不断增长。然而,开发高质量和可靠的软件并不是一件容易的事情。这就是软件工程的重要性所在。软件工程是一门关注如何构建可靠和高质量的软件的学科。它涵盖了软件开发的各个方面,包括需求分析、设计、编码、测试和维护等。通过遵循软件工程的原则和最佳实践,开发团队可以构建出满足用户需求的软件系统,并提供持续的支持和改进。
一、需求分析(800字):
需求分析是软件工程的第一步,也是最重要的一步。它涉及与客户和利益相关者沟通,了解他们的需求和期望。通过正确理解需求,开发团队可以更好地规划和设计软件系统,以满足用户的需求。在需求分析阶段,开发团队需要收集和整理需求,明确功能和非功能需求,并与客户进行确认和验证。同时,需求分析还需要考虑到软件系统的可扩展性、可维护性和性能等方面,以确保软件系统的长期可用性和可持续发展。
1.1系统需求
是这个系统必须执行/支持的所有活动和必须满足的约束条件。通常分为功能需求和非功能需求。
1.2功能需求:
系统必须执行的活动。以工资管理系统为例,可能包括电子支付、计算工资、计算工资税、维护员工相关信息、社保、医保、公积金缴纳等等。
功能需求是根据公司开展业务交易的过程和业务规则确定的。有时这些规则详细记录与文档,从而易于确定和描述;而另外的一些规则可能隐蔽而难以被发现。而尽早发现这类规则是需求分析的重要任务。
1.3非功能需求:
是系统的固有特征,它不同于系统必须执行或支持的活动。区别功能/非功能需求并不容易,人们开发了一些架构来识别和分类需求的方法,如FURPS+架构(功能、可用性、可靠性、性能、可支持性的首字母),
二、设计(900字)
设计阶段是软件工程中的关键步骤之一。在设计阶段,开发团队需要确定软件系统的整体结构和组件之间的关系。设计决策需要考虑到系统的可扩展性、可维护性和性能等方面。一个好的设计可以提高软件系统的可靠性和可维护性,并降低后续开发和维护的成本。在设计阶段,开发团队可以使用各种建模工具和技术,如UML(统一建模语言)和设计模式,来帮助他们进行系统设计和架构。
软件设计宣言-Mitch Kapor:“什么是设计?设计是你站在两个世界——技术世界和人类的目标世界——而你尝试将这两个世界结合在一起……”。
罗马建筑批评家Vitruvius提出的观念:“设计良好的建筑应该展示出坚固、适用和令人赏心悦目”。
设计阶段:
■从工程管理的角度,可以将软件设计分为概要设计阶段和详细设计阶段。
■从技术的角度,传统的结构化方法将软件设计划分为体系结构设计、数据设计、接口设计和过程设计4部分。
■面向对象方法则将软件设计划分为体系结构设计、类设计/数据设计、接口设计和构件级设计4部分。
结构化设计和结构化分析的关系:
总体设计过程:
首先寻找实现目标系统的各种不同的方案;然后分析员从这些供选择的方案中选取若干个合理的方案,从中选出一个最佳方案向用户和使用部门负责人推荐;分析员应该进一步为这个最佳方案设计软件结构,进行必要的数据库设计,确定测试要求并且制定测试计划。
必要性:
总体设计可以站在全局高度上,花较少成本,从较抽象的层次上分析对比多种可能的系统实现方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。
设计过程
由两个主要阶段组成:
1、系统设计阶段,确定系统的具体实现方案
■设想供选择的方案
■选取合理的方案
■推荐最佳方案
2、结构设计阶段,确定软件结构
■功能分解
■设计软件结构
■设计数据库
■制定测试计划
■书写文档
■审查和复审
典型的总体设计过程包括下述9个步骤:
1. 设想供选择的方案
根据需求分析阶段得出的数据流图考虑各种可能的实现方案,力求从中选出最佳方案。
2. 选取合理的方案
从前一步得到的一系列供选择的方案中选取若干个合理的方案。对每个合理的方案分析员都应该准备下列4份资料:
■系统流程图;
■组成系统的物理元素清单;
■成本/效益分析;
■实现这个系统的进度计划。
3. 推荐最佳方案
分析员应该综合分析对比各种合理方案的利弊,推荐一个最佳的方案,并且为推荐的方案制定详细的实现计划。
4. 功能分解
■首先进行结构设计,然后进行过程设计。
■结构设计确定程序由哪些模块组成,以及这些模块之间的关系;过程设计确定每个模块的处理过程。
■结构设计是总体设计阶段的任务,过程设计是详细设计阶段的任务。
5. 设计软件结构
■通常程序中的一个模块完成一个适当的子功能。应该把模块组织成良好的层次系统。软件结构可以用层次图或结构图来描绘。
■如果数据流图已经细化到适当的层次,则可以直接从数据流图映射出软件结构,这就是面向数据流的设计方法。
6. 设计数据库
对于需要使用数据库的那些应用系统,软件工程师应该在需求分析阶段所确定的系统数据需求的基础上,进一步设计数据库。
7. 制定测试计划
在软件开发的早期阶段考虑测试问题,能促使软件设计人员在设计时注意提高软件的可测试性。
8. 书写文档
应该用正式的文档记录总体设计的结果,在这个阶段应该完成的文档通常有下述几种:
(1) 系统说明
(2) 用户手册
(3) 测试计划
(4) 详细的实现计划
(5) 数据库设计结果
9. 审查和复审
最后应该对总体设计的结果进行严格的技术审查和管理复审。
三、编码(800字)
编码是将设计转化为实际代码的过程。在编码过程中,开发人员需要遵循一定的编码规范和最佳实践,以确保代码的质量和可读性。同时,编码过程中也需要进行代码审查和测试,以发现和修复潜在的问题。在编码阶段,开发团队可以使用各种编程语言和开发工具,如Java、Python和Eclipse等,来实现软件系统的功能和需求。
编码风格
一、程序的内部文档
1、恰当的标识符
2、适当的注解
3、程序的视觉组织
二、数据说明
1、数据说明的次序应该标准化。
2、当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量。
3、如果设计时使用了一个复杂的数据结构,则应该用注解说明用程序设计语言实现这个数据结构的方法和特点。
三、语句构造
1、不要为了节省空间而把多个语句写在同一行;
2、尽量避免复杂的条件测试;
3、尽量减少对“非”条件的测试;
4、避免大量使用循环嵌套和条件嵌套;
5、利用括号使逻辑表达式或算术表达式的运算次序清晰直观。
四、输入输出
1、对所有输入数据都进行检验;
2、检查输入项重要组合的合法性;
3、保持输入格式简单;
4、使用数据结束标记,不要要求用户指定数据的数目;
5、明确提示交互式输入的请求,详细说明可用的选择或边界数值;
6、当程序设计语言对格式有严格要求时,应保持输入格式一致;
7、设计良好的输出报表;
8、给所有输出数据加标志。
五、效率
1、效率主要指处理机时间和存储器容量两个方面。
2、效率是性能要求,因此应该在需求分析阶段确定效率方面的要求。
3、效率是靠好设计来提高的。
4、程序的效率和程序的简单程度是一致的,不要牺牲程序的清晰性和可读性来不必要地提高效率。
具体编码
对数据库的编码
新闻类
CREATE TABLE `news` (
`id` int(32) NOT NULL AUTO_INCREMENT,
`userid` int(32) NOT NULL,
`author` varchar(32) NOT NULL,
`coverimage` varchar(96) NOT NULL,
`title` varchar(30) NOT NULL,
`content` mediumtext NOT NULL,
`times` datetime NOT NULL,
`browses` int(32) NOT NULL DEFAULT '0',
`likes` int(32) NOT NULL DEFAULT '0',
`label` int(20) NOT NULL DEFAULT '0',
`pass` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `userid` (`userid`),
KEY `label` (`label`),
CONSTRAINT `news_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `user` (`id`),
CONSTRAINT `news_ibfk_2` FOREIGN KEY (`label`) REFERENCES `label` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8
用户类
CREATE TABLE `user` (
`id` int(32) NOT NULL AUTO_INCREMENT,
`uid` int(32) NOT NULL DEFAULT '1',
`userName` varchar(20) NOT NULL,
`passWord` varchar(20) NOT NULL,
`img` varchar(96) DEFAULT NULL,
`realName` varchar(96) DEFAULT 'NULL',
`xx` varchar(96) DEFAULT 'NULL',
PRIMARY KEY (`id`),
UNIQUE KEY `userName` (`userName`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8
对前端的编码
<!DOCTYPE html>
<html>
<head>
<title>News System</title>
<meta charset="utf-8">
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>News System</h1>
</header>
<main>
<section id="latest-news">
<h2>Latest News</h2>
<ul>
<li>
<a href="#">Article Title 1</a>
<p>Article summary goes here.</p>
</li>
<li>
<a href="#">Article Title 2</a>
<p>Article summary goes here.</p>
</li>
<li>
<a href="#">Article Title 3</a>
<p>Article summary goes here.</p>
</li>
</ul>
</section>
<section id="featured-article">
<h2>Featured Article</h2>
<article>
<h3>Article Title Goes Here</h3>
<p>Article content goes here.</p>
</article>
</section>
</main>
<footer>
<p>© 2021 News System</p>
</footer>
</body>
</html>
对后端接口的编写
@RestController
@RequestMapping("/New")
public class NewController {
@Autowired
private NewService newService;
//获取所有审核通过的新闻
@RequestMapping(value = "/getNewAll")//http://localhost:8888/New/getNewAll
@ResponseBody
public List<New> getNewAll(){
List<New> newList=new ArrayList<New>();
List<New> list=newService.getNewAll();
for(int i=0;i<list.size();i++){
// System.out.println(list.get(i).toString());
if(list.get(i).getPass()!=0){
newList.add(list.get(i));
}
}
//System.out.println(newList.toString());
return newList;
}
//根据标签获取已经审核通过的新闻
//http://localhost:8888/New/get
@RequestMapping(value = "get",method = RequestMethod.GET)
public List<New> get(int label){
if(label==0){
System.out.println(newService.getRe().toString());
return newService.getRe();
}else {
//System.out.println(label);
return newService.get(label);
}
}
四、测试(900字)
测试是软件工程中至关重要的一环。通过测试,开发团队可以验证软件系统的功能和性能是否符合预期。测试可以分为单元测试、集成测试和系统测试等不同层次,以确保软件系统的质量和稳定性。在测试阶段,开发团队需要制定详细的测试计划和测试用例,并使用各种测试工具和技术,如Junit和Selenium等,来执行测试和分析测试结果。通过测试,开发团队可以发现和修复潜在的问题,提高软件系统的质量和可靠性。
使用大量的边界数据对软件进行测试
五、维护(500字)
维护阶段是软件工程的最后一步,也是一个持续的过程。随着时间的推移,软件系统可能需要进行功能扩展、性能优化和错误修复等。维护阶段需要开发团队与用户和利益相关者保持良好的沟通,以确保软件系统的持续运行和改进。在维护阶段,开发团队需要进行版本控制和配置管理,以确保软件系统的稳定性和可维护性。同时,开发团队还需要进行用户支持和培训,以帮助用户更好地使用和理解软件系统。
六、总结
软件工程是一门关注构建可靠和高质量软件的学科。通过遵循软件工程的原则和最佳实践,开发团队可以构建出满足用户需求的软件系统,并提供持续的支持和改进。在软件工程的各个阶段,包括需求分析、设计、编码、测试和维护等,开发团队需要合理规划和管理资源,以确保项目的顺利进行和成功交付。希望本文对读者对软件工程有更深入的了解,并在实践中能够应用软件工程的原则和方法。