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

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

 [[436736]]

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

久等了。继续我们的 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 小结

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

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

 

责任编辑:武晓燕 来源: 幽鬼
相关推荐

2021-12-07 11:30:32

Go煮蛋计时器

2019-12-24 16:52:22

Go语言腾讯TM函数

2013-05-23 16:01:47

Android开发移动开发Chronometer

2023-04-17 09:08:27

CSS计时器

2012-05-08 13:58:37

SharePoint

2011-05-31 16:50:35

Android 线程

2021-03-26 09:10:11

Go 参透计时器

2023-01-11 09:02:50

2020-03-10 09:42:04

JavaScript前端线程

2013-03-25 10:03:35

网络优化网络抑制快速认知网络

2011-09-08 14:01:01

Android Wid实例

2020-06-11 08:48:49

JavaScript开发技术

2022-06-28 15:29:56

Python编程语言计时器

2023-12-11 09:50:35

Linux定时器

2010-01-25 11:29:33

Android计时器

2022-06-23 07:23:34

自定义组件计时器

2010-01-05 15:00:30

.NET Framew

2024-07-18 08:46:58

.NET轻量级计时器测量代码块

2022-06-30 16:10:26

Python计时器装饰器

2022-06-29 14:15:01

Python计时器上下文管理器
点赞
收藏

51CTO技术栈公众号