软件设计实践数据结构与算法基础实验.docx
- 文档编号:24968881
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:24
- 大小:586.70KB
软件设计实践数据结构与算法基础实验.docx
《软件设计实践数据结构与算法基础实验.docx》由会员分享,可在线阅读,更多相关《软件设计实践数据结构与算法基础实验.docx(24页珍藏版)》请在冰豆网上搜索。
软件设计实践数据结构与算法基础实验
《软件设计实践1》课程实验报告
课程名称:
软件设计实践
实验名称:
数据结构与算法基础实验
班级:
计算机姓名:
学号:
[任务六]关于LINQ与SQL注入的简答。
要求1,2,3,4标注,不允许整段混在一起。
需举例说。
答:
1.LINQ(LanguageIntegratedQuery)即语言集成查询。
从技术角度而言,LINQ定义了大约40个查询操作符,如select、from、in、where以及orderby(C#中)。
使用这些操作符可以编写查询语句。
不过,这些查询还可以基于很多类型的数据,每个数据类型都需要一个单独的LINQ类型。
LINQ提供了一条更常规的途径即给NetFramework添加一些可以应用于所有信息源的具有多种用途的语法查询特性。
这些语法特性就叫做NETLanguageIntegratedQuery(LINQ)。
用于保存和检索来自不同数据源的数据,从而消除了编程语言和数据库之间的不匹配,以及为不同类型的数据源提供单个查询接口。
LINQ总是使用对象,因此可以使用相同的查询语法来查询和转换XML、对象集合、SQL数据库、ADO。
NET数据集以及任何其他可用的LINQ提供程序格式的数据。
LINQ主要包含以下三部分:
1、LINQtoObjects 主要负责对象的查询。
2、LINQtoXML 主要负责XML的查询。
3、LINQtoADO.NET 主要负责数据库的查询。
LINQtoSQL
LINQtoDataSet
LINQtoEntities
特点
1)熟悉的语言:
开发人员不必为每种类型的数据源或数据格式学习新的语言。
2)更少的编码:
相比较传统的方式,LINQ减少了要编写的代码量。
3)可读性强:
LINQ增加了代码的可读性,因此其他开发人员可以很轻松地理解和维护。
4)标准化的查询方式:
可以使用相同的LINQ语法查询多个数据源。
5)类型检查:
程序会在编译的时候提供类型检查。
6)智能感知提示:
LINQ为通用集合提供智能感知提示。
7)整形数据:
LINQ可以检索不同形状的数据。
2.SQL:
结构化查询语言(StructuredQueryLanguage)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
所谓SQL注入,简单来说就是利用SQL语句在外部对SQL数据库进行查询,更新等动作。
就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
[1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击。
特点
1)一体化:
SQL集数据定义DDL、数据操纵DML和数据控制DCL于一体,可以完成数据库中的全部工作。
2)使用方式灵活:
它具有两种使用方式,即可以直接以命令方式交互使用;也可以嵌入使用,嵌入到C、C++、FORTRAN、COBOL、JAVA等主语言中使用。
3)非过程化:
只提操作要求,不必描述操作步骤,也不需要导航。
使用时只需要告诉计算机“做什么”,而不需要告诉它“怎么做”。
4)动词,语法接近英语口语。
[任务七]关于程序设计风格的简答。
要求1、2、3、4标注,不允许整段混在一起。
需举例说明。
(1)变量命名:
匈牙利命名法、骆驼命名法、帕斯卡命名法
匈牙利命名法:
是一种编程时的命名规范。
基本原则是:
变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。
要基于容易记忆容易理解的原则。
保证名字的连贯性是非常重要的。
举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为Switchboard时,变量全称应该为frmSwitchboard。
这样可以很容易从变量名看出Switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成lblSwitchboard。
可以看出,匈牙利命名法非常便于记忆,而且使变量名非常清晰易懂,这样,增强了代码的可读性,方便各程序员之间相互交流代码。
骆驼式命名法(Camel-Case):
又称驼峰式命名法,是电脑程序编写时的一套命名规则(惯例)。
指混合使用大小写字母来构成变量和函数的名字。
程序员们为了自己的代码能更容易的在同行之间交流,所以多采取统一的可读性比较好的命名方式。
骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母,例如:
myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。
帕斯卡命名法:
指当变量名和函式名称是由二个或二个以上单字连结在一起,而构成的唯一识别字时,用以增加变量和函式的可读性。
规则:
单字之间不以空格断开或连接号(-)、底线(_)连结,第一个单字首字母采用大写字母;后续单字的首字母亦用大写字母,例如:
FirstName、LastName。
每一个单字的首字母都采用大写字母的命名格式,被称为“Pascal命名法”,源自于Pascal语言的命名惯例,也有人称之为“大驼峰式命名法”(UpperCamelCase),为驼峰式大小写的子集。
(2)举例说明什么是设计模式,请举例说明3种以上的常用设计模式。
设计模式(Designpattern):
代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。
这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式使代码编制真正工程化。
设计模式是软件工程的基石,如同大厦的一块块砖石一样。
项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
设计模式分为三种类型,共23种。
1)创建型模式:
单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
2结构型模式:
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
3)行为型模式:
模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。
下面的是常见的三种设计模式:
工厂模式
工厂模式(Factory):
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
FactoryMethod使一个类的实例化延迟到其子类。
适用性
1)当一个类不知道它所必须创建的对象的类的时候。
2)当一个类希望由它的子类来指定它所创建的对象的时候。
3)当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
单例模式
单例模式:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用性
1)当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
2)当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
适配器模式
适配器模式:
将一个类的接口转换成另外一个客户希望的接口。
Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用性
1)想使用一个已经存在的类,而它的接口不符合需求。
2)想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
3)(仅适用于对象Adapter)想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。
对象适配器可以适配它的父类接口。
组合模式
组合模式:
将对象组合成树形结构以表示“部分-整体”的层次结构。
Composite使得用户对单个对象和组合对象的使用具有一致性。
适用性
1)想表示对象的部分—整体层次结构。
2)希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
(3)如何异常处理:
C++中如何进行异常处理,怎样处理?
C++提供的异常处理机制可以允许程序员自己对异常进行捕获,根据捕获到的异常类型,自己进行处理,这样使得程序员对于自己的程序具有更大的控制权限。
异常处理需要以下三个关键字:
throw、catch、try。
1)throw:
当问题出现时,程序会抛出一个异常。
这是通过使用throw关键字来完成的。
2)catch:
在您想要处理问题的地方,通过异常处理程序捕获异常。
catch关键字用于捕获异常。
3)try:
try块中的代码标识将被激活的特定异常。
它后面通常跟着一个或多个catch块。
异常处理方式:
1.抛出异常
使用throw语句在代码块中的任何地方抛出异常。
throw语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。
以下是尝试除以零时抛出异常的实例:
doubledivision(inta,intb)
{
if(b==0)
{
throw"Divisionbyzerocondition!
";
}
return(a/b);
}
2.捕获异常
catch块跟在try块后面,用于捕获异常。
您可以指定想要捕捉的异常类型,这是由catch关键字后的括号内的异常声明决定的。
try
{
//保护代码
}catch(ExceptionNamee)
{
//处理ExceptionName异常的代码
}
(4)合理标注解释
说明:
注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。
1、一般情况下,源程序有效注释量必须在20%以上。
2、说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释。
3、注释必须列出:
版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。
4、函数头部应进行注释,列出:
函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。
5、注释的内容要清楚、明了,含义准确,防止注释二义性。
6、避免在注释中使用缩写,特别是非常用缩写。
7、注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
8、于所有有物理含义的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释。
9、数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。
对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。
10、全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。
11、注释与所描述内容进行同样的缩排。
12、将注释与其上面的代码用空行隔开。
13、对变量的定义和分支语句(条件分支、循环语句等)必须编写注释。
14、对于switch语句下的case语句,如果因为特殊情况需要处理完一个case后进入下一个case处理,必须在该case语句处理完、下一个case语句前加上明确的注释
15、避免在一行代码或表达式的中间插入注释。
16、在代码的功能、意图层次上进行注释,提供有用、额外的信息。
(5)用简单易懂的写法,减少不必要的技巧
1、在写一个接口、类或者接口方法之前,须根据产品需求,理清思路。
否则,到后期维护时会很困难。
2、在写class或者某个方法时,试着给予明了易懂的名称,以减少不必要的注解。
3、小心冗长的方法。
冗长的方法会使方法的调用动作不易撰写、阅读、维护。
应该试着将该方法搬移到更适当的类或接口中,并尽量以对象为引数。
4、不要一再重复。
如果某段程序代码不断出现于许多derivedclass函数中,最好将该段程序代码置于某个baseclass方法内,然后在derivedclass函数中调用。
这么做不仅可以省下程序代码空间,也可以让修改该段程序代码动作更易于进行。
有时候找出此种共通程序代码还可以为接口增加实用功能。
5、在构造函数中只做惟一必要动作:
将对象设定至适当状态。
避免调用其他函数(除了final函数),因为这些函数可能会被其他人覆写因而使你在建构过程中得不可预期的结果。
在达到以上基本的编写规范之后,需要考虑系统的性能瓶颈的问题。
1、小心“巨大对象”。
这往往是刚踏OOP领域的过程式程序员的一个苦恼,因为他们往往最终还是写出一个过程式程序,并将它们摆放到一个或两个巨大对象中。
注意,除了应用程序框架之外,对象代表的是程序中的观念,而不是程序本身。
2、每个类都应该有单一而清楚的用途。
如果它很大,那么它工作量过多的机会就可能很高。
重新设计类的建议:
1)复杂的switch语句:
请考虑运用多态。
2)许多方法各自处理类型极为不同的动作:
考虑切割为多个不同的类。
3、尽可能的减少内存与数据库或缓存的交互,减少不必要的网络延迟:
1)慎用for循环,尽量不要再for循环里面访问数据库
2)优化sql语句,能一次取出的数据不要分多次取
程序代码被阅读的时间多于它被撰写的时间,清晰的设计能够制作出易懂的程序,需不断学习优秀的编程习惯和清晰的程序设计思路。
(6)布局风格
程序设计风格指一个人编制程序时所表现出来的特点,习惯逻辑思路等。
在程序设计中要使程序结构合理、清晰,形成良好的编程习惯,对程序的要求不仅是可以在机器上执行,给出正确的结果,而且要便于程序的调试和维护,这就要求编写的程序不仅自己看得懂,而且也要让别人能看懂。
随着计算机技术的发展,软件的规模增大了,软件的复杂性也增强了。
为了提高程序的可阅读性,要建立良好的编程风格。
风格就是一种好的规范,当然我们所说的程序设计风格肯定是一种好的程序设计规范,包括良好的代码设计,函数模块,接口功能以及可扩展性等,更重要的就是程序设计过程中代码的风格,包括缩进,注释,变量及函数的命名,泛型和容易理解。
源程序文档化
(1)标识符应按意取名。
(2)程序应加注释。
注释是程序员与日后读者之间通信的重要工具,用自然语言或伪码描述。
它说明了程序的功能,特别在维护阶段,对理解程序提供了明确指导。
注释分序言性注释和功能性注释。
序言性注释应置于每个模块的起始部分,主要内容有:
①说明每个模块的用途、功能。
②说明模块的接口:
调用形式、参数描述及从属模块的清单。
③数据描述:
重要数据的名称、用途、限制、约束及其他信息。
④开发历史:
设计者、审阅者姓名及日期,修改说明及日期。
数据说明原则
为了使数据定义更易于理解和维护,有以下指导原则:
(1)数据说明顺序应规范,使数据的属性更易于查找,从而有利于测试、纠错与维护。
例如按以下顺序:
常量寿命、类型说明、全程量说明、局部量说明。
(2)一个语句说明多个变量时,各变量名按字典序排列。
(3)对于复杂的数据结构,要加注释,说明在程序实现时的特点。
语句构造原则
语句构造的原则是:
简单直接,不能为了追求效率而使代码复杂化。
为了便于阅读和理解,不要一行多个语句。
不同层次的语句采用缩进形式,使程序的逻辑结构和功能特征更加清晰。
要避免复杂的判定条件,避免多重的循环嵌套。
表达式中使用括号以提高运算次序的清晰度等等。
输入输出原则
输入和输出在编写输入和输出程序时考虑以下原则:
(1)输入操作步骤和输入格式尽量简单。
(2)应检查输入数据的合法性、有效性,报告必要的输入状态信息及错误信息。
(3)输入一批数据时,使用数据或文件结束标志,而不要用计数来控制。
(4)交互式输入时,提供可用的选择和边界值。
(5)当程序设计语言有严格的格式要求时,应保持输入格式的一致性。
(6)输出数据表格化、图形化。
输入、输出风格还受其他因素的影响,如输入、输出设备,用户经验及通信环境等。
追求效率原则
指处理机时间和存储空间的使用,对效率的追求明确以下几点:
(1)效率是一个性能要求,目标在需求分析给出。
(2)追求效率建立在不损害程序可读性或可靠性基础上,要先使程序正确,再提高程序效率,先使程序清晰,再提高程序效率。
(3)提高程序效率的根本途径在于选择良好的设计方法、良好的数据结构算法,而不是靠编程时对程序语句做调整。
(7)其他建议
答:
除了变量命名,设计模式,异常处理,简单易懂的方法编写程序,减少不必要的麻烦,程序风格的规范化以外,我们在写程序时还要注意程序设计过程当中使用的算法难度以及处理方法,提高效率。
[题目八]关于MVC的简答。
要求1、2、3、4标注,不允许整段混在一起。
(1)熟悉C#或C++里的MVC结构,并给出一个MVC框架模型实例。
MVC全名是ModelViewController,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
MVC设计模型:
定义:
MVC设计模型是一种使用ModelViewController(模型-视图-控制器)设计创建Web应用程序的模式。
mvc模型是一种用来写web应用程序的样式。
Model(模型):
是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图):
是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器):
是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
实例:
一、创建项目
选择ASP.NETWeb应用程序,并给项目取名
二、选择MVC模板
所谓MVC,即Model+View+Control,在资源管理器中已经自动生成相应的文件夹
三、在Web.config中新增连接字符串
本例中Name设置为:
myQuerConnection,AttachDbFilename的值即数据库的绝对路径,可在SQLServer中查到。
D: \Program Files\MicrosoftSQLServer\MSSQL10.MSSQLSERVER\MSSQL\DATA\tmpWeb.mdf;InitialCatalog=tmpWeb;IntegratedSecurity=True"providerName="System.Data.SqlClient"/> 四、创建一个表或者一个视图,取名: ProductsDBs 包含ID、品号、品名、规格、单位、成本单价,其中ID是必须的,EF模型与数据库表之间的联系它是必不可少的,最好设置为主键。 五、创建MODEL 鼠标指向资源管理器Models文件夹,右键添加->类 类名取为myQuer,代码如下: A、添加Entity声明引用。 B、定义类ProductsDB,注意这个类名与上述数据库名的区别,少一个s。 C、定义连接字符串类MyquerConnection,与上述Web.config中的连接字符串一致。 六、添加控制器 鼠标指向Controls文件夹,右键添加->控制器 选择包含视图的MVC5控制器 模型类选择ProductsDb 数据上下文类选择myQuerConnection 控制器名称改为: ProducsController 七、这个时候再来看资源管理器 CMV三个文件夹都有了相应的文件 八、运行项目,在浏览器中可看到如下窗口,这是EF默认的格式,下面将改成条件查询的方式 九、改造成条件筛选查询方式 A、修改Views->Products下面的index.cshtml 完成后代码如下: @modelIEnumerable @{ ViewBag.Title="产品信息查询"; }产品信息查询
@using(Html.BeginForm())
{
品号:
@Html.TextBox("Search_code")
品名:
@Html.TextBox("Search_name")
规格:
@Html.TextBox("Search_spec")
}
@Html.DisplayNameFor(model=>model.品号)
@Html.DisplayNameFor(model=>model.品名)
@Html.DisplayNameFor(model=>model.规格)
@Html.DisplayNameFor(model=>model.单位)
@Html.DisplayNameFor(model=>model.成本单价)
@foreach(variteminModel){
@Html.DisplayFor(modelItem=>item.品号)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件设计 实践 数据结构 算法 基础 实验
copyright@ 2008-2022 冰点文档网站版权所有
经营许可证编号:鄂ICP备2022015515号-1