原型法和面向对象的分析与设计方法(2)

原型法和面向对象的分析与设计方法(2),第1张

2.原型法(prototyping)

(1)原型法定义

原型法是指在获取一组基本的需求定义后,利用高级软件工具可视化的开发环境,快速地建立一个目标系统的最初版本,并把它交给用户试用、补充和修改,再进行新的版本开发。反复进行这个过程,直到得出系统的“精确解”,即用户满意为止。经过这样一个反复补充和修改过程,应用系统 “最初版本”就逐步演变为系统 “最终版本”。

原型法就是不断地运行系统“原型”来进行启发、揭示、判断、修改和完善的系统开发方法。

(2)原型(prototype)

原型(prototype)即样品、模型的意思。把系统主要功能和接口通过快速开发制作为“软件样机”,以可视化的形式展现给用户,及时征求用户意见,从而明确无误地确定用户需求。同时,原型也可用于征求内部意见,作为分析和设计的接口之一,可方便于沟通。

对原型的基本要求包括:体现主要的功能;提供基本的界面风格;展示比较模糊的部分以便于确认或进一步明确;原型是可运行的,至少在各主要功能模块之间能够建立相互连接。

原型可以分为三类:

① 淘汰(抛弃)式(disposable):目的达到即被抛弃,原型不作为最终产品。

② 演化式(evolutionary):系统的形成和发展是逐步完成的,它是高度动态迭代和高度动态的循环,每次迭代都要对系统重新进行规格说明、重新设计、重新实现和重新评价,所以是对付变化最为有效的方法。

③ 增量式(incremental):系统是一次一段地增量构造,与演化式原型的区别在于增量式开发是在软件总体设计基础上进行的。很显然,其应付变化的能力比演化式差。

在信息系统设计的过程中,常用的各种不同形式的部分原型有:

① 对话原型

原型模拟预期的终端交互,使用户可以从屏幕上查看他们将接收什么、进行的 *** 作,并提出遗漏之处,从而加深正确的理解。终端对话的设计效果直接影响着系统的可用性和用户对系统的接受程度。

② 数据输入原型

建立数据输入的原型,可以检查数据的输入速度和正确性,还能进行有效性和完整性的检查。

③ 报表系统原型

提供给用户的各种报告应在整个系统实现之前给用户看,报表子系统需要经常进行大量修改以满足系统的需要,因此,可以把报表生成器作为原型。

④ 数据系统原型

首先生成一个含有少量记录的原型数据库,这样用户和分析员与它可以进行交互,生成报表和显示有用信息。这种交互经常导致产生对不同的数据类型、新的数据域或不同的数据组织方式的需求,还可以在原型化工具的帮助下探索用户将如何使用信息以及数据库是什么样的。

⑤ 计算和逻辑原型

有时一个应用逻辑或计算是复杂的。审计员、工程师、投资分析员和其他用户可以使用高级程序设计语言建立他们所需的计算实例。这些实例可以组合在一起构成一个大的系统,与其它应用系统、数据库或终端相连接,用户可以使用这些计算原型检验他们所求结果的准确性。

⑥ 应用程序包原型

在一个应用程序包和其它应用系统相连或实际使用之前,可以通过一个小组用户来鉴定这个应用程序包是否令他们满意,若不满意可以进行大量的修改,直到令他们满意。

⑦ 概念原型

有时,一个应用概念不能被正确全面地理解,这是信息系统设计中存在的问题。在花费大额经费来建立这个系统之前,需要进行测试和细化。可以用一个快速实现的数据管理系统来测试,使用标准的数据输入屏幕和标准的报表格式,以减少测试和细化其概念的工作量。在测试和细化之后,对概念有了明确的理解,再进行建立该应用的特定报表和屏幕等细节工作。

(3)原型法意义

原型法意义是可视化,强化沟通,降低风险,节省后期变更成本,提高项目成功率。一般来说,采用原型法后可以改进需求质量;虽然投入了较多先期的时间,但可以显著减少后期变更的时间;原型法投入的人力成本代价并不大,但可以节省后期成本;对于较大型的软件来说,原型系统可以成为开发团队的蓝图;另外,原型通过充分和客户交流,还可以提高客户满意度。

原型法是在计算机技术发展到一定阶段,用户应用需求高涨的情况下发展的一种方法论,但它同时又是对开发人员有高要求的一种方法论。

满足两个条件 :

    1无序的数据集合

    2键值对的集合

使用Objectkeys(obj) 可以得到obj的所有key

如何用变量做属性

delete objname   或者 delete obj['name']

请区分属性值为undefined 和不含属性名

不含属性名(查看是否含有属性名方法:'XXX' in obj === false)

含有属性名,但是值为undefined

"xxx" in obj && objxxx ===undefined

查看自身所有属性

Objectkeys(obj) //查看所有的key

Objectvalues(obj) //所有的value

Objectentries(obj) //key和value值 以数组形式查看

查看自身+共有属性 

consoledir(obj)  推荐用法

