SlideShare una empresa de Scribd logo
1 de 52
Descargar para leer sin conexión
2021/12/18 株式会社ユーザベース 矢野勉
プログラミング言語とシステムデザイン
Clojure, J
a
v
a
, デザインパターン, DDD, Cle
a
n Architecture
提供
株式会社ユーザベース
誰?
• 名前: 矢野勉


• @t_yano


• https://boxofpapers.hatenablog.com/


• 株式会社ユーザベース・技術部門のフェローをやってます


(フェローというのはユーザベースの正式な役職名で、別に名誉職ではないです。仕
事してます)


• プログラミング言語Clojureのコントリビュータ


コンパイラにパッチ送ったりしてます(なかなかマージされない…)
モデリング議論楽しいですよね
けっこう白熱しますよね
これはこういうクラスに分割しよう
これはドメインかな、ドメインサービスかな
なんのためのクラス分け?
夢中になると、なんのために
クラス分けしようとしてるの
か、思考が止まってしまう
デザパタ地獄
なんでもかんでも、なんらかのデザインパターンを適用しようとする麻疹
AbstractFactoryパターンがあるからnewは禁止ですか?
シンプルな委譲で済むことに、ChainOfResponsibilityパターン必要ですか?
なんでも過剰になっていく
XML-RPC →もっと機能増やすぜ → SOAP
XML最高 → EJB2
REST最高!→ RESTful+HATEOAS
設計にはトレードオフがつきもの


やりたいことに対して複雑さが高過ぎては意味がない
トレードオフ
パターンは言語によっては消滅してしまう
デザインパターンはトレードオフで選択するもの
Visitorオブジェクトを定義することで、階層状のノードを潜りながら、ノード
に対する操作を実行していくデザインパターン
Visitorパターン
• Visitorはクロージャ関数として書けるし、ノードを潜る操作は再帰処理として書けま
す。
クロージャ関数があって、再帰処理をサポートしている言語で、
このパターン必要ですか?
デザインパターンには、適用条件があって、その条
件がなくなってしまったら、パターンごと必要なく
なる
条件が変わったら消えてしまうものがある。
でも条件が変わっても消えないものもある。
設計理論
その消えないものの一つが
で


それを適用したものが
アーキテクチャ
なんじゃないかと思います
DDDとCleanArchitecture
Clojureというプログラミング言語を肴に、


DDDやCleanArchitectureがどう見えてくるのかって話をしたいです
Clojureってどんな言語?
LISP系のJVM上で動く言語
よくかっこ多過ぎと言われるアレ


(実際にはそんなに変わらんのだけど)
関数言語
• クラスはない


• 一つのデータに対してたくさんの関数
一般的なオブジェクト指向言語 Clojure
データと関数は独立している
Users
閲覧者を処理する関数 Listを処理する関数
購入者を処理する関数
社員を処理する関数
データの価値は、関数が決める
Users
社員を処理する関数
関数がそのデータを社員として扱うなら、それは社員データ
CleanArchitectureのあの図
Usecaseってなんだ?
Usec
a
seオブジェクト?
社員のある月のサラリーを求めるユースケース
社員Repository
社員Domain Service
勤務履歴Repository
社員 履歴
メソッド
Clojureでも似たような構造は作れるが…
RecordとProtocol
社員のある月のサラリーを求めるユースケースprotocolを実装したrecord
SalaryUsecase
社員Repository
社員Domain Service
勤務履歴Repository
社員 履歴
protocol関数
Record作成時にrecord内に格納する
関数は、その引数にだけ依存すべき
多くの関数言語で使われるポリシー
•関数はそれだけで実行できるべき


•テスト容易性


•REPLドリブン開発
ただの関数でよくない?
社員のある月のサラリーを求める関数
その他必要なもの全部
年月
社員を特定できるデータ
引数
DDDのエンティティ
エンティティ「社員」
社員ID
名前
値オブジェクト
部署
ある月の社員の基本給を求めるメソッド 年月
引数
値オブジェクト
値オブジェクト
オブジェクト


フィールド
オブジェクト


フィールド
関数でよくない?
社員の基本給を求める関数
基本給を求めるのに必要な社
員の情報が入ってるデータ
引数
年月
Clean ArchitectureのいうEntity
CleanArchitectureのEntityと


DDDのEntity
Entityオブジェクト
Entityを取り出すRepository
Domain Service
DDDの「モデル」
ドメインを表す名前空間に関数定義すればよくない?
Clojureでは、関数は「名前空間」で区分けすることができます
社員データを処理する関数
社員データを取り出す関数
社員データ同士をまとめて処理したり、他のものを掛け合わ
せて処理したりする関数
「社員」名前空間
Entityのメソッドだったもの
Repositoryのメソッドだったもの
DomainServiceのメソッドだったもの
何がドメインかは、関数が決める
Users
社員を処理する関数
関数がそのデータを社員として扱うなら、そのデータは社員
データが社員クラスだから社員なのではない
データそれだけでは、ただのデータで、何者でもない
これらは、オブジェクト指向のデザインパターンだった
Entityオブジェクト
Entityを取り出すRepository
Domain Service
Usecaseオブジェクト
オブジェクト指向言語の特性や制約が生んだものであっ
て、システム設計上必須のものではなかった
デザインパターンは、条件が変わると消滅することがある
でも、それでも消えなかったものも
ありますよね
その部分が、言語を超えて通用するアーキテクチャ
“CleanArchitecture”というアーキテクチャはない
あの図は例の一つです
この図の通りやってる人どのくらいいますか?
特にWebアプリケーション開発してる人
割と都合悪いところは無視してません?
でもそれはそれでも構わない場合もある
SOLID原則
• S - Single-responsiblity Principle 単一責任の原則
• O - Open-closed Principle オープン・クローズドの原則


