「現場で役立つシステム設計の原則」読書会レポート vol.7

株式会社リゾーム システム企画・開発部 第4グループの尾古(@patorash)です。

読書会の第7回目のレポートです。

前回のレポートはこちらです。

tech.rhizome-e.com

7回目レポート

それぞれの感想

画面にロジックを書いてしまうこと
  • 画面に表示するロジックと業務ロジックが混在してしまう
    • 1章で言われていた、ちょっとした条件分岐を追加したら複雑になってしまう件が頻発する
    • ビューにif文が入ると見辛くなる
      • 特に、slim*1で書いていると、閉じタグがないため、インデントが重要になるが、if文が入るとかなり見辛い
    • 複数画面にコードが重複してしまう
  • 表示のロジックと業務ロジックを分ける意味では、Railsでいえばビューヘルパーを使ったり、デコレーターを使っていくのがいいとは思う。ビューヘルパーのメソッドはオブジェクトをレシーバにできないのであまり好みではないけれど、契約による設計を重視した形にすれば、あまり散らからないのではないか?
論理的なビューと物理的なビュー
  • どこに画面用ロジックを集めるか問題
  • 論理的なビューに関してはドメインオブジェクトでいい、というのはわかるのだが、結局苦しんでいるところは物理的なビューだったりする。
  • Railsだとデコレーター層でやりがちだが、ビュー専用オブジェクトは極力作るべきではない
  • 画面に依存したドメインモデルもアンチパターン
  • class属性をドメインオブジェクトが持つべきという話
    • オブジェクトの状態によってclassを書き分けるif文がView上に出るたびに薄々感じていた
タスクベースのインターフェース
  • 関心事毎に画面を分割する発想はあまりなかった
  • ユーザーの入力負担軽減につながるので良さそう
  • 画面をタスクベースにできなくても、設計をタスクベースにしたり、画面の方も4原則を使って整えたらかなり見やすくなるのではないかと思う
  • 画面デザインの考え方をドメインオブジェクトのコードに当てはめるのは面白いと思った
  • 要件定義をする際に、お客様側は画面ありきで要件を考えるため、それがそのまま設計に繋がってしまうことがあった。
  • 今作っているサービスだとなんでも入力画面になっている。後で入力すればいいものまで、必須にする必要はないので、ドメインオブジェクトで整理していきたい。
  • 画面とオブジェクトを一致させることが、次第に画面に依存したオブジェクトを生み出すことに変わってしまいそうなのが一番懸念される
    • つまりレビュワーはこの点を特に注意深くレビューする必要がある
  • 画面もドメインオブジェクトで管理したいとなると、MVVMを使うようになってくるのは必然。しかし、この辺りをよくわかっていない人がやっているコードを見ると、「画面を値が連動していて便利」止まりになっている気がする。
利用者向けの情報もソフトウェアと整合させる
  • そうあるべきだが、これが難しい…
  • 開発者とプレスリリース/リリースノート/利用者ガイドを作成する人が異なるので…。
  • ドキュメント系のメンテナンスのためにはもうちょい開発者増やしたい。

意見交換

出た意見として、「全てのアンチパターンはモノに注目するが故に起きる。コトに注目することで細分化できたり解決するように見える」というのがありました。今まで読んできた中で、ドメインオブジェクトを作るにしても、テーブル設計をするにしても、コトに注目して整理することで、随分良くなるように感じています。

また、論理ビューと物理ビューをどうするべきか?について、時間をかけて話し合いました。最終的には、「物理ビューに依存したドメインオブジェクトにするべきではない」ということになりました。 最初は私は「論理ビュー用のロジックはドメインオブジェクトに持たせて、デコレーターには責務を割り切って物理ビューを担わせてしまえばいいのではないか?」という意見を展開していたのですが、ビュー専用オブジェクトになるし物理ビューと密結合になるのでよくないのでは?という意見もあり、考えを改めました。

