dandk105 / webapp_study

web app の作成を通して、gitの使い方や、ユニットテストについてQAの人が勉強するためのリポジトリです
https://dandk105.github.io/webapp_study/
MIT License
0 stars 0 forks source link

handler内の処理を分解し、それぞれのメソッド毎に行う処理について細分化する #24

Open dandk105 opened 11 months ago

dandk105 commented 11 months ago

handler内の処理が現在複雑になっていてそれぞれのメソッド毎に行う処理をこのまま追加していくと 処理が長く過ぎて読みにくい関数になってしまう そのため、handler内部の処理を分解して、それぞれのメソッド毎に必要な処理について記載をする必要がある

厚くなっている処理の例

func getUserDataHandler(w http.ResponseWriter, r *http.Request, db *sql.DB) {
    // GETメソッドを受け入れる
    if r.Method != http.MethodGet {
        http.Error(w, "Only GET method is supported", http.StatusMethodNotAllowed)
        return
    }

    name := r.URL.Query().Get("name")
    // "name"が空の時はデフォルトのユーザー情報を返す所謂疎通確認用の処理
    // switch文で書いた方が良さそう
    if name == "" {
        var user User
        user.Name = "World"
        user.Birthday = time.Now()
        user.ID = "1"
        jsonresponse, err := json.Marshal(user)
        if err != nil {
            log.Print(err)
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
        w.Write(jsonresponse)
    } else {
        // データベースからデータを取得する
        // TODO: URLのクエリーによって取得するデータを変えるようにする
        // 現在はUSERSテーブルの全てのデータを取得しているからよろしくない
        rows, err := db.Query("SELECT * FROM USERS WHERE NAME = $1", name)
        if err != nil {
            log.Print(err)
        }
        defer rows.Close()

        var user User
        for rows.Next() {
            if err := rows.Scan(&user.ID, &user.Name, &user.Birthday); err != nil {
                log.Print(err)
            }
        }

        if err := rows.Err(); err != nil {
            log.Print(err)
        }

        jsonresponse, err := json.Marshal(user)
        if err != nil {
            log.Print(err)
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
        log.Printf("%s request: %s from %s", r.Method, r.RequestURI, r.RemoteAddr)
        // レスポンスを返す
        w.Write(jsonresponse)
    }
}