Cha*_*les 4 architecture information-hiding coding-style global-variables go
我正在用 Go 编写一个简单的程序作为学习该语言的练习。该程序是一个游戏玩家:它是一个基于文本的游戏,然后通过/exec.Command与其进行通信。经过一番闲逛和阅读大量在线文档后,我设法让框架开始工作——相当于 Hello World,我在其中建立了双向通信,并且可以处理程序终止等错误。StdinPipeStdoutPipe
现在我正在尝试编写实际的玩游戏的人工智能代码。由于我的目的是学习这门语言,因此我在风格上非常小心——我不只是想用 Go 编写 C(或其他语言)。
程序中明显的分工(一旦完成所有设置)分为两部分。首先,程序查看当前状态并决定应向游戏发出什么命令。其次,程序查看返回的数据并相应地更新状态。(是的,这是一个简单的游戏 - 它等待输入然后响应,不存在计时问题。)
我不确定这些状态信息应该去哪里。将其全部转储到全局范围中感觉是错误的,而创建一个巨大的单例对象似乎更糟糕(Go 并不是特别面向对象)。无论如何,我不想让函数传递并返回 20 多个变量。
一般性建议很好,但我最感兴趣的是适合 Go 的惯用方式。根据要求,我可以共享代码,但我认为这没有帮助。
我喜欢为此目的使用包。
简单的例子:
package foo
func Incr() {
f.incr()
}
func Count() int {
return f.count()
}
type foo struct {
sync.RWMutex
count int
}
func (f *foo) incr() {
f.Lock()
f.count++
f.Unlock()
}
func (f *foo) count() int {
f.RLock()
defer f.RUnlock()
return f.count
}
var f = &foo{}
Run Code Online (Sandbox Code Playgroud)
该包可以导入到任何其他包中并保持状态。我添加了sync.RWMutex来防止任何竞争条件。这使您可以完全控制 foo 的状态如何被访问和被很好地包含。
| 归档时间: |
|
| 查看次数: |
3327 次 |
| 最近记录: |