赞
踩
经营资产
示范目标
学习的机会:
批判的思考:警惕唯一的答案,批判的分析听到的和读到的。
DRY:don’t repeat yourself
强加的重复:
无意的重复:原因来自信息结构的不规范,一旦发现多个相互依赖的数据元素时,就需要考虑去重复的问题
无耐性的重复:懒
开发者之间的重复:通过高层设计避免
正交性:两条直线相交成直角,两条直线互不依赖, 沿着某条直线移动,投影到另外一条直线上的 位置不变
正交的好处:
不存在最终决策
为了达到可撤销性:需要灵活的架构,使用项CORBA技术能够将项目某些部分与语言分割开来。
先动手,然后观察各种反馈,立即改进
曳光开发与项目永不会结束的理念是一致的:总有改动需要完成,总有功能需要增加。这是一个渐进的过程。
曳光开发其实大家或多或少都在参与。新项目创建时搭建框架代码,逐渐为框架添加功能正是这样一个过程。我们会在框架中让关键流程能够运行,以检验新技术
曳光开发和原型模式有明显区别。原型中的代码是用过就扔的,寻求以最快的速度展示产品,甚至会采用更高级的语言。曳光代码虽然简约,但却是完成的,它拥有完整的错误检查与异常处理,只不过是功能不全而已。
优点:
曳光代码vs 原型制作
原型开发
曳光弹
原型制作与完全的制作对比成本低很多,举例轿车制作商可以为某种新车设计不同的原型,目的是测试轿车的具体方面-空气动力学,结构特征等。同样道理,软件产品也可以使用原型制作,利用不同材料制作原型,可以是白板上的图形、绘图工具绘制的产品图等等。但是,如果发现自己处于不能放弃细节的环境中,需要问自己是否采用该方法而转而使用曳光弹方法。
应制作原型的事物:
制作架构原型:
靠近问题领域编程:旨在脱离具体的编程语言和平台,在需解决的实际问题领域中去尝试给出解决方案(伪代码)。
实现小型语言,并通过解析生成器生成不同编程语言的代码。如使用BNF(Backus-Naur Form 可用于递归地规定上下文无关的语法)
学习估算,并将此技能发展到你对事物的 数量级有直觉的程度,你就能展现出一种魔法般的能力。
估算单位
估算来自问题提供的信息
持久存储知识的最佳格式是纯文本
纯文本:由可打印字符组成,人可以直接阅读和理解其形式。纯文本也可以有结构,可以是xml,sgml,HTML和json。借助纯文本可以获得自描述(self-describing)
纯文本的缺点:
纯文本的优点:
虽然很多操作用GUI界面操作更直观方便,但是不能依赖它,因为GUI环境受限于设计者想要提供的能力。
需要投入精力熟悉shell命令,利用shell命令灵活地组织命令序列,高效地完成要做的事情。
最好精通一种编辑器,并将其用于所有编辑任务:代码、文档、备忘录、系统管理等等。
坚持使用一款编辑器,避免在不同编辑环境中切换,重新熟悉相应的编辑约定和命令带来的成本。
确保编辑器能在不同平台下使用:Emacs,vi、Crisp等
编辑器特性:
无须多言
这里的文本操纵语言是轻量级的,类似脚本语言,像perl、python等脚本语言能够进行网络访问,测试数据的生成、文本的解析操纵,生成web文档。
建议:学习一门文本操纵语言
如果有写代码重复了,那么就需要 编写能编写代码的代码
代码生成器的类型:
被动代码生成器:运行一次生成结果,之后结果与代码生成器无关了。本质是 参数化模板
主动代码生成器:当发现自己在设法让两种完全不同的环境一起工作,那么就应该考虑主动代码生成器
代码生成器并不是要很复杂,勇于尝试。
代码生成器不一定要生成代码
DBC:契约式设计
断言:断言不可能发生的事情
程序不一定非得一个出口
早崩溃。不要破坏(trash),写入错误的数据
如果它不可能发生,用断言确保它不会发生。
断言时不要有副作用
理解需求,异常是留给意外事件的
要有始有终:分配资源,使用它,释放它
嵌套的分配(一次性不只一个资源)
遵循得墨忒耳法则虽然可以减少模块之间的依赖,但是会带来很多委托方法出现,不仅增加无关的代码,还影响代码的执行速度,所以需要根据不同的场景折衷,违反规范来赢取性能的改进。
???
元数据
一开始编程都是按照时间的顺序去进行。但是一旦需要并发时,就出现了麻烦。
利用UML的活动图,分析工作流。
我们基于分而治之的理念将程序分成若干个模块,但是怎么管理组织不同模块(类)之间依赖确实一个难题。
我们从事件(event)这个概念出发,将新变化发送给感兴趣的对象。、
假如通过一个 例程(例程是某个系统对外提供的功能接口或服务的集合。比如操作系统的API、服务等就是例程)来自百度百科。那么例程就需要知道各个对象之间的交互有密切的了解。显然,我们可以采用订阅/发布的模式让某个订阅者只接受它感兴趣的事件。
CORBA Event Service 允许参与对象通过事件信道(公共总线)发送和接受通知。
MVC(模型-视图=控制器)模式有效地让模型与GUI分离,又与管理视图的控件分离。
模型:表示图标对象的抽象数据模型。模型对任何视图或控制器都没有直接的了解
视图:解释模型的方式。它定业模型中的变化和来自控制器的逻辑事件
控制器:控制视图。并向模型提供新数据的途径。它既向模型也向视图发布事件。
仍然有耦合,情看下一节 黑板
将警探办案将线索信息张贴在黑板的例子指出黑板方法的特性:
- 没有对象需要知道另外其他对象的存在,他们从黑板中查看信息,并添加他们的发现。
- 使用黑板的对象或者模块都有一个共同点就是围绕同一个目标或者功能,如在例子中是破案。
对于复杂多变的工作流,我们可以黑板来协调。
在分布式类黑板系统JavaSpaces中的接口设计如下:
名称 | 功能 |
---|---|
read | 在空间中查找并获取数据 |
write | 把数据项放入空间 |
take | 与read类似,但同时从空间中移除该数据项 |
notify | 设定每当写入与模版匹配的对象时就发出通知 |
为什么不能靠巧合编程(看起能工作):
深思熟虑地编程
对于算法使用的资源。处理、内存进行估算。
O()表示法对我们度量的事物值设置了上限。
一些常见的O()表示法 |
---|
O(1) |
O(lg(n)) |
O(n) |
O(nlg(n)) |
O(n^2) |
O(n^3) |
O(C^n) |
虽然我们不用去设计编写排序等算法,但是 估算算法的阶 有利我们对自己编写的程序的运行情况有一定了解
重构=重写+重做+重新架构
何时进行重构:
早重构,常重构
怎样重构:
单元测试:针对合约进行测试。
为测试而设计:
在设计模块甚至是单个例程时既设计其合约也设计测试该合约的代码。
不要使用你不理解的向导代码
不要搜集需求,挖掘它们。
应该用明了的陈述句表达需求。有时候在陈述需求中会夹带着商业政策,而 商业政策是经常改变的。所以我们需要将商业政策与需求做区分。
在讨论用户界面时,需求、政策和实现之间区别可能会变的模糊不清。
重点
找出用户 为何做特定事情的原因,而不是他们目前做这件事情的方式。
建立需求文档:用use case(用例)来描述系统的特定用法。
相应的用例模板
抽象比细节活得更长久
维护项目的词汇表,利于沟通。
当遇到一个迷途难以解开的时候,解决的方法可能不在你现在思考的范围内。所以需要重新确定方法的约束,有些约束是绝对约束,而有些约束是先入为主。
不要在盒子外面思考-要找到盒子:我们需要确定问题的自由度,也就是约束
想想特洛伊木马
一定有更容易的方法
倾听反复出现的疑虑-等你准备好再开始
是良好的判断还是拖延
- 拖延:对于概念的验证出现“浪费时间”的厌烦
- 良好的判断,随着原型进展,肯呢个在某个时刻得到启示,突然意思到某个前提是错误的。
对于有些事情,“做”胜于“描述”
不做形式方法的奴隶
工具只是工具,要为我所用。
不要手工
自动化:
早测试、常测试、自动测试
要到通过全部测试,编码才算结束。
测试什么
怎样测试:
把闻到那股建里卖年,不要拴在外面
温和超出用户的需求
在你的作品签名:为自己负责
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。