msksgm’s blog

msksgm’s blog

Webエンジニアです。日々の勉強記録、技術書感想、美術観賞感想を投稿します。

「現場で役立つシステム設計の原則」感想,まとめ

「現場で役立つシステム設計の原則」[2017, 増田 享]を読みました.

まとめと感想について記述していきます.

概要・まとめ

全体感

なんで業務アプリケーションがうまく動かないのか,作成したオブジェクトが解決したい対象(ドメイン)を適切に設計できていないから.

わかりやすいソースコード,設計についてオブジェクト指向設計の特徴を生かしながら,具体的に説明してくれる本となっています.
ドメインオブジェクト」という単語が頻出し,ドメインと機能を関連付けをこないながら内容が進みつつ,ドメイン知識の重要性について教えてくれます.
また,筆者が参考にした書籍の紹介だけでなく,具体的な章も記述してくれています.

まとめ

CHAPTER 1 小さくまとめてわかりやすくする

オブジェクト指向は変更を楽で安全にする方法.
オブジェクトで値やコレクションなどの複雑さを閉じ込めると変更が楽で安全になる.

CHAPTER 2 場合分けのロジックを整理する

区部毎にコードを整理する手法

  • コードのかたまりは,メソッドとして抽出して独立させる
  • 関連するデータとロジックは,1つのクラスにまとめる
  • 早期リターンやガード節を使う

多態を使う

  • インターフェース宣言と,区部ごとに異なるクラスのオブジェクトを「同じ型」として扱うしくみ
  • 多態を使うと区分ごとに異なる判断・加工・計算のロジックを整理できる
  • 変更が楽で安全になる

列挙型を使う

  • 多態は,区分の一覧がわかりづらい
  • 区分は,クラスの一覧を明示的に記述できる

CHAPTER 3 業務ロジックをわかりやすく整理する

三層の関心事と業務ロジックの分離を徹底することで,同一のロジックの分散を防ぐ.

ドメインオブジェクト

  • 関連する業務データと業務ロジックを一つにまとめたオブジェクトのこと

ドメインモデル

  • 業務アプリケーションの対象領域(ドメイン)をオブジェクトのモデルとして整理したもの

三層 + ドメインモデル

  • プレゼンテーション層
    • UI など外部との入出力を受け持つ
  • アプリケーション層
    • 業務機能のマクロな手順の記述
  • データソース層
    • データベースとの入出力を受け持つ
  • ドメインモデル
    • 業務データと関連する業務ロジックを表現したドメインオブジェクトの集合
    • ドメインモデルは画面やデータベースの都合から独立させる
    • 業務的な判断/加工/計算のロジックをドメインモデルに任せることでしんぷるでわかりやすい構造になる

CHAPTER 4 ドメインモデルの考え方で設計する

ドメインモデルで設計する狙い

  • 業務的な判断・加工・計算のロジックを重複なく一元的に記述する
  • 業務の関心事とコードを直接対応させ,どこに何が書いてあるかわかりやすく整理する
  • 業務ルールの変更や追加のときに,変更の影響を狭い範囲に閉じ込める

ドメインモデルの設計が難しいパターン

  • オブジェクト指向プログラミングの経験が足りない場合
  • 要件定義や分析のやり方がわからないとき

利用者の関心事とプログラミング単位を一致させる

  • 分析
    • 人間のやりたいことを正しく理解する
  • 設計
    • 人間のやりたいことを動くソフトウェアとして実現する方法を考える

業務を学びながらドメインモデルを成長させていく

  • 業務の用語とうまく対応しないクラスは,業務の分析や理解が足りないことを示している.
  • 用語の意味やほかの用語との関係を確認しながら,より適切なクラスの候補を探す
  • ソースコードで業務の要求仕様を表現することをプログラムの自己文書化と呼ぶ

ドメインモデルを設計するための基本

  • 重要そうでない言葉を判断する
  • 言葉と言葉の関係性を見つける

CHAPTER 5 アプリケーション機能を組み立てる

ドメインオブジェクトを使って機能を実現する

アプリーケーション層は処理の流れの進行役であり,調整役

  • プレゼンテーション層からの依頼を受ける
  • 適切なドメインオブジェクトに判断・加工・計算を依頼する
  • プレゼンテーション層に結果(ドメインオブジェクト)を返す
  • データソース層に記録や通知の入出力を指示する

