犯错记录(一)

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

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

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

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

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

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

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

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

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

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

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

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

    1,代码看起来更清晰。

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

  一个简单的例子:

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

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

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

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

原文地址:https://www.cnblogs.com/zheng39562/p/4540110.html