Reflection 避免反射-如何最好地重构此代码?
我开始尝试围棋,到目前为止,它是一个爆炸。我决定制作一个小应用程序,帮助一个朋友在他的(小)公司组织信息和业务相关的信息,我想我会用Go来实现它 我还没有(完全)遇到一个问题,更重要的是,什么时候我应该考虑使用反射?例如,我有3种相关类型:Reflection 避免反射-如何最好地重构此代码?,reflection,go,refactoring,Reflection,Go,Refactoring,我开始尝试围棋,到目前为止,它是一个爆炸。我决定制作一个小应用程序,帮助一个朋友在他的(小)公司组织信息和业务相关的信息,我想我会用Go来实现它 我还没有(完全)遇到一个问题,更重要的是,什么时候我应该考虑使用反射?例如,我有3种相关类型:公司、项目和员工。它们都有几个共同的字段(如id,name),因此可以想象,从数据库加载它们的函数(我使用的是MySQL)都非常相似 查看LoadCompany(),LoadStaff(),以及LoadProject(): 当我写LoadCompany()时,
公司
、项目
和员工
。它们都有几个共同的字段(如id
,name
),因此可以想象,从数据库加载它们的函数(我使用的是MySQL
)都非常相似
查看LoadCompany()
,LoadStaff()
,以及LoadProject()
:
当我写LoadCompany()
时,我对自己感觉很好(啊,作为一个初学者/中级程序员),因为它看起来很简洁。但是当我写LoadStaff()
和LoadProject()
时,我所做的只是复制和调整。我确信有更好的方法可以做到这一点,但我已经厌倦了在读完以下内容后跳入思考:
[反射]是一个强大的工具,除非绝对必要,否则应谨慎使用并避免使用
所以我的问题是,我应该使用反射吗?如果是的话,你能给我一些关于最好的技术的建议吗?这只是冰山一角,因为我觉得与这些类型相关的其他函数和方法都是重复的(不要让我开始测试!)
谢谢 类似于:
func LoadObject(sql string, id int, dest ...interface{}) error {
db := tools.OpenDB()
defer db.Close()
stmt, err := db.Prepare(sql)
if err != nil {
log.Panic(err)
}
defer stmt.Close()
return stmt.QueryRow(id).Scan(dest)
}
// Loads the company from the database with the given id.
func LoadCompany(id int) (c Company, err error) {
err = LoadObject("SELECT * FROM companies WHERE id = ?", &c.id,
&c.FullName, &c.Name, &c.History, &c.Overview, &c.Est, &c.Phone, &c.Website, &c.Email)
return
}
请注意,我还没有编译这段代码,但希望它足够好,可以给您一个想法
一些建议:
- 通读文档:
- 在程序启动时创建
实例sql.DB
- 在SQL语句中明确指定列顺序(
)从公司选择全名、历史记录等…
func LoadObject(sql string, id int, dest ...interface{}) error {
db := tools.OpenDB()
defer db.Close()
stmt, err := db.Prepare(sql)
if err != nil {
log.Panic(err)
}
defer stmt.Close()
return stmt.QueryRow(id).Scan(dest)
}
// Loads the company from the database with the given id.
func LoadCompany(id int) (c Company, err error) {
err = LoadObject("SELECT * FROM companies WHERE id = ?", &c.id,
&c.FullName, &c.Name, &c.History, &c.Overview, &c.Est, &c.Phone, &c.Website, &c.Email)
return
}