サービスクラスの設計では,次の方針を徹底する

  • 業務ロジック(判断・加工・計算など)は,サービスクラスに書かずにドメインオブジェクトに任せる
  • 画面の複雑さをそのままサービスクラスに持ち込まない,そのためにサービスクラスのメソッドを基本処理単位に分解する
  • データベースの入出力の都合からサービスクラスを独立させる.データベースのデータ操作を意識しないように分離し隠蔽する

CHAPTER 6 データベースの設計とドメインオブジェクト

データの整理に失敗しているデータベース

  • どこにどのようなデータが入っているか推測しにくい
  • データが入っていないカラムが多井
  • データが重複していて,どのデータが正しいのかわからない
  • 1つのカラムがさまざま目的に利用している
  • テーブル間の関係がはっきりしない

コトに注目するデータベース設計

  • 業務アプリケーションの中核の関心事は「コト」の管理
    • 現実に起きたコトの記録
    • 将来起きるコトの記録(約束の記録)

オブジェクトはオブジェクトらしく,テーブルはテーブルらしく

業務ロジックはオブジェクトで,事実の記録はテーブルで

  • ドメインオブジェクトの設計に,データベース設計の知識や都合を持ち込んではいけない.
    • ドメインオブジェクトは,業務の関心事を整理するための手段.
    • 業務で扱うデータを判断・加工・計算するための業務ロジックを記述する手段
  • 両者を適切に関連づけることが必要
  • ドメインオブジェクトはドメインオブジェクトで,テーブルはテーブルで別々に正しく設計する.
    • そのようにして両者の関係を,業務の関心事の表現として正しくマッピングすることが大切.

CHAPTER 7 画面とドメインオブジェクトの設計を連携させる

画面に引きずられた設計はソフトウェアの変更を大変にする

  • 表示のためのロジックと業務ロジックが混在してしまう
  • 複数の画面に同じコードが重複してしまう
    • 注文の登録時の確認画面
    • 注文一覧画面
    • 一覧から遷移する注文詳細画面
  • そのために関心事を分けて整理する
    • 画面そものが複雑
    • 画面の表示ロジックと業務ロジックが分離できない

CHAPTER 8 アプリケーション間の連携

使いにくい Web API

  • データを取得するために指定するパラメータが多い
  • 取得したデータの項目数が多い
  • 登録時に指定しなければいけないデータ項目が多い

使いやすい API

  • 小さな API にする
  • 小さなな API を組み合わせたり一部を変更することで多様なニーズに対応できる
  • マイクロサービスは,アプリケーションの運用環境をクラウド上にかんたんに構築できるようになったことから生まれた仕組み.

CHAPTER 9 オブジェクト指向開発プロセス

ドメインモデルを中心にしたソフトウェア開発の進め方は業務ロジックに焦点を当てて開発を進める

オブジェクト指向の変更容易性を実現する開発の2つの焦点

  • ドメインモデルに業務ロジックを集めて整理する活動
  • 要求の分析とソフトウェアの設計は同じ人間・チームが担当する体制

オブジェクト指向らしい開発の進め方

  • ドキュメントの位置付け
  • 開発マネジメントのやり方
    • 見積もりと契約
    • 進捗や品質の管理
    • 要員と体制

技術者以外との情報をとるためのドキュメント

  • 利用者向けのドキュメント
  • 画面や記帳
  • データベースのテーブル名・カラム名とコメント

オブジェクト指向の分析と設計

  • 分析工程と設計工程を分割しない
  • 分析と設計を同じ人間が担当する
  • 自己文書化
    • 分析設計の成果はコードで表現する
  • ソースコードを中心に進捗と品質をマネジメントする

CHAPTER 10 オブジェクト指向開発プロセス

オブジェクト指向をどうやって学ぶか

既存のコードを改善(リファクタリング)しながらオブジェクト指向設計を学ぶ

オブジェクト指向らしい設計を体で覚えることができる過激なコーディング規則(ThoughtWorks アンソロジーより)

  1. 1つのメソッドにつきインデントは1段階までにすること
  2. else 句を使用しないこと
  3. すべてのプリミティブ型と文字列型をラップすること
  4. 1 行につきドットは1つまでにすること
  5. 名前を省略しないこと
  6. すべてのエンティティを小さくすること
  7. 1つのクラスにつきインスタンス変数は2つまでにすること
  8. ファーストクラスコレクションを使用すること
  9. getter,setter,プロパティを使用しないこと

エンティティを小さく保つガイドライン(著者より)

