ぺんぎんメモ

プログラミングのメモです。たまに私生活のことや鬱っぽいことを書きます。

2021年8月12日の日記

今はWebアプリケーションを開発している。
UIはデザイナさんが担当し、それを元にReactでフロントエンドを構築していく。
デザイナさんはそのシステムの利用者でもあるため、僕よりもずっとうまくUIを設計できる。

そこで気付いたことがある。
僕は、どうしてもプログラマ視点で考えてしまう。

たとえば「購入」といっても、「ポイントはいくら使ったか」や「どのクーポン券を使ったか」などの情報も含まれる。プログラマ視点だと、これらは別々のUIで操作するようにしたほうが楽だ。つまり、以下の3つの操作は別々のページとして用意する。

  1. 購入情報の入力と保存
  2. いくらのポイントを使ったかの情報の保存
  3. どのクーポンを使ったかの情報の保存

これであれば、各画面が一つのテーブルのみを操作するだけなのでトランザクションなどを考える必要がなくて楽だ。
しかしこれには問題があり、一度の注文に対して3つの画面を表示しなければならない。
操作を取り消す場合も同様で、3つの画面それぞれで削除処理を実行しなければならない。

使用者視点で考えると、これら3つの操作を1つの画面で行えたほうがずっと楽だ。
しかし、この方針でシステムを構築すると複雑になってしまう。

単純に3つの Rest API エンドポイントを作成して更新処理を3つに分けると、途中で失敗したときのロールバック処理も自分で実装しなければならなくなる。これは何としてでも避けたい。極力 RDBトランザクションの機能を活用したい。そこで一つだけエンドポイントを作成し、ここに3つの更新情報をまとめて送るようにする。そうすればトランザクションの機能をうまく利用できるが、それだとバックエンド側に重複したコードがたくさん現れることになる。しかしこれを解決するのは簡単で、単純に共通部分を関数として切り出せばいい。

複数テーブルを更新するが一つのトランザクションとして扱いたい場合は、それ専用のエンドポイントを作成する

これを心がけることで、複雑なフロントエンドにも対応できる。