⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bianchenzhenyan.txt

📁 一部关于编程设计方面的箴言级的书籍
💻 TXT
📖 第 1 页 / 共 5 页
字号:
般接口需实现,逻辑需继承,此时其它库可按需进行plug in 或者out),这就是库引用库,这种情况下有一些
未端的实现是不应该加入中间封装的,比较好的作法是用一个库定义架构和基本工具函数集,以及对其它未
端工具库的接口逻辑(此时先前定义的那个库就是主库,其它的库是可选的辅库,比如Yake的实现就是这
样),实现就是最后一节提到的几个Demo(作为基础的逻辑已经被库封装起来,其它的就是实现了)
像Yake,它提供了一个Base core和很多构架上的接口逻辑,每个接口逻辑都实现了一个对外来库的引用,
Base core是工具函数集(也有一些接口逻辑),这是Yake的主体部分,而接口逻辑(Yake也在这里实现了一些
工具函数库比如)和对其它库的引用逻辑(也是一些Adapter)才是Yake的重要部分(Yake包括它的base和对
其它库的引入逻辑这二大部分,当然还有它的一些工具实现,这样算起来Yake有三大部分).
接口是可复用中一个很重要的概念。
?? 真正的DSL
编程新手真言 - GameRes.com 页码,14/101
mhtml:file://F:\Cpp\编程新手真言.mht 2008-7-30
声明性的语言是建立在编译语言之上的,编译语言的目标就是要产生机器码
像C++,ALGO,,PROLG这些语言都可以称之为领域语言,,,而YACC就是建立在他们上面的更高阶
语言
如果你有过写编译器或语言的经历,你就会知道语义在这个过程中所发挥的作用了,,,,不同的语言用
于不同的领域,,所采用的语义也就不同,,数据库有它的SQL语言,,建模有UML语言,接口有IDL语
言,,,等等,,,如果存在一种语义(并由此发展出一种语言),可以用来表示所有领域的语义,,那
么由这种语义发展而来的一种语言就是元语言,,而XML就可以做到元数据,,YACC(编译器的编译器)
在一定程序上实现了元语言,,而多范型可以称得上元设计了,,
作用何在呢?
每一个领域都有它自己的字母表(领域字典),,,每个领域应当专门用一种语言来开发..有它不同于其它领域的
语义(不跟其它语言一样),,语义是语言之上的一层逻辑,XXX学指出,,用一门语言比如C,C++或者仅
仅用OO来描述全部领域都是不完整的
继承和虚函数都可以产生多态,
我们应该不要在接口中包含数据成员(像VC++的.h文件中就允许这种形式,这导致C++的头文件并非一个
良好的接口)
接口往往是函数阵列,而且往往接口本身也是一个对象,包含这些函数阵列作为它的成员,虚函数的意义
就在于它不必定义它的实现,,正是因为没有实现,所以它可以被override而形成新的接口供以后的继承
类来实现它
对接口编程就是对函数编程,,定义行为集代表的逻辑层之间的关系,而数据分派在子类中作为实现
判断一个类的成员是不是能被继承,,最终的途征是看它是静态绑定的还是动态绑定的,如果动态的,就
可以,(static 成员)
推迟绑定时间到编译期(设计期),就是元编程的意义所在的一个重要方面
元编程就是设计期实现和运行期实现的结合(也即在编码时同时进行设计期和运行逻辑的工作)
?? 真正的MetaProgramming
不是指.net那种共用一个库的CLS
面向对象在复用工作方面做得很好(比如它提供了继承,多态,还提供了二进制复用比如COM,还提倡用
类聚合代替继承而不是tear off,还出现了诸如设计模式这样的复用经验),但是这是相对现实生活的那一端
做的工作,,然而它对于编程工具端(编译器)本身来说是不友好的(程序源码必须要进入runtime才能让我们看
到这所有的OO里面发生的事,在编译阶段(一般也称为design - time)我们不能控制这些OO对于问题域的实
现),我们应该在没有让程序进入某种具体编译器之前,,就让它得以被控制,而不仅仅是预测这些编译的
文件进入runtime以后会形成怎么样的逻辑
也即,类的职责单位是类文件,这种机制有一些的缺陷性,问题域是巨大的,如果我们动手一项工程,我
们不希望被无穷的细节所困扰(现实问题总要分解为一些类,最终要形成类文件,一般每个职责形成一个
类),我们希望有一种介于编译器和现实问题之间的更大的整合层来考虑事物(而不是一个一个的类文件),,
也即,我们不需要考虑现实问题到类的实现路径,我们希望在设计期就考虑现实问题到一个“比类还大
的”,“更接近现实问题”的逻辑层上去,再由这个逻辑层到最终的类实现路径(比如单例模式,就是指代
设计中只能出现一个实例的逻辑实体,这已经十分接近设计了)
如果这个层面被提出来,它甚至不占用到运行的时间,,即增加这项抽象,并不耗费运期间任何成本(因
为它只发生在编译期)
因此它是语法导向的,而不是虚拟函数集导向的
编程新手真言 - GameRes.com 页码,15/101
mhtml:file://F:\Cpp\编程新手真言.mht 2008-7-30
这个整合层就是策略,,,模板技术允许我们在编译期就用“策略组合”加“模板技术”来生成源程序,
这实际上也是编写库为用户所用时所要考虑到的问题
用户希望能从库中提取功能的子集,这势必产生
这里提到一个trait的概念,简单描述一下先
这就是元语言,
问题域永远是多元的,因此需要元语言,数据格式是多样的,因此会有表示数据的通用方法 XML,一般用
XML格式的metadata来封装其它格式(即:不可能把所有格式的数据包括二进制啊,PE啊,,TXT啊都做
成XML,但我们可以把这些数据格式放进一个XML的字段内,XML就成了一种通用的数据打包形式并用它
用于进行统一数据交换过程,然后在使用时从这些这段中取出各个格式的数据再解码成所需的格式,W3C
组织正在策起一个关于XML二进制格式的方案)
?? 真正的多范型设计
编程主要涉及三个主体,,,现实世界(方案领域),,,,编程工具也即通用的表达现实抽象的工具(应
用领域)范型就是编程界(编程界的范型都基于计算机这个底层实现)对设计(设计都源于人脑对现实世界的
模拟和用计算机来表达它的需求)的表达因子
从工程的角度来考虑一个领域里的最高高度就是多范型设计(请注意这还只是设计而非编码,但是设计中的
某些因素最终要在代码中最现体现出来-当然并不是设计中的全部中间过程与细节因为设计过程中某些用词
只是辅助用词,这“最终在代码中表现出来”称为对设计的实作,这实际上也可称为设计的编码,然而标准
意义上的编码是写最终的应用而不是写中间逻辑比如库逻辑)
如何把你的设计代码化表现呢,用策略是其中之一,策略只是范型之一,当然还可用某种语言的一切范
型,比如C++是一种多范型的语言,范型就是问题域对于方案域(schma)的具体解法这种统用说法,即设
计通过范型才能在代码中体现,我们所有的编程工作就是利用语言级或非语言级的编程界范型(比如二进制
的复用IDL等,这通常是部署设计)去实现问题。(因此要学习语言的范型和对问题的语言范型实现)
进行原语设计时可以不考虑范型(因为此时的原语设计不是面向编码的),但是当用范型来实现时,就是面
向编码的工作,此时要考虑设计中的哪些部分(去掉思想过程中的辅助过程,即那些不需在代码级表达出来
的细节或用词)用哪种范型来表达比较合适。
原语设计与多范型设计有着不同的出发点(这是区别),但是它们的联系才是主要的,原语设计的出发点
是现实世界,最终的目的是为了提出一种构架,,,这种构架可以为未来扩展提供足够余地接口(这是思想
级的接口并不实际是我们常说的“面向接口编程”的接口,这里这里的设计跟编程没有多大关系,多范型设
计中的设计扩展接口才慢慢跟编程和计算机走到一起),多范型设计的出发点是计算机的范型,,最终目的
是产生源码文件,并体现原语设计时提出的思想架构(这句话才是重点,这里再次重申,原语设计的架构仅
仅是按人类的思考来定义的架构并不是以范型的观点来看待的),但是二者是统一的(这是联系),只要思想
上科学的架构,当它被多范型用计算机的眼光被体现出来时,多范型因此没道理不会具有当初思想级架构
所具有的扩展余地(或可复用余地),也即它们是统一的,,然而,最终的扩展瓶颈是由范型设计所决定的,
即接口余地=范型设计最大扩展余地=范型设计扩展余地+原语设计扩展余地。
为什么需要明白以上这些呢?明白以上这些,将极大地使程序员不满足借用编程界现有的设计,而是创立
自己的设计方案并实现它(有意识的行动比没有意识的行动有效得多,而有上述思想作为指导是必要的,而
如果连自身的问题都没有找准根本就不行)
编程新手真言 - GameRes.com 页码,16/101
mhtml:file://F:\Cpp\编程新手真言.mht 2008-7-30
你可能在问,明白这些思想的东东有什么用?然而你如果真不明白这些思想级的障碍,那么代码级的障碍
你也许根本过不去,一个直接的例子就是,在看到一些技术文章的时候就会碰到这些用词时会用上
问题领域总可以分成它的子领域,,子领域又可分为它的子子领域,每个领域都可用一些范型来表示,对
每个问题域的每个中间抽象层次都要考虑扩展和可复用(而且是在设计期就考虑),或者每个领域各用一
种范型,或者
C++本身就是一种提供了多范型的语言(注意除了它的OO机制范型以外,它的模板啊,指针和引用啊,
虚函数啊,GP啊都是其它意义上的范型)
对多范型的考虑要充分考虑复用,因此必定要考虑到二个原则:找到方案领域的变化与,不变点,不变点
可以做到基层(高层抽象,,,并不一定要用继承这种范型来实现,因为面向对象这种范型只是多范型的一
个子集而已),而在多范型的眼里,任何领域工程都不只通过一种范型来解决(比如的面向对象,比如某一
种语言的面向对象),,因此它可称为metadesign,,注意,它是设计metaprogram是关于语言的语言,是
语言之上的更高一级抽象,
分析过程往往
往往
找出事物的不变点与变化点这是多范型里面常常提到的二个词,这二个词反映了什么事实呢?
在“设计与策略”一节的开头有讲解
?? 真正的xp编程
即使你通过阅读和实践的手段获得了足以编制任何软件的知识,你还是需要(当然并非必要)一种实在的
方法学来更为有成效地建一个应用,,,敏捷开发就是这样一种方法(Rose公司的UPS,统一开发过程也
是一种软件开发的工程学),敏捷方法学指出了很多原则(只是指出这些原则,,并没有相关的理论,也
即,XP编程实际上与其说是方法论,不如说是一组具体的实践实体),比如它要求重构的时候,要注意二
个重要的问题那就是测试和结对编程
这二个要求几乎是XP编程的精髓.
不要把重构的意思跟重载弄混了,,,重构refracting是重新构成,,,是复用和增加新功能(在不改变向
外的接口和表现的同时在其内部进行代码级的改进)的代名词,,我们常说重构一个应用,,就是说如何
重新应用现有的代码或框架
重构又跟单元测试有关(这个主题本身都可以自成一书,是极限编程学里的内容),,又跟极限编程有
关,,,OMG
实际上一个XP编程提倡的测试就是增量开发的意思,你可以向你的代码增加一个类,然后写一个使用这个
类的框架,,如果测试通过,这个类就可以跟整个代码协调一起工作,所以可以通过这种方式为代码不断
提供新的功能。。
先写测试用例,再写实际代码,(这个顺序很奇怪吧)这些测试用例都能通过的时候,代码在这个迭代周期
就算完成了,
一些最最低层的API就可以定义出一个大型程序(我们称这些核心API为算法API,它们属于真正的实现部
编程新手真言 - GameRes.com 页码,17/101
mhtml:file://F:\Cpp\编程新手真言.mht 2008-7-30
分),,因为我们可作基于这些api之上的无尽抽象,,,(即定义这些核心API如何被使用,如何被更好地
满足复用地使用,如何简化而又合理地使用,,简言之,这些抽象就是接口,,)
我们常常把行为(更准确来说仅仅是行为的声明形式,要注意,一个函数的原型(也即签名)和它的具体实现是
分开的)作为接口,而不把数据放进接口,这是因为数据是实现部分,不应该被加进一个接口
重载是定义一个行为的同名的多种变形形式,这些变形接受不同的函数签名,,,但共用一个函数名(也即
接口只规定函数声明形式,,只不写出它们的实现,由实现它的子类来写出实现)
上面不说继承而说实现它的子类,,是因为,接口(或抽象基类)一般是用来实现的,而一般基类是用来继
承的
OO本身就带有对重载的支持,因为OO的低层实现是一种被称为RTTI的对象内存模型机制,一个定义了虚
函数的类应该存在对这个函数重载的需要,,否则就不要定义虚函数
在构件中,,queryinterface()也是一种构件多态的手段
指针也可以办到不需要OO就能重载的目的
?? 真正的调试
调试几乎是与设计,与实际编码地址相等的过程,,一个软件花在调试和维护上的时间几乎比实际编码的时
间还要长(重构级的调试)
所以,千万不要以为调试只是一种与编译器打交道的活,实际上,它是软件工程学(特别是方法学)中一
个很重要的部分,初期的调试就是Assert,软工里面的调试还包括写Log,写专门的测试案例(这样的测试可
以称为事前调试,设计级的调试-希望这个词是我第一次用)
先来介绍一些高级编译技术
1.stlport在include路径里置前,因为VC6的旧的SDK里带有同名的文件
2.dx8置dx9前,并且置顶,因为需要一个dxinput8.h的文件
3.cpp文件和inc文件到底有什么区别?本质上在h和cpp里都可写代码实现,然而h里面的代码经常是一些
inline,define之类的代码,因为它们要被其它文件包含
4.编译头可加快编译速度
5.编译大型库时,注意条件编译,可选部分按需略掉
6.不需要inc的一个方法是用路径号./,,少用\
7.可在link选项卡里加路径
8.disable warning stl
9.直接把.lib加进工程
10.macro redine错误时用_下标
11.#include 的<>符号是优先在环境变量中查找,而“”是当前相对路径中查找
12.用VS9中的VS8来编译库
下面介绍一下大型开源库的编译技术,,比如Yake的编译
编程新手真言 - GameRes.com 页码,18/101
mhtml:file://F:\Cpp\编程新手真言.mht 2008-7-30
领域数学与算法
数学不但是算法和解决一切领域问题的基础,别忘了,计算机本来就是一个离散结构!
宜结合数据结构阅读本节!它与OO的结合点就是利用了ADT的算法!
?? 真正的逻辑
P∨q 为命题p和q的析取,是p和q用逻辑连接符’或’连接的结果

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -