第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

設(shè)計(jì) Go 程序以避免循環(huán)依賴(lài)

設(shè)計(jì) Go 程序以避免循環(huán)依賴(lài)

Go
眼眸繁星 2023-06-01 16:28:39
我是 Golang 的新手,我做了一個(gè)學(xué)習(xí)它的例子,但是我的例子中不允許導(dǎo)入周期,所以有人知道如何避免這種情況嗎?這是我的代碼。銀行,去package Bankimport (    "../../class/human"    "fmt")func Transfer(payer, receiver *human.Human, payment float64) {    if payer.Bank > payment {        payer.Bank -= payment        receiver.Bank += payment    } else {        fmt.Println("Bank balance not enough")    }}人間圍棋package human// import "../../func/Bank"type Human struct {    Name string    Cash float64    Bank float64}func (h *Human) Transfer(Receiver Human, payment float64) {}主程序package mainimport (    "./class/human"    "./func/Bank")func main() {    gary := human.Human{"Gary", 2000.0, 40000.0}    Sam := human.Human{"Sam", 10000.0, 500000.0}    Bank.Transfer(&Sam, &gary, 5000)}在上面的代碼中可以正常使用Bank.Transfer(&Sam, &gary, 5000)但我認(rèn)為應(yīng)該是人類(lèi)使用 Bank 函數(shù),所以我如何將它重寫(xiě)成這個(gè)?Sam.Transfer(&gary, 5000)我試圖在 Human.go 中導(dǎo)入 Bank.go,但出現(xiàn)了導(dǎo)入周期不允許的錯(cuò)誤。我不確定是我的邏輯錯(cuò)誤還是我糟糕的代碼設(shè)計(jì),但讓我們看看是否有人可以解決這個(gè)問(wèn)題。
查看完整描述

1 回答

?
DIEA

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超3個(gè)贊

這似乎是一個(gè)關(guān)于如何設(shè)計(jì)項(xiàng)目中的數(shù)據(jù)結(jié)構(gòu)和操作及其依賴(lài)關(guān)系的一般軟件工程問(wèn)題。

正如您所發(fā)現(xiàn)的,循環(huán)導(dǎo)入是不好的。有很多方法可以改變?cè)O(shè)計(jì)來(lái)解耦事物。一個(gè)是清晰的層——例如,Bank應(yīng)該依賴(lài)Human而不是相反。但是,如果您想提供方便的功能來(lái)將錢(qián)從 轉(zhuǎn)移HumanHuman,您可以做的一件事是定義一個(gè)Bank對(duì)象將實(shí)現(xiàn)的接口。

然而,為簡(jiǎn)單起見(jiàn),我建議嚴(yán)格分層。沒(méi)有真正的理由 aHuman應(yīng)該依賴(lài)于 a?Bank。在極限情況下,這可能會(huì)變得太麻煩,因?yàn)?code>Humans 需要更多服務(wù)(你會(huì)依賴(lài)HumanaBus來(lái)讓Buses 移動(dòng)Humans 嗎?)


為了回答評(píng)論和更新的問(wèn)題,我會(huì)保持簡(jiǎn)單:

package main


import (

? ? "fmt"

? ? "log"

)


type Human struct {

? ? ID? ?int64

? ? Name string

}


type Account struct {

? ? ID int64


? ? // Note: floats aren't great for representing money as they can lose precision

? ? // in some cases. Keeping this for consistency with original.

? ? Cash float64


? ? DaysSinceActive int64

}


type Bank struct {

? ? Accounts map[int64]Account

}


// Not checking negatives, etc. Don't use this for real banking :-)

func (bank *Bank) Transfer(src int64, dest int64, sum float64) error {

? ? srcAcct, ok := bank.Accounts[src]

? ? if !ok {

? ? ? ? return fmt.Errorf("source account %d not found", src)

? ? }

? ? destAcct, ok := bank.Accounts[dest]

? ? if !ok {

? ? ? ? return fmt.Errorf("destination account %d not found", dest)

? ? }

? ? // bank.Accounts[src] fetches a copy of the struct, so we have to assign it

? ? // back after modifying it.

? ? srcAcct.Cash -= sum

? ? bank.Accounts[src] = srcAcct

? ? destAcct.Cash += sum

? ? bank.Accounts[dest] = destAcct

? ? return nil

}


func main() {

? ? gary := Human{19928, "Gary"}

? ? sam := Human{99555, "Sam"}


? ? bank := Bank{Accounts: map[int64]Account{}}

? ? bank.Accounts[gary.ID] = Account{gary.ID, 250.0, 10}

? ? bank.Accounts[sam.ID] = Account{sam.ID, 175.0, 5}


? ? fmt.Println("before transfer", bank)


? ? if err := bank.Transfer(gary.ID, sam.ID, 25.0); err != nil {

? ? ? ? log.Fatal(err)

? ? }


? ? fmt.Println("after transfer", bank)

}

這段代碼使用了松散耦合。銀行需要知道的關(guān)于一個(gè)人的所有信息就是他們的 ID(可以是 SSN 或根據(jù)姓名、出生日期和其他內(nèi)容計(jì)算出來(lái)的東西)來(lái)唯一地識(shí)別他們。人類(lèi)應(yīng)該持有銀行(如果一個(gè)人在多家銀行都有賬戶(hù)怎么辦?)。銀行不應(yīng)該持有人(如果賬戶(hù)屬于多個(gè)人、公司、虛擬實(shí)體怎么辦?)等等。這里不需要接口,如果確實(shí)需要,您可以安全地將每種數(shù)據(jù)類(lèi)型放在它們自己的包中。


查看完整回答
反對(duì) 回復(fù) 2023-06-01
  • 1 回答
  • 0 關(guān)注
  • 191 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)