或者自己依次用Objectkeys打印出obj__proto__(不推荐,因为它里面的共有属性比较多)

判断一个属性是自身的还是共有的

objhasOwnProperty('toString')

总结:'name' in obj 和objhasOwnProperty('name')的区别:前者为查看是否有属性名 后者是判断一个属性是自身属性还是共有属性

修改属性 var obj={name:'frank' ,age:18}  修改属性直接objname重新赋值 写法 objname = 'lulu'

添加属性 objwuwuwu = 'wuwuwu'

批量添加属性 Objectassign(obj,{p1:1,p2:2,p3:3,p4:4})

比如上面的obj 我们可以通过修改它的obj__proto__来修改原型  但是这种方法不推荐 一般推荐用另一种 windowObjectprototype 

windowObjectprototype=obj__proto__   //true

对象的原型图

当我们创建一个对象时 let obj = { age: 25 },我们可以发现能使用很多种函数,但是我们明明没有定义过它们,对于这种情况你是否有过疑惑?

其实每个 JS 对象都有 proto 属性,这个属性指向了原型。这个属性在现在来说已经不推荐直接去使用它了,这只是浏览器在早期为了让我们访问到内部属性 [[prototype]] 来实现的一个东西。

讲到这里好像还是没有弄明白什么是原型,接下来让我们再看看 proto 里面有什么吧。

看到这里你应该明白了,原型也是一个对象,并且这个对象中包含了很多函数,所以我们可以得出一个结论:对于 obj 来说,可以通过 proto 找到一个原型对象,在该对象中定义了很多函数让我们来使用。

在上面的图中我们还可以发现一个 constructor 属性,也就是构造函数

打开 constructor 属性我们又可以发现其中还有一个 prototype 属性,并且这个属性对应的值和先前我们在 proto 中看到的一模一样。所以我们又可以得出一个结论:原型的 constructor 属性指向构造函数,构造函数又通过 prototype 属性指回原型,但是并不是所有函数都具有这个属性,Functionprototypebind() 就没有这个属性。

所以每一个构造函数都有一个原型对象(也就是Personprototype),每一个原型对象都有一个指针constructor指向构造函数,每一个实例都有一个内部指针( proto ),指向原型对象,原型对象上的属性和方法能被实例所访问

类与类之间的关系 基类 父类 子类

在对象上面都会有个一个prototype的属性里面包含了当前对象上的方法,有时我们可以将方法封装在原型上面方便我们循环使用

下面写个获取时间的例子

在方法的原型上添加了一个自己封装的方法,然后再用这个对象的原型上的方法会打印出这样的一个数据格式

所以原型上添加方法上方便我们的循环利用

每个JS对象一定对应一个原型对象

我们所创建的每一个函数,解析器都会下个函数中添加一个属性prototype。每一个函数都有自己唯一的prototype

如果函数作为普通函数被调用,prototype没有任何作用

如果作为构造函数被调用,每一个创建的实例都会有一个__proto__ 隐含属性,这个属性指向这个函数的原型对象

原型对象相当于一个公共区域,所有同意一个类的实例都可以访问这个原型对象,因此可以把这些实例的共有内容放到原型对象中。

语法:MyClassprototype(属性、方法) = 具体属性或方法

当进行访问时,会先在对象内部寻找调用的属性或者方法,如果没有,再去原型对象中寻找。

原型对象的优点

因为在创建构造函数时可以将共有属性全部添加到原型对象中,所以不需要对单个对象添加这些属性或方法,可以减少代码量,也不会影响全局作用域,直接就可以使每个对象都拥有这些属性核方法。

in

使用in可以检查对象中是否有该属性,但是原型中有,依然会返回true。

hasOwnProperty

可以检查对象中是否含有该属性,这个方法只有当对象自身含有该属性时才返回true。

原型对象也是一个对象,它也有原型对象。所以当原型对象中没有这些属性或方法时,还会去原型对象的原型对象中寻找,知道找到Object的原型对象中,都没有找到的话就是undefined。

对象的toString方法

在页面中直接打印一个对象:[Object Object],这是toString方法的返回值。

如果希望输出的时其他的内容,可以修改toString方法,也就是在原型对象中添加一个toString方法。

原型对象实现继承

function Father(){};function son(){};// 父类方法Fatherprototypemoney = function(){};// son继承father的方法,直接拷贝会出现问题// 直接加这一行赋值代码,会使父类也拥有exam方法Sonprototype = Fatherprototype;// 可以添加子类独有的方法Sonprototype = function exam(){}

避免出现以上的问题,就有了新的解决方案

// Father的实例可以访问原型对象,因此,Son就可以使用Father的原型对象里边的方法Sonprototype = new Father(){};// 如果利用对象的形式修改了原型对象,别忘记使用constructor指回原来的构造函数Sonprototypeconstructor = Son;

以上就是关于原型法和面向对象的分析与设计方法(2)全部的内容,包括:原型法和面向对象的分析与设计方法(2)、object 对象 及原型原型链、原型、原型对象和继承等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9329022.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存