Railsで論理ビューと物理ビューをどう管理するか?

読書会の後、ビューヘルパーに物理ビューを出力するメソッドを定義し、その引数に論理ビューを渡すという方式が一番しっくりくるのではないか?と考えました。

例えば、順番なしリストを作る場合は以下のような形になります。

まず、unordered_listヘルパーメソッドを定義します。

module ListHelper

  # ulタグのリストを表示する
  # @param [Array<String>] items リスト表示したい文字列の配列
  def unordered_list(items)
    render 'shared/ul' do
      render partial: 'shared/li', collection: items, as: :item
    end
  end

end

次に、上記のメソッドでレンダリングするViewを書いていきます。 views/shared/_ul.html.erbをこのようにします。

<ul>
<%= yield %>
</ul>

そして、views/shared/_li.html.erbをこのようにします。

<li><%= item %></li>

利用する場合は、例えば記事にタグがある場合はこのようにできます。

<h3>タグ一覧</h3>
<%= unorderd_list(@article.tags) %>

この形であれば、

  • ドメインオブジェクトは論理ビューに徹する
  • ヘルパーメソッドは論理ビューと物理ビューの繋ぎに徹する(ロジック含む)
  • 部分テンプレートは物理ビューに徹する(ロジック含まない)
  • 物理ビューにループ等のロジックを書かないで済む
  • 再利用性が高い
  • メソッドなのでIDEで補完が効く

と、良いこと尽しな気がしています。

まとめ

本章を通じて、普段から業務用ロジックと画面用ロジックのところで悩んでいたため、活発な議論ができたのではないかと思います。私自身もメンバーとの議論を通じて、考えを改めたほうがいいなと思えましたし、その中でより良い解決策を見出せたと感じています。

やはり本を読むだけでなく、意見交換を行える場があるほうがいいなと感じました。

「現場で役立つシステム設計の原則」読書会レポート vol.6

株式会社リゾーム システム企画・開発部 第1グループの小田です。

読書会の第6回目のレポートです。

前回のレポートはこちらです。

tech.rhizome-e.com

6回目レポート

今回は、第6章「データベースの設計とドメインオブジェクト」で参加者は5名でした。

それぞれの感想・意見交換

制約について
  • NOT NULL制約、一意性制約、外部キー制約を徹底すると自然と正規化が進む。
    • 適切なDB設計をするための指標としてわかりやすい
  • ここに書いてあるNOT NULL制約、ユニーク制約、外部キー制約などは基本的なものなので、出来る限り使う。データベース側の機能のチェック制約やenumなどを使うと、更にデータを守ることができる。
  • 原則としてNULLを許容しない。
    • もしNULL値がどうしても必要なカラムを見つけたら別のテーブルに分ける。
  • NOT NULL制約を使っていないカラムだとプログラム側でnullが来ることを考慮しなければならない。
  • 以前の勉強会で「データベースには事実を記録する。事実にはNULLなどない。基本的にNOT NULL制約を付けなければならない。」と言われて納得した。それ以降はNOT NULL制約を必ず付けるようにしている。レビューのときにも「NOT NULL制約を付けろおじさん」になっている。
  • (NOT NULL制約、普段はほとんど使ってない...)
コトに注目するデータベース設計
  • コトを記録するという発想がないと、モノに関連するもので一緒くたに詰め込んでしまおうと考えてしまいがち。
  • コトに注目するデータベース設計は楽々ERDレッスンでも言われていた。
    • 導出項目の排除につながる。
    • 導出項目はSQLのビューで状態を表現する。
  • 記録のタイミングが異なるデータはテーブルを分ける、というところ。マジでそれ!と思った。今の仕様がそうなっていなくてかなり辛い。
  • カラムを追加するのではなくテーブルを追加する。
    • そのカラムには過去データが存在しないので、NULLを許容するか偽データを登録するかの二択になるから、別テーブルに分けたほうが良い。
    • 確かに副作用がないけれど、テーブルが増えるしJOINが大変になりそうな気もする…。プログラムへの影響は少ないし、事実を記録する観点だとそっちのほうがいいのかな。
    • JOINが増えると性能面が不安
      • コト(口座への入出金データなど)を記録するテーブルとは別に、集計結果(口座残高など)を格納しておくテーブルを用意してあらかじめ集計しておくと良いらしい。
  • コトの記録の変更を禁止する(updateではなく、取り消しデータをinsert→修正後の新データをinsert)
    • 記録をupdateするのはupdate前の記録を削除することと同じ。updateせず「記録を修正した」というコトを記録する。
    • なるほどと思った。取り消しを記録する。元データ、取り消しデータ、新データ。INSERTだけで実現可能。