対象 ガイドライン
メソッドの行数 1 行を目標にする 1行でもより
クラスの行数 50 行を目標にする 100 行以上は不可
パッケージのファイル数 10 ファイル以内

オブジェクト指向の考え方を理解する推薦図書

所感

なぜこの本を購入したのかというと,知人のエンジニアが口を揃えて,この本を称賛したからです.
知人の推薦通り,現場で役立つような内容となっており,設計について完全に初心者でも,具体的な説明で設計に何が必要なのかを理解できます.
内容が徐々にドメイン駆動設計に近づいていくので,「ドメイン駆動設計に興味があるけど,そもそも良い設計が何なのか知らない」みたいな人に特におすすめできる本だと思いました.

著者が Java の知見が深いのか,使用歴が長いのかわかりませんが,コードを用いた説明は Java ベースで書かれていました.
要所で Javaフレームワークについて述べているので,周辺知識を持っていると一層理解できると思います.
ただし,思考が Java に傾きすぎてしまうので,現在 Web アプリのバックエンドでよく使われる言語(Go,node.js,Kotlin など)で,書いてくれるともっとわかりやすいのにと思ってしまいました.(ただ一般的に,そのような書籍はあまり見当たらないので望みすぎかもしれません.) あと,個人開発の範疇だと,設計を意識しなくても,実装できたり,拡張や運用保守などもできてしまうので,ある程度の大規模開発や実務による苦労した経験が必要に感じました,

「リーダブルコード」,「オブジェクト指向でなぜつくるのか」,「ドメイン駆動設計」を足して3で割ったような内容となっており,具体的な説明からとてもわかりやすい良書だと思います.
「クリーンアーキテクチャ」や「ドメイン駆動設計」などにも興味を持てるようになったので読んでみたいと思います.

5月の振り返り

5 月が終わります.
2021 年の目標を元に今月の振り返りをしていきたいと思います.

生活習慣

早寝早起き生活を継続中
筋トレも継続中です.

プログラミング関連

個人開発

ちゃんとしたポートフォリオを作ったことがなかったので,つくります 今度は最初から AWS でデプロイできるように環境を作成しています.

フロントエンド

React の Hello World を EC2 にデプロイできるようになりました.

バックエンド

Spring を用いてバックエンドを作成していました.
DI の仕組みをしっかりと理解できたわけではないですが,WebAPI サーバーを作れるようになり,記事も作成しました. また,TypeScript で WebAPI サーバーを作成しています.
Java を触ったあとだと,DI の大切さがわかります.

インフラ

特に取り組めていませんが,「マスタリング TCP・IP」を読みました.

データベース

MySQL を触っています. 実行速度が早かったり,堅牢だったりするのは便利そうです.

ネットワーク

AWS について,一通り(EC2, VPC, RDS, IAM)について学びました.
6 月に再現性のある記事を作成したいです.

英語

TOEIC 勉強中です.
7 月に受けます.

趣味

読書

3冊達成

1冊目「コーディングを支える技術」

msksgm.hatenablog.com

2冊目「オブジェクト指向でなぜつくるのか」

msksgm.hatenablog.com

3冊目「ドメイン駆動設計 モデリング・実践ガイド」

msksgm.hatenablog.com

4冊目「ジョゼと虎と魚たち

msksgm.hatenablog.com

映画観賞

ジョゼと虎と魚たち」の実写映画版をみました.
社会的マイノリティへの世間の態度の描き方がリアリティがあって見てて辛かったです.
最後に逃げるように別れたという結末が,小説から予想される一つの結末として解釈されたというのも心にきました.

美術観賞

緊急事態宣言で行けませんでした...

絵を書く

忙しいので procreate でドローイングばかりしています.
とりあえず継続はできています

最後に

研修が忙しくて,それ以外の勉強があまりできていないです.
久々に時間ができると,今まで何をしてきたか忘れてしまっているので,一週間に一回振り返りをおこない記録をしていきたいと思います.

「ジョゼと虎と魚たち」(原作版)感想

ジョゼと虎と魚たち」[1997, 田辺聖子](原作版)を読みました.
まとめと感想について記述していきます.
ネタバレがあります.

まとめと感想

ジョゼと虎と魚たち

