- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - phát hiện rò rỉ bộ nhớ Ruby/Ruby on Rails
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
问题:存在关联键的表列表。有必要为每个表实现 CRUD + 一些关于表细节的功能(分页等)。麻烦:在每个表的每个功能实现中重复了大约 50% 的代码。问题:关于语言细节、优化/重构/使用类似代码模式的方法是什么?
示例代码部分
//------------------------------------------------------------------
// user
//----------------------------------------------------------------------
func (d *Database) UserCreate(email, password, username string, role int) *Answer {
//variables
answer := d.initCall("UserCreate")
user := new(User)
//check exist user
if userExist := d.DB.Find(&User{}, &User{Email:email}).Error; userExist == nil {
answer.AnswerJSON.ErrorAnswer.Message = "[usercreate] user already exist"
answer.AnswerJSON.Result = nil
answer.AnswerJSON.Status = false
} khác {
userinfo := UserInfo{Data:time.Now()}
session := Session{Data:time.Now()}
cook := Cook{}
//make support tables object
//userinfo object
userinfo.Password = password
userinfo.Username = username
//cook object
cook.SessionID = session.ID
cook.Cookie = d.cookgeneratenew("somesaltforcooksgenerate")
cook.Status = true
cook.Lastconnect = time.Now()
cook.CountConnect += 1
//user object
user.Email = email
user.Session = session
user.UserInfo = userinfo
user.Cook = cook
user.Role = int64(role)
//make request + //serizlizations to json answer
if err := d.DB.Create(user).Error; err != nil {
answer.AnswerJSON.ErrorAnswer.Message = err.Error()
answer.AnswerJSON.Status = false
} khác {
answer.AnswerJSON.Result = user
answer.AnswerJSON.Status = true
}
}
d.serilize(answer)
return answer
}
func (d *Database) UserDelete(userid int64) *Answer {
answer := d.initCall("UserDelete")
user := new(User)
//check exists
if userExists := d.DB.Find(user, "ID = ?", userid).Error; userExists == nil {
if userDelete := d.DB.Delete(user).Error; userDelete != nil {
answer.AnswerJSON.ErrorAnswer.Message = userExists.Error()
answer.AnswerJSON.Status = false
} khác {
answer.AnswerJSON.Status = true
answer.AnswerJSON.ErrorAnswer = nil
}
} khác {
answer.AnswerJSON.ErrorAnswer.Message = userExists.Error()
answer.AnswerJSON.Status = false
}
d.serilize(answer)
return answer
}
func (d *Database) UserRead(userid int64) *Answer {
answer := d.initCall("UserRead")
user := new(User)
if userExists := d.DB.Find(user, "ID = ?", userid).Error; userExists != nil {
answer.AnswerJSON.ErrorAnswer.Message = userExists.Error()
answer.AnswerJSON.Status = false
} khác {
if rel := d.DB.Model(user).Related(&user.Session).Error; rel != nil {
answer.AnswerJSON.Result = nil
answer.AnswerJSON.ErrorAnswer.Message = rel.Error()
answer.AnswerJSON.Status = false
} else if rel = d.DB.Model(user).Related(&user.UserInfo).Error; rel != nil {
answer.AnswerJSON.Result = nil
answer.AnswerJSON.ErrorAnswer.Message = rel.Error()
answer.AnswerJSON.Status = false
} else if rel = d.DB.Model(user).Related(&user.Cook).Error; rel != nil {
answer.AnswerJSON.Result = nil
answer.AnswerJSON.ErrorAnswer.Message = rel.Error()
answer.AnswerJSON.Status = false
} khác {
answer.AnswerJSON.Result = user
answer.AnswerJSON.ErrorAnswer = nil
answer.AnswerJSON.Status = true
}
}
d.serilize(answer)
return answer
}
func (d *Database) UserReadAll() *Answer {
answer := d.initCall("UserReadAll")
users := []User{}
if usersGet := d.DB.Find(&users).Error; usersGet != nil {
answer.AnswerJSON.ErrorAnswer.Message = usersGet.Error()
answer.AnswerJSON.Status = false
} khác {
đối với _, người dùng := phạm vi người dùng {
d.DB.Model(user).Related(&user.Session)
d.DB.Model(user).Related(&user.UserInfo)
d.DB.Model(user).Related(&user.Cook)
}
answer.AnswerJSON.Result = users
answer.AnswerJSON.ErrorAnswer = nil
answer.AnswerJSON.Status = true
}
d.serilize(answer)
return answer
}
func (d *Database) UserUpdate(userid int64, uu *UserUpdateStruct) *Answer {
answer := d.initCall("UserUpdate")
user := new(User)
if userExists := d.DB.Find(user, "ID = ?", userid).Error; userExists != nil {
answer.AnswerJSON.ErrorAnswer.Message = userExists.Error()
answer.AnswerJSON.Status = false
} khác {
//get relevating struct info
d.DB.Model(user).Related(&user.Session)
d.DB.Model(user).Related(&user.UserInfo)
d.DB.Model(user).Related(&user.Cook)
//update columns
if uu.Email != "" {
user.Email = uu.Email
}
if uu.Avatar > 0 {
user.UserInfo.Avatar = uu.Avatar
}
if uu.Birthday != "" {
user.UserInfo.Birthday = uu.Birthday
}
if uu.Location != "" {
user.UserInfo.Location = uu.Location
}
if uu.Male != "" {
user.UserInfo.Male = uu.Male
}
if uu.Password != "" {
user.UserInfo.Password = uu.Password
}
if uu.Role > 0 {
if roleErr := d.DB.Find(&Role{}).Error; roleErr != nil {
//role not found
fmt.Printf("[userupdate] role not found `%d`\n", uu.Role)
} khác {
user.Role = uu.Role
}
}
//update
if errUpdate := d.DB.Save(user).Error; errUpdate != nil {
answer.AnswerJSON.ErrorAnswer.Message = errUpdate.Error()
answer.AnswerJSON.Status = false
} khác {
answer.AnswerJSON.Result = user
answer.AnswerJSON.ErrorAnswer = nil
answer.AnswerJSON.Status = true
}
}
d.serilize(answer)
return answer
}
func (d *Database) UserPaginate(page, countPage int) *Answer {
answer := d.initCall("UserPaginate")
result := []*User{}
if errPag := d.DB.Limit(countPage).Offset((page * countPage) - countPage).Find(&result).Error; errPag != nil {
answer.AnswerJSON.ErrorAnswer.Message = errPag.Error()
answer.AnswerJSON.Status = false
} khác {
for _, user := range result {
d.DB.Model(&user).Related(&user.Session)
d.DB.Model(&user).Related(&user.UserInfo)
d.DB.Model(&user).Related(&user.Cook)
}
answer.AnswerJSON.Result = result
answer.AnswerJSON.ErrorAnswer = nil
answer.AnswerJSON.Status = true
}
d.serilize(answer)
return answer
}
//-------------------------------------------------------------------
// category
//--------------------------------------------------------------------
func (d *Database) CategoryCreate(name string) *Answer {
//variables
answer := d.initCall("CategoryCreate")
cat := new(Category)
//check exist user
if catExist := d.DB.Find(&Category{}, &Category{Name:name}).Error; catExist == nil {
answer.AnswerJSON.ErrorAnswer.Message = "[categorycreate] category already exist"
answer.AnswerJSON.Result = nil
answer.AnswerJSON.Status = false
} khác {
cat.Name = name
//make request + //serizlizations to json answer
if err := d.DB.Create(cat).Error; err != nil {
answer.AnswerJSON.ErrorAnswer.Message = err.Error()
answer.AnswerJSON.Status = false
} khác {
answer.AnswerJSON.Result = cat
answer.AnswerJSON.Status = true
}
}
d.serilize(answer)
return answer
}
func (d *Database) CategoryDelete(catid int64) *Answer {
answer := d.initCall("CategoryDelete")
cat := new(Category)
//check exists
if catExists := d.DB.Find(cat, "ID = ?", catid).Error; catExists == nil {
if catDelete := d.DB.Delete(cat).Error; catDelete != nil {
answer.AnswerJSON.ErrorAnswer.Message = catExists.Error()
answer.AnswerJSON.Status = false
} khác {
answer.AnswerJSON.Status = true
answer.AnswerJSON.ErrorAnswer = nil
}
} khác {
answer.AnswerJSON.ErrorAnswer.Message = catExists.Error()
answer.AnswerJSON.Status = false
}
d.serilize(answer)
return answer
}
func (d *Database) CategoryRead(catid int64) *Answer {
answer := d.initCall("CategoryRead")
cat := new(Category)
if catExists := d.DB.Find(cat, "ID = ?", catid).Error; catExists != nil {
answer.AnswerJSON.ErrorAnswer.Message = catExists.Error()
answer.AnswerJSON.Status = false
} khác {
if rel := d.DB.Model(cat).Related(&cat.Post).Error; rel != nil {
answer.AnswerJSON.Result = nil
answer.AnswerJSON.ErrorAnswer.Message = rel.Error()
answer.AnswerJSON.Status = false
} khác {
for x, p := range cat.Post {
d.DB.Model(&p).Related(&p.Comment)
d.DB.Model(&p).Related(&p.PostSeo)
cat.Post[x] = p
}
answer.AnswerJSON.Result = cat
answer.AnswerJSON.ErrorAnswer = nil
answer.AnswerJSON.Status = true
}
}
d.serilize(answer)
return answer
}
func (d *Database) CategoryReadAll() *Answer {
answer := d.initCall("CategoryReadAll")
cats := []Category{}
if catsGet := d.DB.Find(&cats).Error; catsGet != nil {
answer.AnswerJSON.ErrorAnswer.Message = catsGet.Error()
answer.AnswerJSON.Status = false
} khác {
//categorys
for _, cat := range cats {
d.DB.Model(cat).Related(&cat.Post)
//get relete POST
for x, p := range cat.Post {
d.DB.Model(&p).Related(&p.Comment)
d.DB.Model(&p).Related(&p.PostSeo)
cat.Post[x] = p
}
}
answer.AnswerJSON.Result = cats
answer.AnswerJSON.ErrorAnswer = nil
answer.AnswerJSON.Status = true
}
d.serilize(answer)
return answer
}
func (d *Database) CategoryUpdate(catid int64, name string) *Answer {
answer := d.initCall("CategoryUpdate")
cat := new(Category)
if catExists := d.DB.Find(cat, "ID = ?", catid).Error; catExists != nil {
answer.AnswerJSON.ErrorAnswer.Message = catExists.Error()
answer.AnswerJSON.Status = false
} khác {
//get relevating struct info
d.DB.Model(cat).Related(&cat.Post)
//update columns
if name != "" {
cat.Name = name
}
//update
if errUpdate := d.DB.Save(cat).Error; errUpdate != nil {
answer.AnswerJSON.ErrorAnswer.Message = errUpdate.Error()
answer.AnswerJSON.Status = false
} khác {
answer.AnswerJSON.Result = cat
answer.AnswerJSON.ErrorAnswer = nil
answer.AnswerJSON.Status = true
}
}
d.serilize(answer)
return answer
}
func (d *Database) CategoryPaginate(page, countPage int) *Answer {
answer := d.initCall("CategoryPaginate")
result := []*Category{}
if errPag := d.DB.Limit(countPage).Offset((page * countPage) - countPage).Find(&result).Error; errPag != nil {
answer.AnswerJSON.ErrorAnswer.Message = errPag.Error()
answer.AnswerJSON.Status = false
} khác {
for _, cat := range result {
d.DB.Model(&cat).Related(&cat.Post)
//get relete POST
for x, p := range cat.Post {
d.DB.Model(&p).Related(&p.Comment)
d.DB.Model(&p).Related(&p.PostSeo)
cat.Post[x] = p
}
}
answer.AnswerJSON.Result = result
answer.AnswerJSON.ErrorAnswer = nil
answer.AnswerJSON.Status = true
}
d.serilize(answer)
return answer
}
câu trả lời hay nhất
我可以看到您的代码中有很多冗余。几个月前我遇到了同样的问题并且得到了很好的答案。看这里:How to return dynamic type struct in Golang? .
基本上你会像这样拥有相同的三个功能(添加/编辑/删除/计数)(我不知道你用的是什么数据库我用的是NoSql Rethinkdb,但原理是一样的):
func (c Main) Get(modelname string) interface{} {
//your query here for getting stuff from model name and return interface
rows, err := rethink.Table(modelname).OrderBy(rethink.Asc("sortNo")).Run(c.DB)
nếu err != nil {
log.Println(lỗi)
trả về nil
}
if (modelType == "brand") {
var brands []*models.Brand
rows.All(&brands)
return brands
}
//rest of your models here or use some switch
})
我通常将所有与数据库相关的功能都放在一些助手中(这主要是因为测试)。
我认为这是一个很好的方向,因为这样您的代码很容易维护,您将只更改辅助函数,而不是去为每个模型执行添加/删除/更新的数百万个小说。
关于戈朗。重构 ||图案 ||任何解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38079036/
Có thủ thuật cụ thể nào của CoffeeScript để làm cho giao diện này trông gọn gàng hơn không: index = (-> if Segment == 'index' return
Tôi đang thử nghiệm các lĩnh vực khác nhau của C# và tái cấu trúc các phương pháp/mẫu tốt nhất. Có thể thấy, phương thức Validate bên dưới có 3 phương thức xác thực phụ. Có cách nào để thiết kế lại/cấu trúc lại phương thức này để loại bỏ câu lệnh if không? (Có thể sử dụng delegate(delega
Tôi đang tạo một trang Rails đơn giản sẽ lưu trữ một số ngày và thực hiện kiểm tra điều kiện cơ bản. Tôi đã viết một số phương pháp bên dưới và được cho biết rằng tôi có thể làm cho chúng hiệu quả hơn. Tôi cứ gãi đầu, không biết phải làm sao. Tôi có nên đặt entry.find trên toàn cầu không?
Có cách nào tốt hơn để viết chức năng này? Tôi đã kế thừa một số mã javascript và tôi muốn làm cho nó sạch hơn nếu có thể. Ngoài ra, tôi có thể thêm nhiều phần tử "chủ đề" hơn và không muốn sao chép và dán đi dán lại nhiều lần. hình ảnh chức năng
1. Xem hiển thị hiệu ứng trực tuyến 2. Trước khi bắt đầu, hãy giải thích mã nguồn tham chiếu để triển khai hiệu ứng: Tập hợp và phân tán logo Mã hiệu ứng ban đầu được triển khai dựa trên các thành phần lớp phản ứng jsx. Phụ thuộc cũ, mã dư thừa.
Tôi dường như đang thiếu đủ cà phê để cho phép tôi nhìn rõ những vấn đề sau. Giả sử tôi có một lớp có hai hàm tạo và nhiều trường. Hàm tạo là hàm tạo không tham số trong đó một trường phụ thuộc vào trường khác. Một hàm tạo khác được chèn vào một trong các trường của nó
đóng cửa. Câu hỏi này không tuân thủ các nguyên tắc của Stack Overflow. Hiện tại nó không chấp nhận câu trả lời. Câu hỏi này có vẻ lạc đề vì nó thiếu đủ thông tin để chẩn đoán vấn đề. Mô tả vấn đề của bạn chi tiết hơn hoặc bao gồm một phút
Tôi có một bảng liệt kê với một số trạng thái trong đó: enum State { A, B, C, D } và các đối tượng có trạng thái tương ứng: class MyObject { State st
Tôi có mã này trong build.xml của mình:
Trong Delphi XE, tôi thường sử dụng tính năng tái cấu trúc biến đổi tên (Ctrl+Shift+E) để làm cho mã của tôi dễ hiểu hơn bằng cách đặt tên biến có ý nghĩa hơn, như: Điều này ổn và tốt, nhưng khi tôi gặp phải một vấn đề nhỏ vấn đề với không gian làm việc khi sử dụng nó
Tôi đã triển khai logic để tính số lượng và chi phí còn lại thông qua biến dữ liệu. Nó lặp qua từng sản phẩm và tính toán số lượng còn lại bằng cách đếm số lượng ở trạng thái số lượng trả về và trừ đi số lượng sản phẩm. Có cách nào để cấu trúc lại mã này để làm cho nó trông sạch hơn và dễ hiểu/bảo trì hơn không? TÔI
Tôi đang học Haskell, vì vậy đây có lẽ là một điều rất tầm thường, nhưng tôi muốn có một số gợi ý về cách viết lại cái này và cách nó hoạt động. Tôi có mã làm việc sau (các gói được sử dụng: HTF , Parsec và Flow ): {-#
Tôi có đoạn mã sau: switch(equipmentAttachment.AttachmentPosition) { case 'AttachFront': { if(
Tôi đang cố gắng thay đổi mã của mình từ Ghi nhật ký tiện ích Java thành Log4J2. Để thay đổi mã, tôi muốn sử dụng tính năng tái cấu trúc mã trong Eclipse. Ví dụ thay đổi: import java.util.logging.Logger
Tôi có một hàm xử lý các hàng trong tệp Excel. Trong hàm này, tôi có một vòng lặp for. Bây giờ, sau khi trích xuất một hàng, chúng tôi sẽ kiểm tra các điều kiện khác nhau. Nếu bất kỳ điều kiện nào sai, chúng ta chuyển sang hàng tiếp theo. Có thể sử dụng các mẫu để làm cho mã này có cấu trúc hơn không?
Tôi đang tái cấu trúc một chương trình có nhiều lệnh gọi lồng nhau như ServiceManagerment.getGlobalizationService() .createExportCo
Tôi đã refactor nhiều trường trên JTabbedPane để giảm bớt sự dư thừa. Tuy nhiên, khi tôi đặt kích thước không đổi cho số lượng trường, tôi nhận được ngoại lệ con trỏ null. Tôi không chắc tại sao điều này lại xảy ra. Tôi đang làm gì sai và quan trọng hơn là ai đó có thể giải thích chuyện gì đang xảy ra không? Pu
Tôi đang cố gắng cấu trúc lại phương pháp sau bằng cách xóa các bản sao trong map.setOnPolygonClickListener và map.setOnMarkerClickListener. Tôi nghĩ cả hai người nghe đều làm điều tương tự
đóng cửa. Câu hỏi này cần được hỏi tập trung hơn. Câu trả lời không được chấp nhận vào thời điểm này. Bạn muốn cải thiện vấn đề này? Đã cập nhật câu hỏi để chỉ tập trung vào một vấn đề chỉnh sửa bài đăng này. Đã đóng 6 năm trước. Cải thiện truy vấn này
Khi tôi cấu trúc lại Bảng phân cảnh như trong liên kết này, tôi không thể tìm thấy nơi tôi có thể hoán đổi vị trí của các mục trên thanh tab. Ví dụ: tôi muốn thay đổi menu chính thành chỉ mục 0. Đây là bảng phân cảnh của tôi. Câu trả lời hay nhất Bạn có thể kéo và thả thẻ.
Tôi là một lập trình viên xuất sắc, rất giỏi!