参照をわかりやすくする工夫
  • 状態の参照。コトの記録を徹底すれば、状態の算出は可能。動的に出力するのはパフォーマンス的に辛い場合もあるので、この辺りはRailsだとカウンターキャッシュを使ったり、DBのマテビューを使ったりしている。
  • 残高更新は同時でなくてもいい、一か所でなくてもいいという考え方は、柔軟性が生まれる。事実はDBに保存し、状態はKVSに持たせるようにすると良さそう。状態の参照は頻繁に行われると想定すると、KVSのほうが向いている。
  • モノの記録を行うからそこに状態を持つ必要が出てくるのであって、コトの記録に徹底するからこそ状態の更新をコトの記録と分離することが可能になるのだろうか
オブジェクトの設計とテーブルの設計
  • コトを記録するテーブルとドメインオブジェクトがほぼ1対1に対応することがある。しかし、似て非なるものという意識を持っておくべき。ドメインオブジェクトとデータベースのアクセスは、基本的に疎結合にしておいたほうがいい。そうでないと、互いに引っ張られ過ぎる。ドメインオブジェクトには業務ロジックを、データベースには事実の記録を。関心事が異なる。しかしそうなるとやはりRailsだと難しい。RailsActiveRecordドメインオブジェクトでもあり、データベースへのアクセス手段でもあるからだ。

まとめ

本章を通じて、コトに注目したデータベース設計を行うことで柔軟性が生まれ、データの管理やプログラムの修正が容易になることを理解することができました。 本章で書かれている内容と自身のプロダクトのデータベース設計を見比べ、どの辺りに改善の余地があるかを参加者全員が意識することができたと思います。

私は「原則として全てのカラムでNULLを許容しない」「カラム追加時は既存テーブルに追加するのではなく、新規テーブルを作成する」といった内容は想像したこともなかったのですが、そのように設計されたデータベースはデータの整合性や信頼性が高まり、定義の変更時にプログラムへの影響を最小限に抑えられることを理解できました。

また、読書会の中で「楽々ERDレッスン」という書籍を紹介頂きました。本章の内容についてはもう少し深掘りしてみたいと思ってるので、そちらも今後読んでみようと思います。

「現場で役立つシステム設計の原則」読書会レポート vol.5

株式会社リゾーム システム企画・開発部 第3グループの鳥井です。

読書会の第5回目のレポートです。

前回のレポートは、こちらです。

tech.rhizome-e.com

5回目レポート

今回は、第5章「アプリケーション機能を組み立てる」で参加者は5名でした。

それぞれの感想・意見交換

三層+ドメインモデル

  • 三層とRailsにおける処理の対応関係は以下のように捉えることができそう
    • プレゼンテーション層
      • ルーティングとコントローラーの不正パラメーターのフィルタリング
    • アプリケーション層
      • コントローラーの各アクションでの処理やサービスクラス、モデル
    • データソース層
      • モデル
  • 複数のモデルにまたがるような複雑なビジネスロジックをサービスクラスにするものだと考えていたが、そうでないことに気付かされた

シナリオクラス

  • サービスクラスを組み合わせたシナリオクラスを作ることで、業務の視点で必要とする機能単位を表現できる
  • 小さいサービスクラスをサービスクラスでまとめるという発想はなかった

