查看: 809| 回复: 0
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 如何写出bugfree代码(关于编码风格

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
TL;DR 定义多个功能单一的函数,并命名以readable function name

相信大家都认同一点:越复杂的代码,出现bug的几率越高
楼主建议大家做的,就是用尽量简单的代码实现solution

以LC 388 为例,楼主为每个子逻辑都定义了函数。(文章末尾有代码
比如判断一个字符串是否是文件名:如果里面有 ".",就是文件名,如果没有,就不是
很多同学(包括以前的楼主)喜欢直接写
  1. if strings.Index(s, ".") != -1 {
  2.   // do something
  3. }
复制代码
单独看这一段代码,没什么问题。但是把放到整体代码里面我们就需要做一次思维转换,查找一个字符串中是否有 "." 是在判断这是否是一个文件名

楼主非常喜欢一句话:“程序写出来是为了让人看懂它的算法,附带告诉计算机如何执行” ---- 《黑客与画家》

我们为每个子逻辑定义函数,就是为了让主函数看起来更像自然语言。这样,写代码和阅读代码需要的思维复杂度也就更低,即我们写出bug的概率更小。
我相信,再聪明的人,写的代码多了(需要考虑的事情多了),一定会出现bug。
我想做的,是在实现功能的前提下,思考尽量少的逻辑。
主函数只是一些子函数的拼接,看起来像是自然语言。我们阅读自然语言,肯定更容易发现bug
而子函数内部只专注于一个功能,我们看看自己写的代码,再看看函数名,也更容易写出bugfree的代码

反之,所有逻辑都堆积于主函数内,我们写一个代码片段的时候,需要结合上下文才能看出来写得对不对,无疑增加了我们写出bug的频率

最后,楼主还有一个习惯,写把自己的思路写在函数开头的注释里。思路理清再开始编码
  1. func lengthLongestPath(input string) int {
  2.     paths := strings.Split(input, "\n")
  3.     /*  iterate paths, find its depth by the number ot \t
  4.         if it's a dir, push of depth[i], set len(dirname) to dep[i]
  5.         if it's a file(contains dot), caculate the absolute path len, update the max len
  6.     */
  7.     maxLen := 0
  8.     dep := make(map[int]int, 0)

  9.     max := func(x, y int) int {
  10.         if x > y {
  11.             return x
  12.         }
  13.         return y
  14.     }

  15.     isFile := func(s string) bool {
  16.         return

  17.     }

  18.     depth := func(s string) (int, string) {
  19.         d := 0
  20.         for strings.HasPrefix(s, "\t") {
  21.             d++
  22.             s = strings.TrimPrefix(s, "\t")
  23.         }
  24.         return d, s
  25.     }

  26.     pathLen := func(path string) int {
  27.         d, name := depth(path)
  28.         pLen := len(name)
  29.         for i := 0; i < d; i++ {
  30.             pLen += dep[i] + 1
  31.         }
  32.         return pLen
  33.     }

  34.     for _, path := range paths {
  35.         if isFile(path) {
  36.             maxLen = max(maxLen, pathLen(path))
  37.         } else {
  38.             d, dirname := depth(path)
  39.             dep[d] = len(dirname)
  40.         }
  41.     }

  42.     return maxLen
  43. }
复制代码

评分

参与人数 1大米 +10 收起 理由
14417335 + 10

查看全部评分


上一篇:请问下这道题除了while loop的方法,有啥更高效的解法么?
下一篇:297. Serialize and Deserialize Binary Tree 关于树中的None问题。。。。。。。。。
您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表