🐷

オブジェクト指向

2023/10/31に公開

この記事を元に気になったことを調べた
Stage3:OOPの"4 Primary Principles"と"Paradigm Features"はStage2の部分に当たるClean Architectureを読んだ時に(読書メモはこちら)大体読んだところなので今回はStage3と4の部分で気になったところをみる

モデル駆動デザイン

ドメインモデル

  • モデルに処理を集約させると「モデルさえあれば、どこでも同じ処理ができる」という世界を作ることができる。
  • データ(Webアプリケーションで扱う概念)の "バリデーション", "状態判定", "状態変更", "デフォルト値設定" をするための実装をする場所
  • 例えばSlackを実装する場合、以下がモデルの候補となる。
    • ユーザー
    • メッセージ
    • スレッド
    • リアクション

アネミックモデル=ドメインモデル貧血症

anemic・・・貧血に関連するか、貧血に苦しむ様

一見本物のドメインモデルに見え、オブジェクト同士がしっかりとしたリレーションで結びついており、本物のドメインモデルと同じような構造を持っているが、オブジェクトにはわずかな振る舞いしかない。その代わり、すべてのドメインロジックを含むサービスオブジェクト群が存在している。このアンチパターンが根本的に怖いのは、オブジェクト指向設計の基本概念(データと処理を一緒にする)の真逆である。Eric Evans は、素晴らしい著書『Domain Driven Design』の中で、これらのレイヤについて次のようなことを言っています。アプリケーションレイヤ(サービスレイヤのこと):ソフトウェアが何をしなければいけないかを定義し、ドメインオブジェクトに対して、問題を解決するよう命令する。このレイヤは薄く保たれている

レイヤードアーキテクチャ

ドメイン言語

クラスを不変にする

クラスを不変にした方がいい理由:
→golangで関数よりメソッドで実装した方がいい理由?
https://stackoverflow.com/questions/69793276/what-advantage-we-get-using-method-than-a-regular-funtion-call

https://stackoverflow.com/questions/8263546/whats-the-difference-of-functions-and-methods-in-go

「メソッド」はOO言語から特定の型に関連するものとして採用されただけで、「関数」は関数が独立した手続き型言語から採用されたものなのだ。

デザイン原理

継承より合成

go言語はそもそも継承という仕組みはなく合成しかできない
https://medium.com/@lordmoma/composition-over-inheritance-in-go-918b189f1f1b

Discussion