关于clean code 的感想

来源:互联网 发布:网络市场调研方法 编辑:程序博客网 时间:2024/05/22 13:56

最近在做Leetcode,我然后有看cleancodehandbook。 

我之前没有接受过ACM 竞赛的训练,在写clean codes 和 fast code 方面确实非常欠缺。具体表现在:

1)离开智能的IDE就没法code, 敲三个字母就要等hint list提供选项给我选。面试的时候,都是在OJ 上, OJ上不光没有hint list, 连语法提示都没有。开始刷LeetCode以后,我强迫自己用Sublime Text+CMD 来编程,现在习惯了这种“简陋”的开发环境了以后,感觉效率反倒是蛮高的。如果小程序或者工程不大,真的可以考虑用sublime开发。另外一个收获是自己代码通过率开始提高了。因为没有语法提示,自己会下意识的检查语法,然后动手到Java  API里查文档。这要是在以前,不是万不得已, 写JAVA万年不看Java API,全都靠Eclipse。

离开IDE以后,现在有时候甚至编译两次就通过。 以前,用记事本写个hello world 都有可能出错。


2)code 臃肿,流程控制混乱。 可能上之前写的东西,都是完全应用性的东西,没有很强的逻辑在里面,基本上不用动脑子,写代码就是Android.com >>baidu>>google>>android.com>>github>>CSDN, 看完了解了某个功能如何实现,就开始写了。 现在开始写leetcode,有些题目不是很难,但是都是纯计算,对思路、算法要求高的多。经过这段时间的训练和阅读算法导论,觉得自己在这方面有点起色了,但是基本功还是不扎实。


这里贴上两个代码,来记录自己的进步。

第一个代码代码臃肿,代码运行路径混乱,而且运行超市,没有通过。

/***Implement strStr().*Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.*/public class Solution {    public int strStr(String haystack, String needle) {// haystack=a, needle=a    if(needle.length()==0) return 0;     for(int i=0;i<haystack.length();i++){ //i=1     int j=0;     int index=i;     while(i<haystack.length()&&j<needle.length()&& haystack.charAt(i)==needle.charAt(j) ){     j++;i++;     }     if(j==needle.length()) return index;     else {j=0; i=index+1;}     }     return -1;       }}
以前我是反感使用i,j 这样的变量名的,现在发现,如果对短小的变量名使用形成良好的,一直的使用规律,其实用起来挺不错的。比如,我现在所有的代码里,i代表头,或者1,j 代表尾或者2,这样用起来可读性其实不差。

以上代码流程控制过去复杂。这是一个暴力破解算法,思路从内外层循环,内外层跳出条件,最后考虑内外层要做的操作。


1)外层对haystack的每个字母遍历,内层对needle 遍历。

2)外层的跳出条件是 a> i指针指到了  haystack.length()-needle.length()   内层跳出条件为: a>j指针指导了needle队尾 b>*i!=*j  

3) 外层执行,返回-1, 内层执行,检测是否出现全等子序列,如果有,返回i值。

以下贴出按以上思路,我自己的clean 代码,

public class Solution {    public int strStr(String haystack, String needle) {        for(int i=0;i<haystack.length()-needle.length()+1;i++){        int j=0;        for(;j<needle.length()&& haystack.charAt(i)==needle.charAt(j);j++) i++;        i=i-j;        if(j==needle.length()) return i;        }        return -1;    }}

最后,贴出cleancode上给出的代码,可以看到,还是有很大差距的,人家的代码更加的clean。简直洁癖

public class Solution {    public int strStr(String haystack, String needle) {        for(int i=0;i<haystack.length()-needle.length()+1;i++){        <span style="white-space:pre"></span>int j=0;        <span style="white-space:pre"></span>for(;j<needle.length()&& haystack.charAt(i)==needle.charAt(j);j++) i++;        <span style="white-space:pre"></span>i=i-j;        <span style="white-space:pre"></span>if(j==needle.length()) return i;        }        return -1;    }}



0 0
原创粉丝点击