clean code与算法
问题背景:
coach经常找一些小题目给我们练习clean code,其中常有一些包含算法的题目。
但是coach和其它人不懂算法,只是按照最常规的方法去实现。
习惯于算法的我,常常会觉得很难受,就算代码写得再clean,也会怎么看都不爽,因为从算法的角度讲,那代码实在是太烂了。
我也会提一些建议,用一些算法进去,能够更快更方便地得到结果。
可是我的建议几乎都是被否,coach的理由是:
1.我们现在是在讨论clean,不是效率,如果要考虑效率,就等到需要提高效率的时候再去考虑。
2.你的方法能很容易就能看懂吗?如果不容易看懂就不用写了。
问题描述:
对于coach的反驳让我困惑。
1.Clean Code宣称,一开始就要做正确的事情。就一定要从clean的角度去做正确的事情?
为什么不在一开始的时候,就从效率的角度做一些正确的事情?
2.我认为算法是计算过程中的捷径,它不走寻常路,当然不容易看懂了。
对于没有算法基础的人来说,如果光凭几行代码就能把算法看懂,那算法不是太好学了。
为什么要写clean code,就要回避算法?
难道clean code也有局限性,它对算法就是不适用?
问题分析:
问:为什么不在一开始的时候,就从效率的角度做一些正确的事情?
答:在写代码的时候,常常是有很多东西是要考虑到的,但是同时处理那么多事情又不现实。
这么多事情,总有个轻重缓急,因此选择当前最重要最急迫的事情去处理好,就是当前最重要的事情了。
也许,在clean code的思想里,把代码写得容易看懂是在写代码的时候最重要的事情,因为这是后面所有优化的基础。
而其它方面的优化,比如效率,是在写完了代码并在使用的时候发现了一问题需要改,到那时,解决这些问题才是最重要的事情。
因为学过算法,一开始写的时候就能预知到哪里会瓶颈,因为迫不及待地想要提交解决这些问题。但是事实上,看是按照顺序一个一个地解决比较好。
问:为什么在一开始的时候,就从clean的角度做一些正确的事情?
答:clean中后续解决其它问题的基础。
因为我们都是凡人,大脑的内存和CPU都是有限的,如果一开始写得不好,到后面想改的时候发现看不懂了,怎么改呢?
当然可以把以前写的代码再看一遍,看懂了再去改,但是何必这样为难自己呢?
所以一开始就要把代码写好。
问:为什么要写clean code,就要回避算法?
写clean code是不应该回避算法的,也许只是时候未到。
事有轻重缓急,没有发展到那一步,所以没有算法背景的人自然不会往那方面想。
但是若真的要考虑算法了,也是从clean code的角度去实现算法的。
从clean code的角度,把算法从原始实现一步一步地重构,最终推导出算法实现,也算是一种水到渠成。
问:clean code对算法不适用吗?
答:我相信clean code对任何代码都是适用的。
虽然算法是不走寻常路,可它的捷径也不是随意走出来的,也是通过某些方法一步一步推导出来的。
其实算法的产生是有根据的,那么写出来的代码就是有含义的。
只不过通过代码的方式去表达这些含义,就需要功力更加深厚的clean coder了。
当然,代码毕竟不是面向所有人的,这些算法的根据思想用几本书都难以表达清楚,更何况几行代码。
只不过,在为算法编码的时候,也要尽可能地去clean了。
解决方法:
问:在一开始写代码的时候,就想用算法去优化,而忘记了代码的可读性,怎么办?
1.如果不是在比赛,时间不着急的情况下,还是按照顺序一步一步地来,毕竟,现在是在练习clean code,而不是在练习算法
2.耐心地一步一步地重构,也可以说是从clean code的角度去看算法,多维度去理解一个问题,也许会对问题有了新的认识
3.写过一次之后,可以把最终结果作为模版保存下来,下次可以直接用了。
问:什么情况下,可以考虑算法方面的优化了?
按照要解决的问题的轻重缓急,每次都是只解决当前最重要最急迫的事情,每次都只做当前最正确的事情。
算法方面的优化最终水到渠成。
问:怎样把clean code结合到算法中
1.算法并不是随意产生的,它一定是有迹可寻的。把这些表达清楚,我认为就是clean code了。
2.更深入地理解算法的本质,有助于把算法表达清楚。
3.用代码把算法表达清楚当然是很难的事情了,因此一定要more parctise.