GO语言 代码的嵌套——各种状态的组合

erlib · · 411 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

原创翻译文章,转载请注明出处:服务器非业余研究-sunface

 

对于代码风格的争议由来已久:程序员在一段代码中到底该使用多少嵌套或者缩进结构。请先看看下面两个例子:

在第一个例子中,如果我们想在高亮代码附近进行debug,那么我们需要记住哪些呢?

func (g *Gopher) WriteTo(w io.Writer) (size int64, err error) {
    err = binary.Write(w, binary.LittleEndian, int32(len(g.Name)))
    if err == nil {
        size += 4
        var n int
        n, err = w.Write([]byte(g.Name))
        size += int64(n)
        if err == nil {
            err = binary.Write(w, binary.LittleEndian, int64(g.AgeYears))
            if err == nil {
                size += 4
            }
            return
        }
        return
    }
    return
}
答案是:在高亮代码之前的每个if语句,这些语句每个都是一种状态。接下来请继续看看第二例子:
func (g *Gopher) WriteTo(w io.Writer) (size int64, err error) {
    err = binary.Write(w, binary.LittleEndian, int32(len(g.Name)))
    if err != nil {
        return
    }
    size += 4
    n, err := w.Write([]byte(g.Name))
    size += int64(n)
    if err != nil {
        return
    }
    err = binary.Write(w, binary.LittleEndian, int64(g.AgeYears))
    if err == nil {
        size += 4
    }
    return
}
 
在这个例子中,高亮代码对于代码之前的逻辑(它到底从哪里来的)所关心甚少 —— 它所需要知道的就是我们的代码已经执行到这里了。这种扁平的、大量“失败-返回”的结构可以被称为“迅速失败”模式:在这种模式中,当你执行到代码最底部时,你只需要一种状态:代码已经执行到最后了,并且成功了,并不需要向上层逐层返回。所以你可以忽略这个状态之前的所有代码和过程。当然了这两段代码在逻辑上是等价的。
最后不得不谈到心智模型——当工作在一段本地代码(本地状态)的时候你还要记住那些“非本地元素”列表(代码耦合度很高)。对于作者来说“非本地元素“列表就是非本地状态的一种很好的定义。所以请记住避免状态之间的耦合,尽量采用第二种模式来实现你的代码。

 

 

原文地址:http://clipperhouse.com/2014/03/30/nesting-is-state/

 


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:erlib

查看原文:GO语言 代码的嵌套——各种状态的组合

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

411 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传