冯.诺依曼贡献了关于计算机的一个重要隐喻:一系列依次执行的指令。这一隐喻贯穿了许多编程语言,当然也包括java。那么我们应该如何表达程序的行为(也就是一系列指令)。
1. 控制流
作为程序员,你要决定如何去表达心目中的控制流,是表达成一个含有例外情况的主体流,还是表达成多个同样重要的流,又或者是两者的混合,这样一个问题要先想清楚。另外,写程序的时候,将控制流的小片段归类,让不想深入研究的阅读者首先得到一个抽象的理解,同时又为需要深入领会的阅读者提供更详尽的细节。
2. 主体流
程序员通常心里都会想象一个程序控制流的主干。处理过程从这里开始,到那里结束,一路上会有一些决策和异常,但整个运算还是有路可循的。要用你的编程语言清晰地表达这个流。总之,把今后可能会被频繁地阅读,理解与修改的部分表达清楚。
3. 选择性消息
有时候发送消息去选择一个实现,例如,如果打算用若干方法中的一个来显示一个图形,我会发送一条多态的消息来传达出“选择将在运行是发生”的消息。
public void displayShape(Shape subject, Brush brush) {
brush.display(subject);
}
brush在运行的时候,有可能是ScreenBrush,PostscriptBrush等等。都是Brush类的子类。不同的brush实现的display方法不同,也就能画出不同的图形。
4. 反置性消息
对称性可以提高代码的可读性,请看下列代码:
void compute() {
input();
helper.process(this);
output();
}
构成这个方法的三个方法调用缺乏对称性,通过引入一个辅助方法来揭示隐含的对称性可以提高这个方法的可读性。
void process(Helper helper) {
helper.process(this);
}
void compute() {
input();
process(helper);
output();
}
不过如果过度使用反置性消息可能会掩盖需要进行功能移动的迹象。有时候我觉得仅仅为了达到对称性这样的美学要求的冲动而引入一个新方法有点蠢。不过美学之深妙不止于此。比起严格的线性逻辑思维,美学能调动更多的脑细胞。一旦培养起对代码之美的嗅觉,从代码中得到的美感将是对代码质量的一种宝贵的反馈。这些从象征性思维层面之下涌出的感觉,其价值一点都不逊于经过充分证明并明确命名的模式。
5. 解释性消息
意图与实现之间的区分在软件开发中总是很重要的。它让你首先理解运算的目的,如果有必要,再进一步理解其实现的细节。可以用消息来彰显这种区分,首先发送一条“以要解决的问题来命名”的消息,这条消息再发送“以问题如何被解决来命名”的消息。比如:
highlight(Rectangle area) {
reverse(area);
}
highlight 表达的是意图:要将这一区域高亮度显示。 reverse表达的是实现:如何实现我们的意图。
有时候,当你觉得需要单独注释一行代码的时候,可以引入一条解释性消息。当我看到:
flags = LOADED_BIT //Set the loaed bit
我会宁愿看到:
setLoadedFlag();
void setLoadedFlag() {
flags = LOADED_BIT;
}
6. 卫述句
即使程序有一个主体流,有些情况下也会需要偏离它。卫述句是一种表达简答和局部的异常状况的方式,它的影响后果完全是局部的。
比如:
void compute() {
Server server = getServer();
if (server != null) {
Client client = server.getClient();
if (client != null) {
Request current = client.getRequest();
if(current != null) {
processRequest(current);
}
}
}
嵌套的条件语句孕育着错误。用卫述句改写的代码强调了请求处理的先决条件,而不需要用到复杂的控制结构:
void compute() {
Server server = getServer();
if (server == null) {
return;
}
Client client = server.getClient();
if (client == null) {
return;
}
Request current = client.getRequest();
if (current == null) {
return;
}
processRequest(current);
}
总之,卫述句就是尽量将异常流结束,尽快将主体流上的一些分支流结束掉。
卫述句的一个变体是在循环中使用continue语句,它的意思是“别管这个元素,继续下一个。”
分享到:
相关推荐
"设计模式之行为模式 23种模式中的几种" 行为模式是设计模式的一种,涉及到算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻划了在运行时难以跟踪的复杂的控制流。...
在这个“设计模式_行为模式”主题中,我们将深入探讨几种关键的行为模式。 1. 责任链模式(Chain of Responsibility):此模式允许创建一个处理请求的对象链,每个对象都可以处理请求或将其传递给链中的下一个对象...
本资源是用VC6.0实现的行为模式,有三种:ChainOfResponsibilityPattern、InterpreterPattern、IteratorPattern,参考与《23种设计模式(C++).pdf》
在编程领域,实现模式是一种经过实践验证的解决特定问题或执行特定任务的可重用方法。这些模式通常在多种编程语言中都能找到应用,因为它们是跨语言的抽象概念。"编程语言实现模式"这个主题涵盖了如何在不同的编程...
在实现状态模式时,通常会有一个上下文类(Context),它维护一个当前状态对象,并通过这个对象调用相应的行为。而状态类(State)定义了一组相关状态的行为,每个具体状态类实现这些行为。 总结来说,责任链模式...
本资源是用VC6.0实现的行为模式,有八种:CommandPattern、MediatorPattern、MementoPattern、ObserverPattern、StatePattern、StrategyPattern、TemplatePattern、VisitorPattern。参考于《23种设计模式(C++).pdf》
【设计模式之行为模式】 行为型设计模式主要关注对象之间的责任分配和通信方式,它们将焦点从控制流转移到对象间的关系上。这类模式分为两类:类行为模式和对象行为模式。类行为模式如Template Method和Interpreter...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...
在本讨论中,我们将深入探讨“行为模式之二”,这个主题可能涵盖了多个具体的模式。 1. **策略模式**:它允许在运行时动态选择算法或策略。例如,在一个电商系统中,根据不同的促销策略,计算最终的价格可能会用到...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要根据不同的条件或时间点执行不同算法的情况。策略模式允许我们将这些算法封装成独立的类,使得它们可以互换,从而提高...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中,我们创建表示各种策略的对象和一个行为根据...
在软件工程中,设计模式是解决常见编程问题的可重用解决方案。行为型设计模式主要关注对象...在"设计模式之行为型模式代码"这个压缩包中,你将找到这些模式的示例代码,通过学习和实践,可以更好地理解和运用这些模式。
编程语言实现模式通常指的是在各种编程语言中实现设计模式、编程模式或系统架构模式的源代码示例。这些模式可以帮助开发者在遇到类似问题时,能够快速找到解决方案,提高代码质量和可维护性。以下是对这些模式的一些...
### 设计模式之行为模式详解 #### 一、行为模式概览 行为模式是一类设计模式,关注于算法和对象间职责的分配。这类模式不仅仅描述了对象或类的结构,更重要的是描述了它们之间的通信模式,即如何通过对象间的交互...
本文将详细解析23种经典的设计模式,并结合C++语言在Visual C++ 6.0环境下进行代码实现。我们将探讨抽象工厂(Abstract Factory)、装饰者(Decorator)和工厂方法(Factory Method)这三种重要的设计模式。 首先,...
策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在Java中,策略模式主要通过定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换,让算法独立于使用它的客户而变化。 首先,策略模式的...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...
在C++中,设计模式分为三类:创建型模式(如工厂模式)、结构型模式(如装饰模式)和行为型模式(如观察者模式)。这些模式都是面向对象设计的核心组成部分,它们不仅适用于C++,也普遍应用于Java、Python等其他面向...
在分析和实现这些行为模式时,应结合实际问题,理解每个模式的核心思想,以及它们在不同场景下的应用。同时,通过编写和阅读源代码,可以深入理解模式的工作原理,并提升编程技能。这个作业提供了实践这些模式的机会...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在C#编程中,这种模式被广泛应用于处理具有多种状态的对象,使得对象的状态转换更加清晰和易于管理。 状态模式的...