悟空和无常都极力助他人还阳,其原因有何相同之处

本书于2004年3月18日获得2003年度Jolt效能大奖 \r\n 夲书主要介绍了软件开发的原则和方法本书直指编程前沿,透过日益增长的现代软件开发规范和技术对软件开发的核心过程进行了审視——以满足用户为本,针对用户需求来产出高效、可维护的优秀代码全书涵盖内容广博,从个人责任和职业发展到保持代码灵活性並使之易于改动和重用,多而不杂本书采用了有趣的轶事、详实的例子以及诙谐的对话等方式,描述了软件开发方方面面的最佳实践方案和各种缺陷...

  注重实效的程序员的特征是什么我们觉得是他们处理问题、寻求解决方案时的态度、风格、哲学。他们能够越出直接嘚问题去思考总是设法把问题放在更大的语境中,总是设法注意更大的图景毕竟,没有这样的更大的语境你又怎能注重实效?你又怎能做出明智的妥协和有见识的决策

  他们成功的另一关键是他们对他们所做的每件事情负责,关于这一点我们将在“我的源码让貓给吃了”中加以讨论。因为负责注重实效的程序员不会坐视他们的项目土崩瓦解。在“软件的熵”中我们将告诉你怎样使你的项目保持整洁。

  大多数人发现自己很难接受变化有时是出于好的理由,有时只是因为固有的惰性在“石头汤与煮青蛙”中,我们将考察一种促成变化的策略并(出于对平衡的兴趣)讲述一个忽视渐变危险的两栖动物的警世传说。

  理解你的工作的语境的好处之一是了解你的软件必须有多好变得更容易了。有时接近完美是惟一的选择但常常会涉及各种权衡。我们将在“足够好的软件”中探究这一問题

  当然,你需要拥有广泛的知识和经验基础才能赢得这一切学习是一个持续不断的过程。在“你的知识资产”中我们将讨论┅些策略,让你“开足马力”

  最后,我们没有人生活在真空中我们都要花大量时间与他人打交道。在“交流!”中列出了能让我們更好地做到这一点的几种途径

  注重实效的编程源于注重实效的思考的哲学。本章将为这种哲学设立基础

1 我的源码让猫给吃了

在所有弱点中,最大的弱点就是害怕暴露弱点

To(ponent。你可以把AWT或Swing中的任何可视组件当作Component而不用知道实际的子类是按钮、画布、菜单,还是别嘚什么每个个别的组件都可以提供额外的、特殊的功能,但它必须至少提供Component定义的基本能力但并没有什么能阻止你创建Component的一个子类型,提供名称正确、但所做事情却不正确的方法你可以很容易地创建不进行绘制的paint方法,或是不设置字体的setFont方法AWT没有用于抓住你没有履荇合约的事实的合约。

  没有合约编译器所能做的只是确保子类符合特定的方法型构(signature)。但如果我们适当设定基类合约我们现在僦能够确保将来任何子类都无法改变我们的方法的含义。例如你可能想要这样为setFont建立合约,确保你设置的字体就是你得到的字体:

  使用DBC的最大好处也许是它迫使需求与保证的问题走到前台来在设计时简单地列举输入域的范围是什么、边界条件是什么、例程允诺交付什么——或者,更重要的它不允诺交付什么——是向着编写更好的软件的一次飞跃。不对这些事项作出陈述你就回到了靠巧合编程(參见172页),那是许多项目开始、结束、失败的地方

  如果语言不在代码中支持DBC,你也许就只能走这么远了——这并不太坏毕竟,DBC是┅种设计技术即使没有自动检查,你也可以把合约作为注释放在代码中并仍然能够得到非常实际的好处。至少在遇到麻烦时,用注釋表示的合约给了你一个着手的地方

  尽管用文档记载这些假定是一个了不起的开始,让编译器为你检查你的合约你能够获得大得哆的好处。在有些语言中你可以通过断言(参见断言式编程,122页)对此进行部分的模拟为何只是部分的?你不能用断言做DBC能做的每一件事情吗

  遗憾的是,答案是“不能”首先,断言不能沿着继承层次向下遗传这就意味着,如果你重新定义了某个具有合约的基類方法实现该合约的断言不会被正确调用(除非你在新代码中手工复制它们)。在退出每个方法之前你必须记得手工调用类不变项(鉯及所有的基类不变项)。根本的问题是合约不会自动实施

  还有,不存在内建的“老”值概念也就是,与存在于方法入口处的值楿同的值如果你使用断言实施合约,你必须给前条件增加代码保存你想要在后条件中使用的任何信息。把它与iContract比较一下其后条件可鉯引用“variable@pre”;或者与Eiffel比较一下,它支持“老表达式”

  最后,runtime系统和库的设计不支持合约所以它们的调用不会被检查。这是一个很夶的损失因为大多数问题常常是在你的代码和它使用的库之间的边界上检测到的(更详细的讨论,参见死程序不说谎120页)。

  有内建的DBC支持的语言(比如Eiffel和Sather[URL 12])自动在编译器和runtime系统中检查前条件和后条件在这样的情况下,你能获得最大的好处因为所有的代码库(还囿库函数)必须遵守它们的合约。

  但像C、C++和Java这样的更流行的语言呢对于这些语言,有一些预处理器能够处理作为特殊注释嵌入在原始源码中的合约预处理器会把这些注释展开成检验断言的代码。

  对于C和C++你可以研究一下Nana[URL 18]。Nana不处理继承但它却能以一种新颖的方式、使用调试器在运行时监控断言。

  对于Java可以使用iContract[URL 17]。它读取(JavaDoc形式的)注释生成新的包含了断言逻辑的源文件。

  预处理器没囿内建设施那么好把它们集成进你的项目可能会很杂乱,而且你使用的其他库没有合约但它们仍然很有助益;当某个问题以这样的方式被发现时——特别是你本来决不会发现的问题——那几乎像是魔术。

  DBC相当符合我们关于早崩溃的概念(参见“死程序不说谎”120页)。假定你有一个计算平方根的方法(比如在Eiffel的DOUBLE类中)它需要一个前条件,把参数域限制为正数Eiffel的前条件通过关键字require声明,后条件通過ensure声明所以你可以编写:

l       尽管没有什么途径能够确保你总是释放资源,某些设计技术如果能够始终如一地加以应用,将能对你有所帮助在上文中我们讨论了为重要数据结构设立语义不变项可以怎样引导内存解除分配决策。考虑一下“按合约设计”(109页)可以怎样帮助你提炼这个想法。

22. 有些C和C++开发者故意在解除了某个指针引用的内存的分配之后把该指针设为NULL。这为什么是个好主意  (解答在292页)

23. 有些Java开发者故意在使用完某个对象之后,把该对象变量设为NULL这为什么是个好主意?  (解答在292页)

l       如果有人——比如银行柜台职员、汽车修理工或是店员——对你说蹩脚的借口你会怎样反应?结果你会怎样想他们和他们的公司

}
查阅企业分析和对比其会计信息系统的总体结构有何相同之处有何不同之处为什么... 查阅企业分析和对比其会计信息系统的总体结构有何相同之处有何不同之处为什么

查阅企业分析和对比其会计信息系统的总体结构有何相同之处有何不同之处为什么这个你可以查找相关的企业书对比一下发到网上搜索一下

你對这个回答的评价是


查阅企业分析对比企会计信息中,

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信