zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Go Gio 实战:煮蛋计时器的实现之重构

2023-04-18 15:43:41 时间

 

大家好,我是程序员幽鬼。

久等了。继续我们的 Gio 实战。

01 目标

经过前几节的学习,我们从一个空白界面慢慢添加元素,但将所有代码都放在一个文件的 main() 中会使其难以理解,也更难添加更多功能。因此,我们将稍微重构一下程序,简单地将其分解为更小的部分。

本节不增加新功能,主要探讨如何重构之前的代码。

02 代码

步骤 1:main() 太长了

main 太长,而且做的事情也太多。最好是main() 只负责启动和控制程序。进行简单重构如下:

  1. func main() { 
  2.   go func() { 
  3.     // 创建一个新窗口 
  4.     w := app.NewWindow( 
  5.       app.Title("煮蛋计时器"), 
  6.       app.Size(unit.Dp(400), unit.Dp(600)), 
  7.     ) 
  8.     if err := draw(w); err != nil { 
  9.       log.Fatal(err) 
  10.     } 
  11.     os.Exit(0) 
  12.   }() 
  13.   app.Main() 

现在,在 main() 里,我们像以前一样创建一个窗口 w,并立即将其交给一个专门函数draw()。

我们可以检查 draw() 的结果来判断是否发生了错误,并对错误进行必要的处理。

正常情况下,draw 函数不会返回。如果是用户正常关闭,通过 os.Exit(0) 退出程序;否则通过 log.Fatal(err) 输出错误信息后退出程序。

步骤 2:约束和尺寸 - 一个方便的快捷方式

之前文章详细介绍过 Constraints 和 Dimensions,因为它们使用频率很高,这里为 Dimensions 和 Context 定义简短的别名:

  1. type C = layout.Context 
  2.  
  3. type D = layout.Dimensions 

步骤 3:No 3 - draw( ) 函数

以下是 draw 函数的简化版:

  1. func draw(w *app.Window) error { 
  2.     // ... 
  3.  
  4.   // listen for events in the window. 
  5.   for e := range w.Events() { 
  6.  
  7.     // detect what type of event 
  8.     switch e := e.(type) { 
  9.  
  10.     // this is sent when the application should re-render. 
  11.     case system.FrameEvent: 
  12.         // ... 
  13.      
  14.         // this is sent when the application is closed. 
  15.     case system.DestroyEvent: 
  16.       return e.Err 
  17.     } 
  18.   } 
  19.   return nil 

和之前一样,我们通过 w.Events(),检测它们的类型。

  • system.FramEvent 像之前一样处理
  • 我们 system.DestroyEvent 添加了一个新的 case,对于正常的窗口关闭,它返回 nil;否则返回 Err

03 小结

重构是以安全快速的方式转换代码,这对于保持清晰易于修改以满足未来需求至关重要。

本文转载自微信公众号「幽鬼」,可以通过以下二维码关注。转载本文请联系幽鬼公众号。