犯错记录(一)

  1,需求明确,却在实现的过程中遗忘。

  上周五完成预计任务后,期望对整个代码进行优化。首先选择一个解析JSON的功能。最初的需求其中是2个:更轻松的使用 和 出现中小性质变动时不需要对代码进行修改。后者,相对而言比前者更加重要。

  对于这个解析器设计,我零散的做过很多预想,中间也提取过各类需求。但,在整理需求时,我出现了一个错误:设计类就遗忘了需求。像我上面所说的,我的期望是使用和未来的少变动。但实际上,我在设计的最初,也是依据这2个目标去完成的,设计了一个类似下面的类

class A{
    public:
        virtual usingA();
        virtual GetValue();
};

  看起来应该是正确的,结果呢?。。。竟然发现无法直接用于已有代码中。

  很坑爹?是的,我用了接近一个小时去提取需求,整理规划。然而,在真正设计时,我竟然忘记了需求。当然,如果从设计角度,这个做法本身并没有错误,因为这个类的设计方式,更加符合一般性规则。然而,我的使用前提,应该是在不变更当前已有代码的基础上完成类的修订。

  大概有人会说,既然你觉得现有的更好,应该让修正已有代码啊。然而,事实上,如果我重新优化现有代码,需要的时间可能是一周,在工作上,这可能是完全不允许的。

  所以,我大概浪费了2个小时时间,做了2小时以后就删除了的类框架。

  2,在实现之前,应该使用类对象模拟使用。

  上述例子中有一个幸运在于,这个类的实现使用了大部分已有的代码和工具类,所以实现的过程大略半小时就完成了一半。此时,在测试时,才发现原来设计的东西无法使用。《代码大全》中描述,越早发现问题,修复的成本越低。

  实际上,我正在尝试一种编码习惯:设计完类后,先将其放入适用场景去使用,看是否能够符合要求。

  这个规范其实可以更延伸一些:当实现一个复杂功能函数时,直接在其中使用未完成子程序(甚至未声明和设计)。这样的好处有:

    1,代码看起来更清晰。

    2,复杂功能的函数代码不会过长。

  一个简单的例子:

放大象到冰箱(){
    打开冰箱(手);
    放入物品到冰箱(手,大象);
    关闭冰箱(手);
}

  这种方式有一个好处:在你没有非常清晰的函数需求,参数需求时。你可以通过编程中渐渐清晰。例如此例,你最少知道需要这样3个函数,和2个形参(或成员变量)。

  但,这种方式从本质上,并不适合用来设计类,因为它是从指向性需求来规划类的。而类的设计应该是抽象的概念。

  可是,在你根本没法再指定时间内(工作是有时限的)完全的设计出类时,可以参考此方法。

时间: 2024-11-03 05:30:59

犯错记录(一)的相关文章

致DBA:为什么你经常犯错,是因为你做的功课不够

专职做DBA已经6年多的事件了,看同行.同事犯了太多的错误,自己也犯了非常多的错误.一路走来,感触非常深.然而绝大多数的错误其实都是很低级的错误.有的是因为不了解某个引擎的特性导致:有的是因为对线上环境不了解导致:有的是因为经验不足导致:一路上,跌跌撞撞,从小公司DBA,到腾讯高级DBA,再到现在的金融数据库DBA. 不由得想起5年前的我,刚进入DBA行业,缺乏经验,经常犯错误,不是我不够努力,更多的是初来咋到的我根本不知道应该在哪方面下功夫.本文就是基于这方面的考虑,根据自己在DBA这个职业上

作用域--高手都容易犯错的地方

在js中,我们都知道,this的指向是由它被调用时的上下文所决定的.例如: window.id = 888; var data = { id : 999, getId : function(){ console.log(this.id) } } data.getId(); // 999; var getId = data.getId; getId(); // 888 当我们在data上调用getId方法时,this显然是指向data对象的.这个很好理解,我们需要注意的是,当我们把data上的ge

《设计师要懂心理学》-第九章-人会犯错

