时间: 2003
西部往事
我的朋友都是极客,所以他们中的很多人都期待着 2003 年 11 月的那一天,期待着《双塔奇兵》加长版 DVD 的发行(在我的朋友中,加长版 DVD 是唯一值得拥有的)。但对我来说,那一天标志着另一个同样重要的发行,赛尔乔·莱翁内的这部伟大的西部片终于发行了 DVD。
已发布接口
已发布接口是我使用的一个术语(首次出现在重构中),用于指代在定义它的代码库之外使用的类接口。因此,它比 Java 中的 public 含义更广,甚至比 C# 中的非内部 public 含义更广。我在 IEEE 软件专栏中指出,已发布和公共之间的区别实际上比公共和私有之间的区别更重要。
派生信息
如何在 UML 中表示派生信息?
P O J O
首字母缩略词:简单的 Java 对象。
提供服务存根
对于任何为面向服务的架构构建服务的人来说,一个重要的想法是。在构建服务时,还要构建一个服务存根,供客户端用来测试。这样的存根应该对一组固定的请求提供预设响应,模拟错误情况,并且能够在客户端机器上运行。您需要确保存根正确地模拟了真实系统的行为。通过为客户端提供存根,您可以使客户端更容易地使用您的服务;这当然意味着您的服务更有可能被使用。
测试语言
我目前正在参加XP 日的一个会议,Owen Rogers 和 Rob Styles 正在谈论 XP 的单元测试和验收测试之间的区别。这在我的脑海中引发了一个想法——编写验收测试的语言应该是什么?
贫血领域模型
这是一种已经存在很长时间的反模式,但目前似乎正在经历一次特殊的爆发。我正在和 Eric Evans 讨论这个问题,我们都注意到它们似乎越来越受欢迎。作为真正领域模型的支持者,这不是一件好事。
面向命令的接口
模块最常见的接口样式是使用过程或对象方法。因此,如果您希望模块计算合同的一系列费用,则可能会有一个 BillingService 类,其中包含用于执行计算的方法,如下所示调用它
aBillingService.calculateCharges(aContract)
面向命令的接口将为每个操作都有一个命令类,并使用如下所示的内容调用
CalculateChargeCommand.new(aContract).run()
迭代开发的历史
我遇到的大多数客户都没有听说过迭代开发,或者认为它是一种新的、相对未经尝试的现象。相比之下,迭代开发已经以各种名称存在了很长时间。IEEE 软件最近由 Craig Larman 和 Vic Basili 发表的一篇文章总结了捕捉这段历史的努力,并让您很好地了解了使用迭代开发方法的成功项目的悠久历史。
数据访问例程
封装的一个常见部分,尤其是在面向对象的系统中,是隐藏数据结构。然而,在数据访问例程后面公开大部分数据也很常见。在本专栏中,我将介绍一些编写数据访问例程的指南。但是,不要忘记,如果您可以隐藏数据,通常会更好。
C- 重构
到目前为止,重构工具已经出现在许多语言中。在 Smalltalk 的引领下,我们看到了几个用于 Java 的工具和几个用于 C# 的工具。有一种语言的缺失引人注目,那就是 C++,尽管有呼吁。所有这一切都尽管第一个重构论文是由Bill Opdyke完成的,他的背景是 C++。
表示域分离
我发现并遵循的最有用的设计原则之一是,在程序的表示方面(用户界面)和其余功能之间保持良好的分离。多年来,在我见过这样做的过程中,我看到了很多好处
企业架构
就在最近,我在亚马逊上收到了一些关于企业应用程序架构模式的差评,因为书中没有关于企业架构的内容。当然,这有一个很好的理由——这本书是关于企业应用程序架构的,即如何设计企业应用程序。企业架构是一个不同的主题,即如何将企业中的多个应用程序组织成一个连贯的整体。
类图中的局部变量
如何在 UML 类图上显示局部变量(参数、临时变量等)?
放弃 XSLT
这个网站的所有内容都是用简单的 XML 文档编写的,并转换为 HTML。我发现这很有效,这意味着我永远不必担心处理 HTML 格式。(正如您所见,花哨的布局不是我的风格。)我甚至用这种方式写了一整本书。
依赖和关联
依赖和关联之间有什么区别?
平台无关的误用
关于模型驱动架构 (MDA) 的一个主要说法是,它允许您在平台无关模型 (PIM) 中开发系统,然后可以将其转换为平台特定模型 (PSM),用于 .NET 或 Java 等技术。一个警惕的读者应该会对此说:“等等,Java 的全部意义不就是平台无关吗?那么,为什么我需要一些生成另一种平台无关技术的平台无关技术呢?”
种子工作
在面向对象的最早期,像我这样的面向对象倡导者非常重视支持重用。早期,我们谈论的是类的重用。然后我们发现,重用单个类虽然在某些情况下有效,但在其他情况下效果不佳。因此,我们开始使用可重用框架,这为我们提供了部分构建的功能应用程序。
应用程序边界
软件开发中尚未解决的问题之一是确定一段软件的边界是什么。(浏览器是操作系统的一部分吗?)许多面向服务架构的支持者认为应用程序正在消失——因此,未来的企业软件开发将是关于将服务组装在一起。
我认为应用程序不会消失,原因与应用程序边界如此难以划定的原因相同。本质上,应用程序是社会构建的
重构的词源
重构一词从何而来?
无法衡量生产力
我们看到关于软件过程、设计实践等的讨论如此情绪化。许多这样的争论是不可能解决的,因为软件行业缺乏衡量软件开发有效性的一些基本要素的能力。特别是,我们没有办法合理地衡量生产力。
取悦客户
所有敏捷方法都强调系统开发人员与其最终受益者(客户)之间直接交互的重要性。敏捷宣言说“业务人员和开发人员必须在整个项目中每天一起工作”,这是为了强调交互的频率很高。极限编程通过其现场客户实践强调了这一点。
建筑师
当人们使用“软件架构师”一词时,他们使用的是建筑施工中的一个比喻,来帮助人们理解架构师的角色。讽刺的是,在这样做的过程中,他们误解了建筑师的实际角色。
多重性而非基数
当数据建模方法谈到关系时,它们使用术语基数来表示可以链接在一起的实体数量。因此,您可能在订单和客户之间存在关系,并说关系的基数是一对多。或者您可能听说过,订单的客户基数是 0 到多。
固定长度字符串
查看大多数在应用程序编程语言和关系数据库之间进行通信的库,您会注意到它们将数据库中的字符串类型(char 或 varchar)映射到编程语言中的字符串类型。简单、明显,但也许是错误的。
模式并非新鲜事物
关于模式书籍的一个常见抱怨是,它们对经验丰富的开发人员来说没有什么新鲜事。(我最近在亚马逊评论和 The Server Side 上收到了一些这样的评论,所以此刻我可能感觉很敏感。)这不仅是事实,而且是模式的全部意义所在。
歌唱神探
《歌唱神探》是由 BBC 在 20 世纪 80 年代制作的一部电视剧(6 集,每集一小时)。包括我在内的许多人都认为这是他们看过的最好的电视剧。这是一部复杂的作品,可能是电视史上最具原创性的艺术作品之一。因此,它不是每个人都喜欢,但我看过很多遍了。它最引人注目的是与作家丹尼斯·波特有关,他制作了许多具有挑战性的电视节目。它最近在 DVD 上发行了。
固定价格
许多人认为,在敏捷项目中不能签订固定价格合同。由于敏捷流程的全部意义在于您无法预测未来,因此这并非不合理的假设。然而,这并不意味着您无法达成固定价格的敏捷合同,它的真正含义是您无法达成固定范围的合同。
多个规范模型
随便找一家大型企业,您通常都会发现某种专注于企业级概念建模的团队。最常见的是数据管理团队,偶尔他们也可能参与定义企业级服务。它们是企业级的,因为它们不是专注于单个应用程序的工作,而是专注于集成多个应用程序。
历史并非废话
历史或多或少是废话
——亨利·福特
我最近收到了一位《UML 精粹》读者的不愉快电子邮件。当一位愤怒的读者后悔购买,更不用说阅读我偶尔的智慧之言时,我的日子就不好过了。但这位读者的抱怨中有一些特别有趣的地方。他具体的抱怨是关于我“不必要的故事”。
市场架构和技术架构的区别
当我们考虑软件架构时,我们通常会想到它的技术架构。但还有另一个重要的架构——我们用来与软件客户沟通的架构:市场架构。忽视这种“市场架构”及其与“技术架构”的关系,可能会给开发项目带来很多麻烦。
谁需要架构师?
什么是架构,谁才是真正的架构师?这些问题似乎让每个人都非常激动。因此,在本期 IEEE 软件专栏中,我让拉尔夫·约翰逊解释了架构:他的定义与所有其他人的定义相符,但没有人同意。我还谈到了架构师的两个亚种:Architectus Reloadus 和 Architectus Oryzus。
软件工程知识体系指南 (SWEBOK)
本月是 IEEE 的 软件工程知识体系指南 的评审月。这是一个试图定义我们专业的知识体系的尝试,目的是为获得许可的专业奠定基础。
类型化集合
当人们开始使用对象时,特别是在强类型语言中,一个常见的问题是,他们是否应该为不同的域类型使用特定的集合类。因此,如果您有一个存储员工集合的公司类,您应该使用库中的常规集合类,还是应该创建一个特定的 EmployeeList
类——一个类型化集合。
制作存根
测试增强设计的一个常见问题是如何在测试模式下创建服务存根,同时让真实的东西用于生产(以及一些测试)。我的几位同事分享了他们的想法。
UML 2
上周,OMG 采用了 UML 2 的上层结构文档。实际上,这意味着 UML 2 已经达成一致。UML 2 对 UML 进行了许多更改——它代表了自 UML 最初达成一致以来对 UML 的最大一次改革。对于一般用户来说,最明显的更改可能是
包含和扩展
UML 用例图定义了用例之间的一系列关系。其中最著名的两个是包含和扩展。关于这两个关系的问题似乎比用例的任何其他部分,甚至 UML 中的任何内容都要多。
收获平台
要通过收获来构建平台,首先不要试图构建平台,而是要构建应用程序。在构建应用程序时,您不要试图开发通用代码,而是要努力构建一个结构良好、设计良好的应用程序。
基础平台
基础平台是在构建在其之上的任何应用程序之前构建的。其理念是,您要分析需要该平台的各种应用程序的需求,然后构建该平台。一旦平台完成,您就可以在其之上构建应用程序。关键是在您开始应用程序工作之前,平台确实需要有一个稳定的 API,否则对平台的更改将很难管理,因为它们会对应用程序产生连锁反应。
UML 作为草图
在这种 UML 模式 中,开发人员使用 UML 来帮助传达系统的某些方面。与蓝图一样,您可以使用草图进行正向工程或逆向工程。正向工程是在编写代码之前绘制 UML 图,而逆向工程是从现有代码构建 UML,以便于理解。
UML 作为编程语言
如果您可以详细说明 UML,并为软件中需要的所有内容提供语义,那么您可以使 UML 成为您的编程语言。工具可以获取您绘制的 UML 图,并将它们编译成可执行代码。
这样做的好处是,UML 是一种更高级的语言,因此比目前的编程语言更有效率。
UML 作为蓝图
长期以来,受工程影响的软件流程一直在寻找一种方法来表达软件设计,以便可以将设计交给一个单独的团队来编写代码,就像在建造桥梁时使用蓝图一样。这将使稀有且昂贵的软件设计师能够专注于蓝图,而许多更便宜的程序员则专注于构建。
UML 模式
当我查看 UML 2 时,我发现人们对 UML 中应该包含什么内容有不同的看法,因为人们对 UML 应该是什么有着不同的基本看法。在思考这个问题时,我想出了三种主要的 UML 思考分类:UML 作为草图、UML 作为蓝图 和 UML 作为编程语言。(有趣的是,史蒂夫·梅勒也独立地提出了相同的分类。)
什么是 Bliki
我一直在关注博客领域的发展,而且不可能不想加入其中。但我对博客也有一些不那么热衷的地方。首先是名字,正如我的同事迈克·图所说,“博客听起来像是我应该付钱给医生才能去除的东西”。然而,除了名字之外,博客文章的短暂性也是一个问题。简短的文字在阅读时可能很有趣——但很快就会过时。我发现写作太难了,不想把它花在转瞬即逝的东西上。
学习对象的语言
如果我想教人们面向对象,我应该使用哪种语言?
平台构建
可以使用重构来构建平台吗?
聚合和组合
在 UML 中,很少有东西比聚合和组合更令人沮丧了,尤其是它们与常规关联的不同之处。
什么是失败
CHAOS 报告称只有 34% 的项目取得成功。
Standish Group 的 CHAOS 报告 多年来一直在谈论 IT 项目浪费了数十亿美元。34% 的成功率实际上比 2001 年的 28% 有所提高。但我们所说的“失败”到底是什么意思?
受保护数据
在我的类中使用 protected 访问修饰符来处理数据是良好的面向对象设计吗?
访问修饰符
面向对象的语言将程序划分为称为类的模块。每个类都包含特性,特性由数据(字段)和方法组成。(并非所有语言都使用这些术语,但为了便于说明,我们将使用它们。)语言对其他类可以访问类的哪些特性有各种规则,这些规则通常基于应用于类的访问修饰符。
类图上的集合
假设你有一个专辑类,它有一个音轨的 ArrayList。如何在 UML 类图中显示这一点?
大型敏捷项目
一个常见的问题是,大型项目是否可以使用敏捷技术完成。毕竟,许多敏捷方法是为较小的项目设计的,而它们所抵制的重量级思想在更大的项目中更需要。
组件与混沌世界
为什么混沌理论表明组件组装可能并不像它看起来那么容易。
错误的架构
《软件开发》杂志将我的著作《企业应用架构模式》第 7 章(分布式策略)改编成了一篇文章发表在他们的杂志上。我怀疑他们喜欢它是因为它的语气和其中包含的分布式对象设计第一定律。
模式
我在 IEEE 专栏中谈到了模式对理解软件设计的重要贡献。
加拿大 XP/敏捷方法扩展研讨会
随着 XP 和其他敏捷方法的普及,关于如何将 XP 扩展到 10-12 人以上的团队的问题开始浮出水面。2003 年 2 月中旬,在加拿大艾伯塔省班夫举行了一次专门讨论该主题的研讨会。在本文中,我们报道了 Ken Schwaber 和 Martin Fowler 以及其他领先实践者的主题演讲。
领域逻辑和 SQL
在过去的几十年里,我们看到面向数据库的软件开发人员和内存应用程序软件开发人员之间的差距越来越大。这导致了许多关于如何使用数据库功能(如 SQL 和存储过程)的争论。在本文中,我将探讨是将业务逻辑放在 SQL 查询中还是放在内存代码中的问题,主要考虑基于一个简单但丰富的 SQL 查询示例的性能和可维护性。
使用 XML 写作
很长一段时间以来,我一直在使用 XML 进行大部分写作,甚至到了用 XML 写我的上一本书的程度。当我向人们提到这一点时,他们问了我很多关于我的经历的问题,这足以促使我写这篇关于整件事的小文章。
何时创建类型
关于何时为值创建新的用户定义类型(或类)的指南。