3 回答

TA貢獻(xiàn)1812條經(jīng)驗 獲得超5個贊
使用第三個套餐選項:
yourgame/
state/
state.go
modifier/
modifier.go
main.go
main.go 將兩個組件粘合在一起:
import "yourgame/state"
import "yourgame/modifier"
type Game struct {
state state.State
modifier modifier.Modifier
}
func main() {
// something like:
var game Game
game.modifier.Modify(game.state)
}
不過,這種方法可能過于緊密耦合。與其操作本質(zhì)上是全局的狀態(tài)對象,不如嘗試將數(shù)據(jù)分割成修改器所需的數(shù)據(jù)。
抽象的推理很難,所以這里有一個具體的例子來說明我的意思。在你的游戲中:
type Object struct {
ID, X, Y int
// more data here
}
type Game struct {
Objects map[int]*Object
}
在您的“修改器”中,假設(shè)我們有一個移動對象的 AI 模塊。如果他只關(guān)心單個對象的位置,您可以創(chuàng)建一個界面:
// in yourgame/modifier
type Object interface {
GetCoordinates() (int, int)
SetCoordinates(int, int)
}
type Modifier struct {}
func (m *Modifier) Update(obj Object) { }
然后我們只需要將這些方法添加到我們的原始對象中:
type (obj *Object) GetCoordinates() (int, int) {
return obj.X, obj.Y
}
type (obj *Object) SetCoordinates(x, y int) {
obj.X, obj.Y = x, y
}
現(xiàn)在您可以將對象傳遞給您的修改器,而無需循環(huán)依賴。
現(xiàn)在,如果事實證明您的“修改器”界面最終看起來與您的游戲?qū)ο髱缀跬耆嗤?,那么第三個結(jié)構(gòu)包可能是合理的,因此您不必總是重復(fù)自己。例如,考慮net/url.

TA貢獻(xiàn)1773條經(jīng)驗 獲得超3個贊
通常,如果 packageB有直接讀取/修改的代碼,A.Type那么該代碼應(yīng)該在 package 中A。至少需要直接訪問的部分應(yīng)該是。
要在單獨的包之間拆分某些內(nèi)容A,B您通常會嘗試隔離 API 以訪問A.Type可以表示為接口的 API 。然后B將定義和使用這個接口并A.Type實現(xiàn)它(隱式地,不需要包含 B 對它的定義)。
然后一些東西(可能A,可能是一個單獨的包)將B通過適當(dāng)?shù)貍鬟f一個A.Type或*A.Type值來使用。
或者,根據(jù)您的設(shè)計,這種關(guān)系可以顛倒,B.OtherType隱式實現(xiàn)由A. 或兩者A并B只能通過接口使用對方; 這一切都取決于細(xì)節(jié)。
例如,也許是這樣的:
package Game // "A"
type State struct {
data int // etc
}
func (s State) IsValid() bool { return true }
func (s *State) ChangeY(arg int) error { return nil }
// …etc…
和:
package Modifier // "B"
type GameState interface {
IsValid() bool
ChangeY(int) error
}
type M struct {
s GameState
//…
}
func New(s GameState) *M {
return &M{s: s}
}
func (m M) DoSomething() {
if s.IsValid() {
// …
}
s.ChangeY(42)
// …etc…
}

TA貢獻(xiàn)1963條經(jīng)驗 獲得超6個贊
我會在同一個包中定義類型(在這種情況下是游戲)及其所有方法。你甚至不能根據(jù)語言規(guī)范定義從另一個包導(dǎo)入的類型的方法,
//you should first do
type MyPackageType ImportedType
//and only then
func (foo MyPackageType) Modify() {
...
}
- 3 回答
- 0 關(guān)注
- 200 瀏覽
添加回答
舉報