|
第5章 抽象
某某牛人说过,增加抽象是一切解决问题的方法!!
时代改变了!!以前是手工软件作坊时代,,现在是软件工程时代!!!
5.1 人与软件
应用越来越接近人了,比如web2.0,3.0的出现,这是指软件产品的应用,实际上在软件被作为产品被产生出来时也作了靠近人的调整,编程领域的三个东西,问题域,方案域,人都在相互影响,这种影响产生了一些技术,导致了一些编程的变革,并最终与人们的观念结合,比如OO,比如设计模式,这也将导致架构变成软件的功能性"实现"要考虑的,在某个维度上加深了复杂度,然而却在另外一些维度上提供了简单的形式和更有效的应用
某些东西越来越统一和规范了,这加大了学习的门槛,比如xml出现,就统一了文档交互的格式,并导致了很多逻辑知识,产生了一些新的逻辑,需要被学习,但这是合理的,因为形式更加简单了统一了,并改变了一些应用的形式,比如软件分发delopy的统一形式等,
另外一趋势,应用越来越分布了和趋向web,这实际上是很多年前某些大公司的战略,总有那么一群人(有些人研究应用形成架构,有些人研究编程低层形成架构和思想),先知先觉地认识到一些东西,比如.net的出现,网上的资源服务器越来越变成一般应用服务器,富客户端的flex,silverlight等等,只是它们是慢慢被民间所识所学习.
一切技术都是面向被应用,因此人无论如何都是主导.将反过来最终影响技术的被利用形式而隐藏了低层实现,一些离最终应用跨度太大的低层实现不必知道其原理,靠近人的一端要提供尽量简单的形式,比如xml,比如oo,面向机器的一端永远有它的实现
5.2 软件活动的特点
别空想设计,设计也是源于迫切要解决的问题(设计跟需求分析有关),你说的设计需要可能是一个空想的禁固。。
软件需要你考虑每一个细节,因为这不比盖房子,,做软件需要你从大量小逻辑促成应用(每一个部分都可能需要你造轮子)。
方案域用于表达应用的抽象元素只有类是最大的,库是最大的,这种细小性决定要去的地方,要达到的应用还很远。软件活动是一个真正体现人类心智的地方。是一个真正工程级的活动(程序员作为实现者可以不懂大设计和系统级的设计,但设计师要管)。
而且现实生活中软件活动通常都是变化的:代码在变化,设计在变化,连需求都在变化。
C++为什么不是单一OO泛型而是多泛型的呢,因为设计就是多选题,你无法找到其单一性,这就跟policy based design一样的道理。
实际上,软件的设计可以不具有任何需求的成份,,只是在人类的具体活动中,往往需求会影响设计而已。。
模式分为三种,问题模式,设计模式,代码模式,MVC是一种表达窗口的现实问题模式,此时用mvc复用设计模式就最好表达了。而mvc被policy based design实现了,所以它首先也是一种代码模式了。
设计期聚 集于程序员,运行期聚 集于用户,,比如当设计深入应用时,语言的设计和运行功能都要很强,,设计时不可能预测用户点了什么菜单。
5.2 抽象与接口
什么是架构,架构是设计的上上层部分..比如网络七层模型,甚至PC的冯氏模型..这些设计的上上层部分深刻影响了计算机后来的东西.不可轻易更改.
不可思议的不是代码,不是编码,而正是人类的大脑,而正是设计,,
在设计一种平台时,语言和OS是一个架构的基础部分(在OS内部更多地存在设计),应用再在这个上面慢慢搭建.
如果你看过google的手机平台设计,就会发现语言这个图灵装备往往是架构的最基础部分。如果说机器语言或汇编语言是严格基于平台逻辑的,那么高级语言基于严格的语言机制和语言语法,具有严格的图灵装备,,负责产生后来的逻辑和用户级的应用逻辑,本来OS是不需要语言的
语言尽可能小,直接面向真实平台不要虚拟机,因为加了虚拟机执行方式会很慢,,而且,语言应作为OS的内核一部分.就像WINDOWS把GUI接口加入core一样,这样的语言执行效益很快.这样的语言也就称为系统开发语言..与之对应的是应用开发语言,或称脚本语言.
在底层,汇编是一种几乎对应机器语言的东西,因为汇编语言无语法.只是名称指称,助记符..C作为中间语言,汇编只需要提供接口给C,C还应在编译期提供一个编译期多态
为什么脚本语言多称为语言粘合剂呢..因为脚本语言往往提供对多种系统编程语言.数据类型的内存模型的封装.提供了对这些语言的多种接口,,,但更主要的,脚本语言被称为脚本语言,,,更在于它面向用户的其它特域相关和特定工作相关的语言机制(比如Lua的多协程常被用来游戏,,而这显然不是通用语言应在语法级应提供的)也许脚本语言只需要提供与其它语言的粘合接口就可以了
在上层,我们应该提供一种"无语法"语言的DSL脚本(比如SQL,好像脚本语言跟解释型语言几乎同意),,这种语言最好还是无类型的,,这样做的目的是方便程序员,但不好用来开发平台逻辑(因为平台语言,要求严格的类型机制)
这种语言是自然语言描述性的,,重复性的句子并不会产生双份的运行负担
设计应该被配置,而不是被编码,设计语言应是一门非图灵完备的独立语言(要考虑到它的通用性而不是DSL就更好了)。
我们看到的大多数语言都是图灵完备的,而我觉得C++应改编成一个解释执行、无语法的语言,因为应用语言往往需要做成即时修改的脚本语言
应该如何设计接口呢,OO=抽象+接口,,那么其体现又是怎么样的??只有深克地分析了应用和计算机本身,你才能分析出通用和最精简的接口机制,而OO正是这样一种机制..因为类=数据加函数,,数据加函数既对应计算机世界,又是解释现实事物的一种机制...当然.OO不单是这种理念,还要学习它的运行期多态,继承等(语言语义)..
学高级语言应不仅学它语法,而且要学它语义..因为被翻译后的代码才是代码最初被产生的地方,是最应该被研究的..
接口应尽量窄,提供尽可能少的东西,,但在概念上一定要广,,以备后来的扩展需要.这样的接口,对于复用来说,也是可以花最少的精力来学习的.什么是抽象呢,,,就是抽取对于人来说象的部分....把多种特征的东西在概念上整合为一个认识,,,抽象出接口就是这个意思...其实,抽象正是为了简单,,而不是复杂化(它只是极力把复杂化的低层细节隐藏,透露给人们一个通用的,可认识的抽象概念,即接口)
deepest concept,lowest interface = min learning
对接口编程即,将需要维持不变的东西,即设计,维护在接口层,即变化的东西,实现,维持在接口层以外的地方。
如何从以上二种机制理解OO呢,,,OO为什么这么流行,,因为OO“很好很强大”.. |
|