Go基礎學習記錄 - 編寫Web應用程式 - 部落格編輯功能之Model重構
每次我都會將自己實踐的程式碼放到github上並且都會打一個tag,方便後面用的同學使用,這裡我以下面分支的程式碼進行實踐分享
https://github.com/durban89/typescript_demo.git tag: 1.1.3
針對於前面的幾篇分享,覺的還是要勇於創新,發現更好的,更利於自己的,更能提高寫程式碼效率的方式。於是將model這塊的邏輯進行了重構
之前的文章【ofollow,noindex" target="_blank">Go基礎學習記錄 - 編寫Web應用程式 - 部落格編輯功能之Model的重新思考 】也算是實現了一部分功能,小區域的是沒有問題,比如只是針對Blog這一個model是沒有問題的,但是如果在建立一個是不是要重新再寫一遍Create、Update、Delete等方式。
這個是很不方便的,在瞭解了建立一篇文章的時候大概就是需要新增、更新、刪除、查詢等功能的時候,其實應該寫一個比較通用程式碼,具體需要更換的大概就是
資料要儲存到哪張表,需要哪些欄位,而且這些欄位又都是變化的,不應該寫死,而是由初始化的時候或者呼叫的時候來具體操作,這個就是目前設計模式中經常提到的,我不說大家也都知道,嘿嘿,我就不說,自己百度去。
有點類似於工廠模式
第一步、重新定義Model具體結構如下
// ModelMethod 介面 type ModelMethod interface { Query(offset int64, limit int64) (map[string]string, error) Create() (int64, error) Delete() (int64, error) Update() (int64, error) QueryOne(int64) (map[string]string, error) } // ModelProperty 屬性 type ModelProperty struct { TableName string } // WhereCondition where條件 type WhereCondition struct { Operator string Valuestring } // WhereValues where條件值 type WhereValues map[string]WhereCondition // UpdateValues update條件值 type UpdateValues map[string]string // InsertValues Insert值 type InsertValues map[string]string // SelectValues select條件值 type SelectValues []string
目前做了一個簡單規劃,表名要有,查詢的where條件能夠支援比較稍微複雜的查詢,同時update和select的欄位也都做了具體的定義。下面看下QueryOne和Update功能
第二步、重新定義Model函式這裡暫時主要是定義了Update的函式,其餘幾個也加了暫時未做測試,這裡只拿實踐過的進行分享
// Update 更新 func (p *ModelProperty) Update(update UpdateValues, where WhereValues) (int64, error) { var updateString = update.MergeUpdate() var whereString = where.MergeWhere() sql := fmt.Sprintf("UPDATE %s SET %s WHERE %s", tableName, updateString, whereString) // 這裡的tableName是有呼叫者設定的,也就是我們一般說的繼承者設定的 stmt, err := Conn.Prepare(sql) if err != nil { return 0, err } res, err := stmt.Exec() if err != nil { return 0, err } affect, err := res.RowsAffected() if err != nil { return 0, err } return affect, nil }
Tips這裡的tableName是有呼叫者設定的,也就是我們一般說的繼承者設定的
第三步、控制器呼叫修改
修改ArticleEdit函式
將更新部分
blogModel := &models.Blog{} _, err := blogModel.Update(update, where)
替換為
var blogInstance models.BlogModel _, err := blogInstance.Update(update, where)
重新編譯後執行功能正常
專案更新地址
https://github.com/durban89/typescript_demo.git tag: 1.1.4