第九章  人会犯错 人皆有错,难能宽恕. ——亚历山大·蒲柏 人都会犯错.创建一个防止人们犯错的系统是不可能的.本章将介绍与人犯错有关的知识. 85.人总会犯错,没有完全的容错产品 要点: 1)应假设总会出错 很难创建一个不存在任何错误并且保证人们不会犯错的系统.设计一个容错系统的成本很高,而且你永远不会真正成功.(产品的快速迭代,不断修复错误) 2)最好的错误提示就是没有提示 也许错误提示是一台设备或软件系统中花费时间和精力最少的部分,也许这样做很合理.毕竟,最好的错误提示就是没有提示,这意味

朱晔和你聊Spring系列S1E6:容易犯错的Spring AOP

标题有点标题党了,这里说的容易犯错不是Spring AOP的错,是指使用的时候容易犯错.本文会以一些例子来展开讨论AOP的使用以及使用过程中容易出错的点. 几句话说清楚AOP 有关必要术语: 切面:Aspect,有的地方也叫做方面.切面=切点+增强,表示我们在什么点切入蛋糕,切入蛋糕后我们以什么方式来增强这个点. 切点:Pointcut,类似于查询表达式,通过在连接点运行查询表达式来寻找匹配切入点,Spring AOP中默认使用AspjectJ查询表达式. 增强:Advice,有的地方也叫做通知

哪些要素在做产品需求的时候容易犯错?

产品经理是一个思考的工种,而多想多思考成为产品经理成长最为关键点.而经验会帮助产品经理在产品需求认知和产品设计上不会犯错误,而快速进入角色.很多新手却办不到这一点. 一.判别需求是否真实存在?需求真伪性 当产品经理接到一个业务部门的需求,一个老板的需求.很多人惯性的思维是如何完成这个需求.而展开对需求思考.但是在此之前,我们需要去判别这个需求的真伪性.如果是伪需求,那么做出来是对我们的产品没有任何的意义.需求是否真实存在,真实性如何?是否有场景可以承接这个需求本身. 二.表面需求后,没有去了解更

javascript sort方法容易犯错的地方

sort方法用来对数组排序非常方便.但是sort(func)这个func参数的构造却很容易混淆. 这个func的作用是,把排序结果里任意相邻两项a,b放入到func里来执行,如果返回值都为-1,则为正序排列,如返回值都为1,则为逆序排列. 例如,[1,3,65,97,45,6,2] 如果要正序,就应该写成[1,3,65,97,45,6,2].sort(function(a, b){return a - b;}), 如果要逆序:[1,3,65,97,45,6,2].sort(function(a,

duplicate symbol _OBJC_METACLASS_$ 报错记录

duplicate symbol _OBJC_METACLASS_$_TabbarButton in: /Users/hw201406/Library/Developer/Xcode/DerivedData/xxx-gafskbgawbctznekgfxqhaugwjce/Build/Intermediates/xxx.build/Debug-iphonesimulator/xxx06.build/Objects-normal/i386/TabbarButton-FDEB19611A30D765

InnoDB: The InnoDB memory heap is disabled报错记录

报错记录: [[email protected] ~]# cat /data/3307/data/localhost.localdomain.err  150509 21:21:27 mysqld_safe Starting mysqld daemon with databases from /data/3307/data 150509 21:21:27 InnoDB: The InnoDB memory heap is disabled 150509 21:21:27 InnoDB: Mute

Makefileeasy犯错的语法

1.引言 近期学习android的Build系统,接触最多的自然就是Makefile语法.发现非常多easy出错的地方,不避开这些错误语法没法真正了解Makefile的内涵.以下就介绍遇到的一些让人困惑的语法错误 2.列举easy犯错的地方 ifeq条件推断 ifeq($(fro),no) endif 多么简单的语法.可是运行会报错例如以下: Makefile:2: *** missing separator. Stop. 原因: ifeq和左括号'('之间是必须有空格的. shell脚本的使用