メソッド

  • メソッドの処理が複雑になってきたら小さいメソッドに分けることでシンプルにできる
    • 小さく分ける基本の形として登録系と参照系で分けるのはわかりやすい

DB操作と業務ロジック

  • CRUD指向のフレームワークではDB操作と業務ロジックが混在しがちになる
    • 業務の関心事をDB操作に置き換えてコードを書くことによってプログラムから業務の意図が見えづらくなる
  • Railsでは分離しづらそう
  • メソッドにして対応する?

防御的プログラミングと契約による設計

  • 防御的プログラミングではメソッドを呼び出す側が何をしてくるかわからないという前提であらゆる防御的なロジックを書くため、コードが複雑になる。それによりテストも増える。
  • 契約による設計ではメソッドを呼び出す側と呼び出される側で約束事を決めることでコードをシンプルに保てる
  • 実際に業務の中で契約による設計を意識し、メソッドを呼び出す側に責任をもたせて、渡す引数の型情報などをyardで書くようにしている

まとめ

本書で説明されている三層+ドメインモデルの構造や用語をRailsに置き換えて読み進める際、用語の定義の違いに混乱することがありましたが、両者を比較することで新しい設計パターンを知ることができたと思います。それぞれのメリットとデメリットを踏まえて最適な設計を模索し、業務に取り入れていければと思います。

また、読書会全体を通して経験のあるエンジニアの会話の内容を聞いているだけでも勉強になると感じます。

特にリモートワークでは個人で作業する時間が多くなりがちです。その中で、読書会はエンジニア同士の会話の中から新しい知見を得られる貴重な場となるため、今後も継続して参加していきたいと思います。

「現場で役立つシステム設計の原則」読書会レポート vol.4

株式会社リゾーム システム企画・開発部 第3グループの渡辺です。

今回は、読書会の第4回目のレポートになります。

前回のレポートは、こちらです。

tech.rhizome-e.com

第4回目レポート

今回は、第4章「ドメインモデルの考え方で設計する」を読み進めました。

それぞれの感想・意見交換

ドメインモデルについて
  • ドメインモデルで設計することで、業務の流れや用語がプログラムにそのまま反映され、プログラム自体が業務の説明書になる。
    • 抽象度を高めることが汎用的なプログラミングには大事だが、それとは対照的。
  • ロジックを変更する際、変更による影響範囲が把握できないので、検索して洗い出した箇所を1つ1つ見ていくこともある。そういった事態が発生しにくいドメインモデルでの設計は非常に魅力的に見えた。
ドメインオブジェクトの見つけ方・作り方
  • 「関心事」の粒度を正しく理解しないと正しいドメインモデルを作れない。
    • 関心事をヒト/コト/モノで分類するのはわかりやすかった。
  • パッケージ図や業務フロー図を活用し、全体の俯瞰・各部分に着目を行ったり来たりする必要があるようだ。

業務への理解を深めることについて

  • 業務の用語を正しく理解して、それをクラスやメソッドに落とし込む必要がある。
    • そのためには要望の聞き取りから仕様の決定まで、開発者が関わる必要があるが、なかなか難しい。
  • その業務分野について興味をもって学ぶというのが大事。プログラムだけ上手くなろうとしても片手落ちで、我々は業務知識を学ばなければならない。

まとめ

第4章では、ドメインモデルでの設計について理解を深めて行きました。私の頭の中では、今までの手続き型での設計に慣れ親しんでいるため、なかなか理解が追いつかない箇所もありましたが、具体的な例や実際の業務に当てはめることで、ドメインモデルのメリット等を知ることができました。

ドメインモデルでの設計に限った話ではありませんが、自身が携わる業界知識について深く知っていくことは重要です。関係部署を巻き込んだ勉強会も実施していきたいと思います。

「現場で役立つシステム設計の原則」読書会レポート vol.3

