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