物語は,主人公の恒夫とジョゼが旅行をしている場面から始まります.
そのため,主人公の恒夫がジョゼとの出会いから一緒に暮らすようになるまでを回想するように話がすすんでいきます.
助けて以来,ジョゼのことを手伝うようになり,二人の仲が深まります.ある日,ジョゼの祖母が亡くなったことから,孤独になったジョゼは恒夫に思いを伝え二人は結ばれます.
一緒に暮らしながら,結婚はしていない二人の関係に対して,ジョゼは旅行先で「死んだんや」,いつか恒夫は離れるかもしれない.と思いながら終わります.

タイトルの「ジョゼ」は外界との接点である,小説の主人公からとり,「虎」はジョゼが最も恐れているもの,外界に対する恐れ,「魚」,「死んだんや」と語る,魚のような二人の関係について表しています. 物語は,旅行先で終わりますが,結婚していない二人の関係に対して,ジョゼは「恒夫が去っても」と思っていることから,ジョゼは別れることを予期しているのかもしれません.

障害者との恋愛をこの時代に描いたのは斬新だったと思いますし,今読んでも古臭さを感じさせません.
アニメ映画と実写映画は,それぞれ小説から切り取りたかった部分を切り取った内容になります.

他の作品について

短編集なので他に作品が 7 個ほどあります.
舞台はどこも関西(大阪?)のほうになっていて,登場人物は全員関西弁だった気がします.
これは作者の田辺聖子が大阪出身だからでしょう.
まだ見ぬ妹の旦那に空想を広げる姉や,10 歳離れた甥に一目惚れした女性,二重人格と言われたことに傷つきつつも,恋愛を通して受け止める女性,などと,様々な女性の観点で物語繰り広げられています.
どれも一筋縄ではいかない設定を持っており,現代にリブートしても,十分に面白そうだなと思いました.
ただ,あまりにも人間関係がわかりにくい始まり方だったり,感情の揺れに共感できなかったりしたので,そこらへんは物語によって選びようかもしれません,

「ジョゼと虎と魚たち」(2003年, 映画)感想

ジョゼと虎と魚たち」(2003 年)を観ました

配信サービスを利用してみました.今時は外に足を運ばなくてもみれるのでいいですね.

恒夫を妻夫木聡,ジョゼを池脇千鶴が演じています.

感想を述べていきたいとおもいます. ネタバレがあります

概要

物語は,主人公の恒夫がアルバイトの手伝いの途中で乳母車に乗っているジョゼを助けたところから始まります.
ジョゼは祖母のチズと世間の目を避けるように,暮らしていました.
助けて以来,ジョゼのことを気に掛けるになり,二人の仲が深まります.
ある日,ジョゼの祖母が亡くなったことから,孤独になったジョゼは恒夫に思いを伝え二人は結ばれます.
二人は,結婚同然のような暮らしをしますが,結婚はしていませんでした. ある日,実家の家族にジョゼを紹介しようとした恒夫ですが,わがまま(水族館がしまっていると憤慨する,車椅子に乗りたがらないなど)ばかりのジョゼに嫌気をさして,ついには道中で紹介するのをやめてしまいます. その数年後には,二人は別れ,恒夫は「ジョゼともう会うことはないだろう」と考えます.対してジョゼは一人でも外出できるようになり,強く生きていく場面で,物語は終わります.

感想

小説版の結末に対して,別れる選択をするだろうと考えて作られたのが実写映画版だと感じました. また,"恒夫はジョゼを哀れんで結ばれた"という指摘を大学の友人にいわれるシーンが,小説版でまったく触れられなかった恒夫の選択として描きます.
他にも,身障者に対する世間の目や,本人たちの立ち振る舞いなどがリアルに描かれ心にきます,
性的な弱者としても描かれている世界は,田辺聖子が描きたかったものの一つに感じていましたが,実写映画では,より浮き彫りにしていました,
どこまでもリアルな世界観は,なんとなく見るには重すぎるかもしれませんが,小説なリアルの結末として考えたり,田辺聖子の価値観を色濃く反映したと考えると,とても良い実写化だと思いました.

「ドメイン駆動設計 モデリング・実践ガイド」感想

ドメイン駆動設計 モデリング・実践ガイドを」[2021, 平澤 章]を読みました

検索しても,あまり具体的な例がでてこない,ドメイン駆動設計において,具体的な内容を用いて説明してくれます.
有名なアーキテクチャについても説明してくれるので,参考になります.
しかし,既存の設計方法について,ある程度の知識がないと読むのは厳しそうです(自分は厳しかった)
なので,次は「現場で役立つシステム設計の原則」を読みます