株式会社リゾーム システム企画・開発部 第4グループの平松です。
今回は、読書会の第3回目のレポートになります。
前回のレポートは、こちらになります。

tech.rhizome-e.com

3回目レポート

今回は、第3章「業務ロジックをわかりやすく整理する」で参加者は4名でした。

それぞれの感想・意見交換

データクラスと機能クラス

  • Railsだとコントローラーとモデルの関係
  • コントローラーのアクションに処理をまとめるのは悪手
  • モデルにデータとロジックをまとめておけばコードの重複をなくせるし、テストもできる
    • モデルにデータとロジックを寄せているが、現状、値オブジェクトを使っていないため、半分正解の状態
  • モデルが肥大化したら、値オブジェクトを導入する良いタイミングでは?

ロジックとメソッド

パッケージ化

  • パッケージ化とは?
    • Rubyで言うとmoduleの名前空間で区切ることになるかも
    • コードが冗長になるため、やりすぎには気を付けたい

通化

  • 汎用クラスを使ったとしてもクラス数が多くなると探す手間もかかる
  • 同じような処理が多くできてしまい、使い分けができなくなる
    • RailsだとViewのヘルパーメソッドが汎用的なクラスと似てる

三層アーキテクチャドメインモデル

  • Railsだとデータソース層とドメインモデルが一体化したのがモデルになってる
    • そのおかげで、高速に開発できるが反面、複数のドメインモデルを使ってデータソースに保存する際、どこのモデルにロジックを書くべきか困る。
    • そして、どこかのモデルに書いた場合は、そのモデル同士が密結合になってしまう。
    • Railsの良いところと悪いところが同時に見えて面白い。

まとめ

本のサンプルコードはJavaRubyに置き換えることが難しい部分もありましたが、データクラスと機能クラス、メソッドの使い方など共通して言えることも多くありました。 データとロジック、ロジックとメソッドの関係からオブジェクト指向らしいクラス設計を知ることができたのではないかと思います。

次回は、第4章「ドメインモデルの考え方で設計する」になります。設計は開発の土台となる部分です。ここをしっかりと理解し、弊社のプロジェクトの改善に取り組んでいきたいと思います。

「現場で役立つシステム設計の原則」読書会レポート vol.2

株式会社リゾーム システム企画・開発部 第3グループの廣江(@buta_botti)です。

読書会の第2回目のレポートです。

第1回目のレポートは、こちらになります。 tech.rhizome-e.com

読書会の題材

前回に引き続き現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法を題材としています。

2回目レポート

今回は、第2章の「変更を楽で安全にするオブジェクト指向の実践技法」で、参加者は6名でした。

それぞれの感想 + 意見交換

  • if文がネストしてる箇所があるので、そこは短文にするとわかりやすくなりそう
  • 大きすぎるメソッドや不必要なネストがダメというのは、RubyだとRuboCopが指摘してくれるので意識できている
  • インターフェースってなんだ?(Rubyist)
    • Rubyだとインターフェースってないよな
    • Rubyだと継承や移譲を使ってインターフェース相当の表現をしてくのかな
      • メソッド定義がないとクラス定義でエラーになるような機能が標準でRubyにはない
      • 代わりにNotImplementedErrorをraiseするっていうのが筋がいいのかな
  • 状態遷移で列挙型が使えるというのは、なるほどなと思った
    • 列挙型使ってる?
      • C#で書かれてる自社製品ではほとんどみない
      • TypeScriptで書かれてる自社製品では使ってる
      • Rubyで列挙型というとActiveRecordenumのイメージが強い
    • 状態遷移はフラグ管理しているので、これを列挙型で管理するように直せばわかりやすくなりそう
  • リファクタリングは後回しにされがち、モチベーションの維持が難しい

個人的見解

区分オブジェクト