• L - Liskov Substitution Principle リスコフの置換原則


• I - Interface Segregation Principle インターフェイス分離の原則


• D - Dependency Inversion Principle 依存関係逆転の原則
2000年ごろにUSENETで誕生(名前がついたのは2004年)
Robert C.Martin,角 征典,高木 正弘. Clean Architecture 達人に学ぶソフトウェアの構造と設計
(Japanese Edition)
“SOLID原則は、関数やデータ構造をどのようにクラスに組み込むのか、そしてクラスの相
互接続をどのようにするのかといったことを教えてくれる。「クラス」という用語を使った
からといって、これらの原則がオブジェクト指向ソフトウェアにしか通用しないわけではな
い。ここでいうクラスとは、単にいくつかの機能やデータをとりまとめたものを指している
にすぎない。「クラス」と呼ぶかどうかは別として、どのようなソフトウェアシステムにも
そのような仕組みはあるはずだ。SOLID原則は、そうした仕組みに適用するものである”
単一責任の原則
個々のモジュールを変更する理由がたったひとつだけになるように、ソフト
ウェアシステムの構造がそれを使う組織の社会的構造に大きな影響を受けるよ
うにする。


オープン・クローズドの原則
ソフトウェアを変更しやすくするために、既存のコードの変更よりも新しい
コードの追加によって、システムの振る舞いを変更できるように設計すべきで
ある
リスコフの置換原則
要するに、交換可能なパーツを使ってソフトウェアシステムを構築するなら、
個々のパーツが交換可能となるような契約に従わなければいけないというこ
と。
インターフェイス分離の原則
ソフトウェアを設計する際には、使っていないものへの依存を回避すべきだと
いう原則。
依存関係逆転の原則
上位レベルの方針の実装コードは、下位レベルの詳細の実装コードに依存すべ
きではなく、逆に詳細側が方針に依存すべきであるという原則。
SOLID原則をシステムに当てはまるとこうなるよね
と言うのがこの図
ぶっちゃけ色分け以外の文字はどうでもいい…
外界
アプリケーションロジック
ビジネスロジック
外界とのIO詳細
でも一番複雑なプログラム、ここにあったりしませんか?
一番複雑な部分を、G
a
tew
a
yの向こう側に吹っ飛ばしてしまってるとも言える
それじゃ、システムの複雑さは改善されないですよね??
この図の通りにクラス分けできているか?
自分のプログラムは


SOLID原則を守れているか?
よりも
の方が大事。
• 下位レイヤーとロジックを分離できているか?


( インターフェイス分離の原則)


• ロジックが下位レイヤーの詳細に依存するのではなく、下位レイヤーの方がロジック
側の提供する仕様に合わせているか?


(依存関係逆転の原則)


• 下位レイヤーの変更を行わずに、コードを追加することで、機能の拡張ができるか?


(オープン・クローズドの原則)
こういった理屈は、言語が変わっても


そのまま適用できる
OSにだって適用できる
OS
(カーネル)プラグイン
ハードウェア抽象化レイヤー
ハードウェア
Webアプリケーション以外にだって適用できる
データ
Clojureのチャンネル・パイプラインの実装
チャンネル
関数
関数
関数
関数 関数
関数
既存のチャンネル+関数を変更することなく、


チャンネルを追加することで、機能を拡張・改変できる
もちろんGatewayの向こう側に


吹っ飛ばした複雑性にも


適用できる
言語を超えて通用するものを見つけるために
パラダイムの違う言語をやろう
今オブジェクト指向言語ばっかり使っているなら


オブジェクト指向言語でないものをやろう
言語を超えても有効なものこそが、


システムの基盤となるアーキテクチャ理論になる
今回言いたかったこと
モデリングは楽しいけども、


その部分を無視したモデリングは多分何も解決してくれない
とりあえず


Clojure


やってみませんか?
というわけで
楽しいよ…
終わり

Más contenido relacionado

La actualidad más candente

WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホン
You_Kinjoh
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
 

La actualidad más candente (20)

開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
C#でわかる こわくないMonad
C#でわかる こわくないMonadC#でわかる こわくないMonad
C#でわかる こわくないMonad
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptxネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
ネットストーカー御用達OSINTツールBlackBirdを触ってみた.pptx
 
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
Private Recommender Systems: How Can Users Build Their Own Fair Recommender S...
 
