`

伪代码法

阅读更多
2011-05-11  补充一个链接,这个例子实际些: http://www.iteye.com/topic/826710#1809014

今天在看跟Bob借来的《Everyday Scripting with Ruby》,看到第7章第2小节提到的一个“假设式脚本编写法”,忍不住兴奋,这不就是我一直在用的所谓“伪代码法”嘛。顿时一股“英雄所见略同”的自豪感油然而生。 喔呵呵呵呵……骄傲了点。。

其实所谓的“伪代码法”的想法来自于《重构》一书中所说的:
引用
我们应当遵循这样一个原则,每当感觉需要注释来说明一些什么的时候,就将要说明的东西写进独立函数,并以其用途(而不是实现手法)命名。

以及论坛里一些前辈的经验之谈,还有自己在学习过程中的一点领悟(如从AWDWR中的depot思考软件设计)。遵循着这条原则写代码多了,有时候就会有意的把一些估计处理起来会比较麻烦的过程(往往不是该方法的职责)直接以一句话替代,也就是一个并未实现的方法调用。最后总结出这么个伪代码法。

现在觉得这样写起代码挺自然的,就像是一层层深入的,从最接近用户需求的表面到具体的技术实现的细节的,自顶向下的为你解释一个系统如何工作:
这个功能要做事情A,事情B;
当遇到某种情况时,要去做事情C;
否则,做事情D;
最后做事情E。

然后如果有必要的话,接着开始详细解释、或者说定义事情A、B、C、D、E,就像上面的解释一样。
事情A:
首先做XX
然后……

这样自顶向下写出来的代码目的很明确,下层的接口定义的很清楚,同时保证了不会有多余的代码,你所写的即是你所需要的,避免了过度设计。也不会出现大把业务逻辑写在控制器中的情况了。因为你的控制器已经写明白了控制器要负责的事,剩下的都交给模型去处理吧:

根据perishable_toke查找用户
如果找到用户
  激活用户
  返回登录页面
否则
  返回报告错误页面
结束

@user = User.find_using_perishable_token(params[:token])
if @user
  @user.activate!
  redirect_to signin_path
else
  render 'activate_failed'
end


然后实现find_using_perishable_token方法(authlogic已经实现了)。
接着定义激活用户的方法:
激活用户:
设置user的active值为true
重置perishable_token
保存

User#activate!
def activate!
  self.active = true
  reset_perishable_token
  save
end

然后再实现reset_perishable_token和save方法,不过在这里这两个方法已经是authlogic和rails实现的了。

总的来说伪代码法就是用最直白最简单的人类语言把系统要做的事情简要说一遍(就像讲故事一样 ),然后再往下逐个解释每件事情大概应该怎么做,在处理每件事情的过程中可能又有更繁琐的细节,这时候也以一句简单的话概括,不管它如何实现,然后继续……直到整个功能完成。

之所以叫伪代码法是因为在一开始写出来的代码是不能执行的。不过现在找到它的名字了:假设式脚本编写法(scripting by assumption)、一厢情愿式编程法(programming by wishful thinking)。

我觉得这是一种很实用的开发方法,再跟TDD结合会相当的完美。
分享到:
评论
2 楼 maddemon 2012-03-24  
我以前写过一个复杂的筛选逻辑,开始就是用中文写的。。。.net支持中文- - 后来就改成了英文。
其实就是注释法类似,也或者在纸上写下再转换成代码
1 楼 yuan 2010-12-14  
知道什么叫英雄所见略同么
《The RSpec Book》page 56 写道
The Code You Wish You Had
In my early days at Object Mentor I attended a TDD class being
taught by James Grenning. As he was talking about refactoring
a Long Method, he wrote a statement that called a method
that didn’t exist yet, saying something like “start by writing the
code you wish you had.”
This was a galvanizing moment for me.
It is common to write the code we wish we had doing TDD. Per-
haps we send a message from the code example to an object
that does not have a corresponding method. We let the Ruby
interpreter tell us that the method does not exist (red), and then
implement that method (green).
Doing the same thing within application code, calling the code
we wish we had in one module from another module, was a
different matter. It was as though an arbitrary boundary was
somehow lifted and suddenly all of the code was my personal
servant, ready and willing to bend to my will. It didn’t matter
whether we were starting in a test, or in the code being tested.
What mattered was that we started from the view of the code
that was going to use the new code we were about to write.
Over the years this has permeated my daily practice. It is very,
very liberating, and results consistently in more usable APIs than
I would have come up with starting with the object receiving
the message.
In retrospect, this also aligns closely with the Outside-In philos-
ophy of BDD, perhaps taking it a step further. If the goal is to
provide great APIs then the best place to design them is from
their consumers.

相关推荐

    高斯伪谱法matlab代码

    高斯伪谱法matlab代码高斯伪谱法matlab代码高斯伪谱法matlab代码高斯伪谱法matlab代码高斯伪谱法matlab代码高斯伪谱法matlab代码高斯伪谱法matlab代码高斯伪谱法matlab代码高斯伪谱法matlab代码高斯伪谱法matlab代码...

    分支定界伪代码.txt

    分支定界伪代码.txt

    爬山法伪代码+示意图.ai(寻优算法“爬山法”可编辑AI文件)

    爬山法伪代码+示意图.ai(寻优算法“爬山法”可编辑AI文件)

    tether_optimal_hp-自适应伪谱法_tether_伪谱_模型伪谱法_伪谱法

    总的来说,这个压缩包提供的工具和代码是为了解决tether系统的最优控制问题,通过hp-自适应伪谱法实现高效的轨迹规划和控制,同时满足各种物理和工程约束。这个方法在航天、航空和其他需要精确轨迹控制的领域有广泛...

    用计算机伪代码编写的算法设计题集

    "用计算机伪代码编写的算法设计题集"是一份宝贵的资源,旨在帮助学习者理解和掌握算法设计的一般思想,并通过实践来提升编程能力。这份题集以伪代码的形式呈现,使得各种编程背景的人都能理解并应用。 伪代码是一种...

    数据结构伪代码转化成为可执行源代码

    伪代码是一种简化的编程语言,它用于描述算法或数据结构的操作,而不涉及具体的编程语法。将数据结构的伪代码转化为可执行的源代码是编程过程中的一个重要步骤,它能将抽象的概念转化为实际的程序,使得算法能够被...

    多阶段伪谱法的基本实现

    多阶段伪谱法的基本实现的matlab代码,便于学习和改造成自己的实现。建立了伪谱法的通用框架,目前包含切比雪夫和勒让德伪谱法,可以很容易加入其它伪谱法,也可以进一步加入分段策略改造成hp自适应伪谱法。包含一些...

    位置保留哈希函数的伪代码

    ### 位置保留哈希函数的伪代码解析及应用 #### 一、位置保留哈希(Locality-Preserving Hashing)概述 位置保留哈希(Locality-Preserving Hashing, LPH)是一种特殊的哈希技术,其核心在于能够保持数据在原始空间...

    算法课件,算法伪代码

    本压缩包文件包含的“算法课件”和“算法伪代码”旨在帮助学习者深入理解并掌握几种重要的算法设计策略,包括分治法、贪心法、动态规划、深度优先搜索、回溯法以及分支界限法。接下来,我们将详细探讨这些算法及其...

    变位词_变位词_变位词代码_变位词伪代码_

    本篇文章将深入探讨变位词的概念、如何判断两个字符串是否为变位词,以及编写变位词检测的代码和伪代码。 首先,了解变位词的基本概念。变位词的存在是因为它们共享了相同的字符集和出现次数,而不考虑字符的顺序。...

    Gauss伪谱法求解火箭飞行轨迹_轨迹_gauss_伪谱法_matlab_

    在“压缩包子文件的文件名称列表”中,虽然没有具体的文件名,但通常这些文件可能包含以下内容:MATLAB源代码(.m文件)实现Gauss伪谱法,火箭动力学模型的定义,数据输入/输出文件,以及可能的结果可视化文件(如...

    VC写的计算器伪代码

    例如,为按钮添加`BN_CLICKED`消息映射,然后在响应函数中调用上述伪代码中的方法。 在`EvaluateExpression()`函数中,我们需要实现一个算法来解析和计算中缀表达式。这可以使用Shunting Yard算法或者递归下降解析...

    高斯伪谱法

    `Gauss.txt` 文件可能包含了使用MATLAB实现高斯伪谱法的代码。通常,这样的程序会包括以下步骤: - 定义高斯点和权重。 - 设置周期性边界条件,选择合适的傅里叶基函数。 - 构建线性代数系统,这通常涉及到构造...

    伪逆法的matlab实现

    在本文中,我们将深入探讨“伪逆法”的概念及其在MATLAB中的实现,这主要涉及到线性代数、优化算法以及MATLAB编程技巧。 首先,我们需要理解什么是伪逆矩阵。对于任意矩阵A,其伪逆矩阵通常记为A⁺或A',当A为满秩...

    一个简单的高斯伪谱法matlab代码示例.pdf

    在给定的MATLAB代码示例中,高斯伪谱法被用来求解以下优化问题: 目标函数:\( f(x) = x^2 + 1 \) 约束条件:\( -1 \leq x \leq 1 \) 首先,定义了伪谱点的数量N(在这个例子中为10),以及区间的上下限x_min和x_...

    Gauss伪谱法求解火箭飞行轨迹2.zip

    9. **文件处理**:"a.txt"和" Gauss伪谱法求解火箭飞行轨迹"可能是数据文件或程序代码,用于存储和读取火箭的初始条件、计算结果或其他相关信息。 在这个主题中,我们不仅学习了火箭科学的基本原理,还深入理解了一...

    写伪代码的规则(最全).rar

    在IT行业中,伪代码是一种非常重要的工具,它用于在编程之前表达算法的逻辑,使得思路清晰易懂。张书江先生对于伪代码的规则进行了深入的总结,让我们一起探讨这个主题,了解如何有效地编写伪代码。 1. **明确目标...

    基于高斯伪谱法的二阶常微分方程求解(Matlab实现)

    高斯伪谱法是一种高效的数值方法,主要用于求解偏微分方程(PDEs)以及相关的优化和控制问题。在二阶常微分方程(ODEs)的求解中,高斯伪谱法同样展现出高精度和高效性的特点。在Matlab环境下,可以方便地实现这一方法。...

    matlabRPM_火箭控制_伪谱法_发射控制matlab_火箭_matlab

    "matlabRPM_火箭控制_伪谱法_发射控制matlab_火箭_matlab"这一项目着重于使用MATLAB来实施火箭的发射控制策略,特别是通过伪谱法进行最优化计算。下面将详细解释相关知识点。 1. **火箭控制**:火箭控制系统负责...

Global site tag (gtag.js) - Google Analytics