区分や種別で動作が変わるとき、それをif文やswitch文で書くと複雑になる。これはリファクタリングをする際にもよく聞く話で、ダックタイピングの手法を取ることで解決する。メリットとしてはそれぞれの処理が条件分岐で書かれなくなるため、コードが単純化すること。加えて、区分や種別ごとの処理がそれぞれのオブジェクトに定義されてあるため、処理の責任が明確に分かれているのもメリットだろう。

本書ではJavaのインターフェースを用いて説明されているため、静的型付けの言語としてこの手法を説明している。動的型付け言語にはダックタイピングをすることによるデメリットが存在するが、本書ではこの問題は無視されていると感じる。

個人的には動的型付き言語で闇雲にダックタイピングを使っていくのは少し危険だと感じており、動的型付け言語でダックタイピングの手法を取るのであれば、レシーバにくるオブジェクトを限定させる工夫が必要であると考えている。本書ではJavaの列挙型を用いて、クラスの一覧を記述することでさらに簡単になると説明しているが、これ相当のことが動的型付け言語においては必須レベルだろう。

状態遷移を列挙型で管理する

興味深かったのはこの状態遷移を列挙型で管理するという話だ。今関わっているアプリケーションでは状態遷移をもっぱらフラグで管理している。最近ではActiveRecordenumを使ったりしているが、それはどちらかというとデータベースの列挙型のことであり、ここのでの列挙型というのはそういったものではない。

例えば、現在の状態だけを持っていても、その状態の遷移に関わるルールは複雑なコードになっている場合がある。ここでの「列挙型で管理」というのはこの「状態遷移のルール」を列挙型で管理するというものである。つまり、遷移元の状態から遷移可能な状態を列挙型で所持している。

Rubyでは明確な列挙型は存在しないが、その手法は真似できると思っていて、例えばHashを使って遷移元のキーと遷移可能先の値を持つことができる。レコードのカラムから現在の状態を取得し、ハッキュのキーから現在の状態で遷移可能な状態を取得し、イベントに従って状態を遷移させる。この時、発生し得るイベントの一覧は値にもつ遷移可能な状態から推測することができ、そのイベントが正当なものかどうかは、遷移先の状態が値に含まれているかどうかで判別できる。

状態遷移図の代わりにもなり、コードを読む際の負担も減ると思うので、是非とも取り入れていきたい手法だと感じた。

まとめ

読書会を通して得た知見を、自分たちのプロジェクトに具体的に当てはめて考えたり、Rubyでは存在しないインターフェースという概念を知るきっかけにもなり、言語の垣根を超えた有意義な意見交換ができました。また、問題点は認識しつつも、実際にそれの改善に着手するのにはやや及び腰である点が浮き彫りになり、今後の課題が出てきました。

読書会はベテランがさらに知識を深めるのはもちろんですが、経験の浅い人が本の内容に沿うことで、わからないことを質問しやすくしている*1なとも思うので、とても有意義な時間だと感じています。今後参加者が増えたり、今の本を読み終えても継続的に読書会を続けていけるといいなと思います。

*1:わからないことがわかるので質問が明確になる

「現場で役立つシステム設計の原則」読書会レポート vol.1

株式会社リゾーム システム企画・開発部 第4グループの尾古(@patorash)です。

先週から、社内の有志で新たに読書会を始めましたので、それをレポートしていきたいと思います。

読書会の題材

読書会の題材として選んだのは、現場で役立つシステム設計の原則 〜変更を楽で安全にするオブジェクト指向の実践技法です。

こちらを選んだ理由ですが、読書会は今までも何度かやっていますが、その都度、具体的な技術の本、開発手法の本を交互に採用しています。その中で、今後の直近の開発で役立ち、且つ、技術者として長期的な視点で使える視座を与えてくれるのではないかということで、この本の採用を決めました。

読書会の進め方

開催頻度ですが、週に1回、1時間程度としています。読書会の進め方ですが、

  1. 当日までに事前に章を読んでおく
  2. 感想や疑問点をまとめる
  3. 読書会当日、感想をそれぞれ発表する
  4. 意見交換を行う
  5. まとめをYammerにアウトプットする

