一、软件开发是什么
有形的工具是人类肢体的延伸;计算机系统则是人类大脑的延伸:
将人脑中的系统模型放到计算机系统中运转,从而将人脑解放出来做更有价值的事情。
“人脑中的系统模型”能够比喻成导演脑中的电影,在真正拍摄之前,导演会在本人的脑中播放,然后经过演员、道具等再现一遍。抑或比喻成电器设计师脑中的电器设备,在投产之前,在设计师脑中是有完好的电器仿真的。
将 “人脑中的系统模型”变成能够在计算机系统中可运转的系统的过程即为软件开发。
设计师脑中的电器模型必需和当前的消费工艺和技术程度相顺应才干消费出产品,超前设计只能停留在概念阶段;导演天马行空的想象假如超越理想的拍摄技术限制也无法拍成电影。 “人脑中的系统模型”要最终变成可运转的计算机系统也遭到计算机技术开展程度的限制(包括硬件技术和软件技术的限制),必需做一些顺应性的调整,我们只是希望随着计算机技术的开展,这样的调整幅度越来越小,不要让我们的想象被迫打个折扣。
在计算机技术开展初期,计算机只能做一些科学计算,人类只能将一些“科学计算模型”交由计算机完成;随着计算机技术的开展,能够胜任更复杂的任务时,我们希望计算机系统可以协助我们做更多事情,不只仅是计算,还能做一些管理工作或处置一些繁琐的事务。
二、软件开发如何做
最开端,计算机只能用于一些科学计算,只能将人脑中的计算过程模型放到计算机中运转,软件开发的考虑方式很自然地是面向过程的,这一阶段的编程言语也是面向过程的。后来的构造化编程也只是代码层面的优化,即“改善程序的明晰性、质量,并且防止写出面条式代码”。
随着计算机硬件技术的开展和计算才能、存储才能的进步,计算机被应用到更多的范畴,这些范畴内的模型曾经不是线性的了,而是平面的有层次的,但是软件世界中由于受历史编程言语和编程思想的限制,还再继续用面向过程的编程思想和编程言语描写人脑中模型,这中间需求停止转换——将平面的有层次的模型转换成线性的过程模型,两者之间不能自然衔接。程序自身也由于不能直接反映人脑中的模型而显得晦涩难懂。
针对这些问题,面向对象思想开端兴起。面向对象编程来源于 Doug Englebart的观念:计算机是人类大脑的延伸。Alan Kay's Dynabook 后来创立了一门编程言语(Smalltalk)将他的观念经过代码完成。实践上,这位面向对象编程的先锋的目的就是用代码捕捉人们头脑中的模型。今天,图形交互界面的繁荣和面向对象言语的控制位置正是当年这些面向对象思想的结果。
但是"用代码捕捉人们头脑中的模型"的目的到目前也没有完整完成,当前处于控制位置的面向对象编程言语如Java,C++,C等都不能很好的捕获人脑中的模型。
人脑中模型大致上能够分为有生命的动态模型(人、组织和动物等)、响应式静态模型(机器、电子设备等)和完整静态模型(建筑、构造等)。现代的计算机系统普通是替代人类去处置事务,相似一个人或组织,描写的是人脑中的“有生命的动态模型”。 计算机系统有时也用于一些仿真、模仿等,描写的是人脑中的“响应式静态模型和完整静态模型”。现代编程言语能够很好地描写后两个模型,但不能很好地描写“有生命的动态模型”。现代面向对象编程言语中的对象和“响应式静态模型和完整静态模型”很接近,都是没有生命的,只在线程看到它并调用它时才有稍纵即逝的执行过程,即使如此现代面向对象编程言语在描写静态模型时还是有很多问题,比方人类中的“响应式静态模型和完整静态模型”可能是一个电子设备,遭到物理和几何特性的限制,组成电子设备的各组件之间是松耦合高内聚的,组件接口明晰、明白,组件之间的组装十分自然、容易。但是我们的程序中的对象却经常不是松耦合高内聚的,我们总以为比大自然可以做的更好,却常常堕入窘境。所以才产生了那么多的设计准绳、设计形式等来指导我们停止设计。
固然经过设计准绳、设计形式等的指导,我们能够比拟圆满的描写人脑中的“响应式静态模型和完整静态模型”,但是在描写“有生命的动态模型”时还是有些先天缺乏,言语层面不支持捕获模型中有生命的对象、角色变化和通讯方式等。比方组织单位中的每个人是独立的有生命的对象,其角色可能是多重的或可变换的,人与人之间的交流可能是直接的、同步的、异步的或间接经过对话机制停止交流。这些模型还无法经过现代面向对象言语直接停止表达。
将人脑中的模型放到计算机系统中运转的一个理想过程可能是这样的:
(1)人脑首先发挥其优点依照自然的方式(不按程序思想或计算机思想)树立业务模型
(2)业务模型不时细化成为能够完成业务需求的模型系统,并可以在人脑中顺畅的演绎运转。这个阶段应该输出最终的细致模型。
(3)计算机系统了解上一步输出的细致模型并发挥计算机相关于人脑的优势更好的运转这个模型,提供模型中预先定义的效劳。
在(2)和(3)之间理想状况应该如上述那样无缝衔接,或者至少可以比拟自然、容易地停止衔接。但是现代的编程言语还不能很好的描写人脑中的模型以到达自然地、容易地停止衔接的目的。下面就来谈谈现代面向对象言语的问题。
(一)、现代面向对象言语的是与非
1. 封装泄露问题
(1)对象的私有属性可能就是对象
(2)一切对象都生活在人人都可访问的堆空间中
私有属性可能会被共享进来——有时是成心设计成这样,但常常是不测的(我们只需求将属性对象的援用传送进来),无论哪种缘由,都意味着失去了对私有属性的本地控制,也失去了本地简单推理的的正确性,数据封装容易毁坏。外表上某个对象只能经过其公开的办法访问私有属性,但是却有很多躲藏的方式(直接修正私有属性援用的对象、经过反射机制访问私有属性等)访问到私有属性。
2. 内部状态分歧性问题
即使对象的私有属性是原始类型(如int, long等),也不能保证平安,例如下面的类A:
class A
{
private int count;
Thing thing = new Thing();
public void method1()
{
.....
count = 42;
thing.f();
......
}
}
method1中count=42;thing.f()执行之后,count的值时几呢?无法肯定,由于thing.f()调用可能会修正count的值。这种不肯定性有时防不胜防,就像我们似曾相识的全局变量问题。
上述的对象问题招致我们看到的(头脑中的模型)和实践执行的(计算机系统模型)不一样,很容易犯错,犯了错还认识不到。
3. 现代面向对象言语中的对象和我们OO思想中的对象不一样
(1)一切的对象都是死的,没有本人的生命
(2)一切的对象办法必需由外部线程调用--他们必需面向调用者
(3)恣意看见对象的线程都能够调用对象的办法,对象自身不能阻止对办法的调用
(4)即便对象自身处于不适宜的状态下,也不能阻止他人的访问,对象无法控制本人
(5)每个线程在调用对象办法时带给对象稍纵即逝的生命
(6)线程能够随意穿越对象的边境,毫不关注底层构造的状态能否失衡
(二)、回归面向对象思想
(1)对象封装数据和操作数据的算法
(2)对象中的数据和算法是私有的,外界无法看到数据,也不能直接执行组件中的办法
(3)对象有本人的生命(线程),对象中的算法有内部生命体执行
(4)对象之间通讯方式有多种:同步、异步、直接、间接、一对多、多对一、多对多等等,但都不是直接的办法调用,而是发送音讯
免费上门服务,认真做事,诚信待人,选择我们就对了。
备案号: 蒙ICP备2020003808号