不应如此编程

最近因为学习的关系很少碰代码。

最近看了一下自己写的代码,是一个链表,看到一行(链接),代码的意思是增加数据结构的计数器,我看到这一行的时候却疑神疑鬼了,因为这被包含在初始化一个节点的函数中,但还有其他的一些函数,比如说在特定位置插入,我写的时候或许会忘了一件事:“计数器已经加过了” 而再加一遍。

仔细检查了一下这里应该没出现问题,其他操作都没有动计数器,依赖计数器的函数工作也很正常,然而让我感觉不好的并不是可能出错,而是我看到这行语句以后不确定别的地方没有干不应该干的事情。如果我有底气,看到这行代码心里也就能保证这行代码只出现在这一个函数里面。

回想起来我一直是这样编程的,脑袋昏昏沉沉挤出一点代码,一个一个函数开始写,一个函数需要一个功能了,在脑袋里面压入栈开始写另一个函数,写完了再弹出栈继续写原来的函数,看起来能成一个系统,但是第一次编译运行的时候心里对编译通过根本没有希望,修改了语法错误和编译器警告以后,再次运行,同时也不会对程序逻辑正确抱有希望,看到错误出现了,大致揣摩一下错误出现在什么地方,些几行printf来定位调试,改了几次终于发现某处有个小失误,或者恼羞成怒整个函数重新写,

这就是散弹枪编程加上撞大运编程,看上去就让人觉得傻而蛋疼,没有规划,只有之后的重构才能让代码看着不那么恶心。

以后写程序的时候,我觉得我应该做到,

  • 不要想到什么写到什么,先在脑子或者纸上将程序逻辑明晰,写几个空函数和接口,清楚这些函数该干什么之间该有怎么样的联系,然后在动手一个一个的实现函数的功能。
  • 对复杂而容易出错的地方适当的编写测试用例。
  • 输出日志。

不应如此编程》上有8条评论

  1. hyzstudio

    有两点需要注意
    首先,链表是容器,最好不要用容器去参与构造节点
    其次,count是list的节点数量统计,应该放在所有list操作的地方处理

    回复
    1. hyzstudio

      另外,虽然程序之路和读什么大学无关,但是还是大学的基础课程对于以后的学习还是有一定的帮助的,尤其数学以及很多计算机基础课,所以希望你能继续坚持下去

      回复
    2. 酿泉 文章作者

      谢谢。
      不要用容器参与构造节点不太懂,ListNode 只是包含了指向List 的指针,这样做不对?
      “所有list操作的地方” 是什么地方?

      回复
  2. AZ508

    其实我觉得你的编程方式非常好,这才是一个初学者正常的编程方式.
    实际上,框架,预先设计什么的那些都是在你已经对于一个环境有了足够了解之后才能考量的”奢侈品”.
    对于初学者来说,辛辛苦苦打了一个框架结果发现底层实现根本不允许这种框架工作是常有的事——而且这还只是对于足够大的的程序而言.
    假如你写的程序不大(就像你作的这个链表),那么你需要的不是框架,而是不断的Try & error.理由很简单,一个程序足够小,却依然能难住你只能说明这个程序充满了算法.我没见过哪个人写算法是一遍过的,人脑不是电脑,你更不是编译器,回忆一下你的大脑写出让你的身体能够走路的程序花了几个月?幻想程序一遍过那是不可能的.
    看起来你似乎早已不满足于单纯的语言学习而开始涉足算法与数据结构了,事实上这对于大多数大学来说已经是大二才会去学习的内容,不用那么着急,慢一些也没关系.对于这里的学习,相比于速度,质量更加重要.

    至于容器什么的,都是cpp以后才出现的概念,如果你去学习stl的话就会明白.但这些对于你来说大抵不是什么重要的事情,如果你有志开始对于cpp的学习,或许相比去了解stl的那一堆概念,把这个链表改成cpp版本会是一个更好的开始,简单的建议:
    1用类去封装
    2用继承去完成一个加强版链表
    3用虚函数重写着俩链表
    4用模板去重写链表
    以上,希望有些用处。

    回复
  3. easoncxz

    看了一些 SICP 之后,我对理想编程方式不是你说的两者中的任一者。

    编程语言也是表述性的语言,而不只是代码、记号。程序员不应该需要将自己的想法“编译”成代码。应该拿起问题,想:“我要干什么?如何向另一个程序员解释自己的算法?”——自己会怎么和另一个程序员解释,就怎么写代码。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注