としました。YammerMicrosoftがOffice365で提供している社内SNSです。

これまでは交代しながら音読していくスタイルの読書会を行っていたのですが、読むこと・進めることに集中しがちで、本来やりたかった読書後の議論が疎かになっていると感じていたため、今回からやり方を変えることにしました。

1回目レポート

1章ずつ進めていくことにしましたので、初回は第1章の「小さくまとめてわかりやすくする」でした。参加者は6名の予定でしたが、業務の都合で不参加になった方もいて、4名で開催しました。

それぞれの感想

まず、それぞれの読書の感想をまとめます。

  • 変数を使い回していたことがあったので、気をつけていきたい。
  • 新しく型(クラス)を作って値の制限をしているところがRailsのモデルでバリデーションしているところと似ていると思った。
  • 重複したコードをなくすのはいいけれど、たまたま同じようなコードがあるのを無理やり共通化するのはよくないとプリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則に書いてあったのを思い出した。*1
  • 読みやすいコードの話などをまだあまり知らなかったのでよかった。定期的に読み返したい。
  • 変更が大変なプログラムのアンチパターンについて書いてあって、担当プロジェクトでもよく見かけるケースがあった。
  • Railsだとクラスを増やしにくい印象がある。わかっていてもこのように進めにくいのでは?Railsは大きなプロジェクトを作るのに適していないなと感じた。
  • 弊社ではメソッドへの切り出し、クラスへの切り出しは既によくやっている手法である。切り出すと、テスト可能になる。
  • バリューオブジェクトの定義がドメイン駆動設計の根幹になりそう。
  • Rubyでも3.0以降はRBSで型の恩恵が受けられるので、バリューオブジェクトを充実させるのはよさそう。

意見交換

感想を聞いた後、本を見返しながら、意見交換を行いました。

  • Railsでもcomposed_ofを使って値オブジェクトとカラムのマッピングできるとパーフェクトRuby on Railsに書いてあった。*2
  • 無理やり共通化しているコードを担当プロジェクトで見たことがあった。変数の初期化がブロックの外で行われていたため、わかりにくかった。
  • before_actionで変数の初期化をする件について
    • シンプルなsetくらいであれば許容できる。
    • アクション毎にメソッドを呼んで変数の初期化をちゃんと行っていることを確認したい。そうでないと、いちいちbefore_actionで初期化されているかどうかを確認しなければならなくて面倒。
    • before_actionでやるのは認証・認可などだけにしてほしい。
    • 他のbefore_actionが、更に他のbefore_actionでの変数初期化に依存しているケースがあった。
  • 値オブジェクトはRailsならばどこに置くべきか?
    • app/domains/がいいのではないか?
      • app/以下は自動的に読み込まれるため。
  • プログラミング初心者は逆に値オブジェクトを煩わしく感じそう。
  • 業務アプリケーションでよく使う値オブジェクトの表を見ながら…
    • こういうのはよく使うから、プロジェクト毎に作らずに共通化できたらよさそう。
    • よく姓名を扱うのだが、PersonNameクラスを作りたいと思った。
    • 会社用のライブラリ置場を作りたい。そこに値オブジェクトを定義したgemを登録していくと工数削減できそう。
      • GitHub Packagesが使えそうか検討してみよう。*3

まとめ

値オブジェクトから変数の初期化をどこで行うべきか等、幅広く意見交換することができて有意義な会になったと感じました。その反面、経験の浅いメンバーからの意見や疑問点をなかなか引き出せなかったなというところが反省点です。

次回からは、感想を事前に書いてもらって、意見交換の時間を十分に取るようにする等、改善していきたいと思います。

*1:以前に読書会を行った題材です

*2:11章 複雑なドメインを表現するより。 https://gihyo.jp/book/2020/978-4-297-11462-6

*3:https://github.com/features/packages