WebSocketのキホン
WebSocketのキホンWebSocketのキホン
WebSocketのキホン
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
[第2回3D勉強会 研究紹介] Neural 3D Mesh Renderer (CVPR 2018)
[第2回3D勉強会 研究紹介] Neural 3D Mesh Renderer (CVPR 2018)[第2回3D勉強会 研究紹介] Neural 3D Mesh Renderer (CVPR 2018)
[第2回3D勉強会 研究紹介] Neural 3D Mesh Renderer (CVPR 2018)
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
webSocket通信を知らないiOSエンジニアが知っておいて損はしない(経験談的な)軽い話
 
オントロジーとは?
オントロジーとは?オントロジーとは?
オントロジーとは?
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
品質とは何か.pdf
品質とは何か.pdf品質とは何か.pdf
品質とは何か.pdf
 
オープンソースライセンスの基礎と実務
オープンソースライセンスの基礎と実務オープンソースライセンスの基礎と実務
オープンソースライセンスの基礎と実務
 
クソコード動画「Managerクラス」解説
クソコード動画「Managerクラス」解説クソコード動画「Managerクラス」解説
クソコード動画「Managerクラス」解説
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 

Similar a プログラミング言語とシステムデザイン

磯野ー!Dartやろうぜー!
磯野ー!Dartやろうぜー!磯野ー!Dartやろうぜー!
磯野ー!Dartやろうぜー!
uka yare
 
訳が欲しい奴ぁ俺んとこ来い!
訳が欲しい奴ぁ俺んとこ来い!訳が欲しい奴ぁ俺んとこ来い!
訳が欲しい奴ぁ俺んとこ来い!
Ryuji Tamagawa
 
Windows Azure 最新 Update 2013/12/09
Windows Azure 最新 Update 2013/12/09Windows Azure 最新 Update 2013/12/09
Windows Azure 最新 Update 2013/12/09
Ryusaburo Tanaka
 
Windows Azure 最新 Update 2014/01/28
Windows Azure 最新 Update 2014/01/28Windows Azure 最新 Update 2014/01/28
Windows Azure 最新 Update 2014/01/28
Ryusaburo Tanaka
 
Windows Azure 最新 Update 2014/03/10
Windows Azure 最新 Update 2014/03/10Windows Azure 最新 Update 2014/03/10
Windows Azure 最新 Update 2014/03/10
Ryusaburo Tanaka
 

Similar a プログラミング言語とシステムデザイン (20)

#nds34 LT
#nds34 LT#nds34 LT
#nds34 LT
 
磯野ー!Dartやろうぜー!
磯野ー!Dartやろうぜー!磯野ー!Dartやろうぜー!
磯野ー!Dartやろうぜー!
 
ドメイン駆動設計を実践するプログラマーの悩み
ドメイン駆動設計を実践するプログラマーの悩みドメイン駆動設計を実践するプログラマーの悩み
ドメイン駆動設計を実践するプログラマーの悩み
 
「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう「ドメイン駆動設計」の複雑さに立ち向かう
「ドメイン駆動設計」の複雑さに立ち向かう
 
プロ用CMSフレームワークテーマ「echo」のご紹介
プロ用CMSフレームワークテーマ「echo」のご紹介プロ用CMSフレームワークテーマ「echo」のご紹介
プロ用CMSフレームワークテーマ「echo」のご紹介
 
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
Discordから バーチャルオフィス「Teamflow」 に乗り換えてみた 雑談を生む工夫
 
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
俺も受託開発〜準委任契約によるふつうのソフトウェア開発〜
 
訳が欲しい奴ぁ俺んとこ来い!
訳が欲しい奴ぁ俺んとこ来い!訳が欲しい奴ぁ俺んとこ来い!
訳が欲しい奴ぁ俺んとこ来い!
 
チケット管理システム大決戦第二弾
チケット管理システム大決戦第二弾チケット管理システム大決戦第二弾
チケット管理システム大決戦第二弾
 
Windows Azure 最新 Update 2013/12/09
Windows Azure 最新 Update 2013/12/09Windows Azure 最新 Update 2013/12/09
Windows Azure 最新 Update 2013/12/09
 
2011 10-satalabo-naaon
2011 10-satalabo-naaon2011 10-satalabo-naaon
2011 10-satalabo-naaon
 
KyotoLT_Online_27.pdf
KyotoLT_Online_27.pdfKyotoLT_Online_27.pdf
KyotoLT_Online_27.pdf
 
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
 
ソフトウェア開発の現場風景
ソフトウェア開発の現場風景ソフトウェア開発の現場風景
ソフトウェア開発の現場風景
 
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
 
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
 
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
ドメイン駆動設計 モデリング_実装入門勉強会_2020.3.8
 
Windows Azure 最新 Update 2014/01/28
Windows Azure 最新 Update 2014/01/28Windows Azure 最新 Update 2014/01/28
Windows Azure 最新 Update 2014/01/28
 
特にタイトルはない
特にタイトルはない特にタイトルはない
特にタイトルはない
 
Windows Azure 最新 Update 2014/03/10
Windows Azure 最新 Update 2014/03/10Windows Azure 最新 Update 2014/03/10
Windows Azure 最新 Update 2014/03/10
 

プログラミング言語とシステムデザイン