2024.10.21
お互い疑心暗鬼になりがちな、経営企画と事業部の壁 組織に「分断」が生まれる要因と打開策
リンクをコピー
記事をブックマーク
大嶋勇樹氏:(スライドを示して)続けて「これはビジネスロジック?」(というもの)をもう少し見ていこうと思います。2つ目として、リクエストの形式チェックがあります。
例えば、リクエストの必須パラメーターが足りているかとか、データサイズは決められた範囲内かとか、そういうチェックがあると思いますが、個人的にこれはプレゼンテーション層でチェックすべきものだと思っています。
なぜかというと、リクエストは利用者とのインターフェイス、利用者との境界での約束事に対するチェックなので、プレゼンテーション層が実施するべきかなと思っています。
また、不正なデータというものは、後に進んでしまい下手すると何か登録されてしまう可能性もあるので、プログラムがうまく動いていない(時)などは、セキュリティ的にもなるべく先に進めず、できるだけ早く(異常を)検知して以後のプログラムに進ませないようにしたいので、(リクエストの形式は)プレゼンテーション層でチェックしたいなと考えます。
もう1つは、データベースとやりとりする必要もないので、簡単に実装できるという理由もあります。なので、プレゼンテーション層ですべきチェックかなと思っています。
(スライドを示して)またチェックのような話ですが、リクエストの形式より少しだけ複雑な条件チェックは、ビジネスロジック(で実施するもの)かと考えます。
例えば、SNSで自分には「いいね」できないようにするようなものや、TODO管理アプリみたいなもので、過去日のTODOは登録できないようにする(もの)とかですね。
これはロジック、分岐としてはすごく簡単で、実装としても数行ぐらいでできちゃうとか。数行かはちょっとわかりませんが、比較的簡単にできるかもしれないです。こういうもの(のチェック)は、私はビジネスロジックだと思っています。
なぜかというと、プレゼンテーション層は見た目などのUIに直接関わるようなことだけを知っているべきであって、こういう知識をプレゼンテーション層が持っているべきじゃないと思っているからというのが1つ(目の理由)です。
もう1つ、これは「GUIだからとかAPIだからとかコマンドだからこうしたいよね」みたいなルールではなくて、プレゼンテーション層の違いによらない、共通したチェックだと思うからです。
今回実装している、SNSで「自分には『いいね』できないというルールを作ろう」というのは、APIだからではなくて、そのSNSが本来持っているルールみたいなものです。なのでプレゼンテーション層の問題ではなく、ビジネスロジックじゃないかなと私は考えています。
ただこのぐらい簡易的なものになってくると、人によってけっこう意見が分かれることもあり得るかなとは思います。
(スライドを示して)そして「これはビジネスロジック?」の最後。データベースのデータとの整合性チェックみたいなものはビジネスロジックかなと考えます。
例えば、「リバーシ」(の中)でデータベースに毎ターンの盤面の状態を保存しているとして、前のターンの盤面を取り出してきて、(次に)指定された場所に石を置けるか判定する。ほかにも、ECサイトで購入リクエストした商品が購入可能かチェックする。
このような、データベースのデータと整合性をチェックするようなことは、まさにビジネスロジック(がチェックするべきこと)だと私は思っています。ビジネスロジックという言葉もある程度曖昧で、人によって違う意見を持ったりするので「私は」とは言っていますが、「これはビジネスロジックである」と言う人がほとんどだと思います。
「リバーシ」の例でいえば「石をひっくり返す」「(ひっくり返すとしたら)どの点がひっくり返るか計算する」みたいな処理もまさにビジネスロジックですね。
このように、アプリケーションが従うべきルールのチェックやルールを適用する処理が、まさにビジネスロジックの中心です。
(スライドを示して)ここで、ビジネスロジック層の処理をドメインロジックとユースケースの2つに分類して考えてみます。この2つに分類すると、実はちょっと整理しやすくなるんですね。
「リバーシ」で石を打つ時の処理の流れの例から「ビジネスロジックってここだよね」と言っていた部分をちょっと取り出してきました。ここには実は2種類の役割があります。
1個は、盤面に置けるかチェックしたり、石を置いたりひっくり返したりします。盤面に置けるかチェックするというのは、指定された点にもし置いた場合にひっくり返せる点があるか。もしなければ「そこには置けません」みたいなチェック(をすること)ですね。あるいは、石を置くとかひっくり返すとかの処理です。
これはシステムではなく、現実で「リバーシ」で遊ぶ時にも出てくるルールです。「こういうシステムだからどう」とかではなく、その物事に本質的に存在するルールをドメインロジックとかエンタープライズビジネスルールと言ったりします。今日はドメインロジックという呼び方をしようと思いますが、こういうルール、チェックみたいなものがまずあります。
そして、このビジネスロジック層で実装するものの中には、ほかにも処理の流れを実現するものもあります。どこかのサービスクラスかどこかに、データアクセス層を使って「盤面の状態を取得する」をして、盤面に置けるかチェックして、石を置いて、ひっくり返してデータアクセス層を使って、盤面の状態を保存する。
そんな感じの「なにかデータを取り出して、チェックして保存する処理の流れ」があると思います。そういうのは、ユースケースやアプリケーションビジネスルールと呼ばれたりします。今日はユースケースという言葉を使っていこうと思います。
こんなふうに2種類に整理すると、この後の「ビジネスロジックは実際どう実装するんだ」みたいな話が整理されやすくなってきます。
「リバーシ」だけだと少ないかなと思ったので、ドメインロジックの例をもう1例ぐらい挙げています。
「リバーシ」であれば、盤面に置けるかチェックする処理や、挟まれた石をひっくり返す2次元配列のうち、「この点とこの点を0から1に置き換える、石をひっくり返す」ような処理がドメインロジックの例です。
ほかにも、例えばホテルの予約のアプリケーションを作ったとすると、指定された部屋に宿泊できる人数の予約かどうかをチェックする(機能)があると思います。
指定された部屋のマスターデータを見て、何人まで宿泊できるかを確認して、「今回泊まろうとしているのは何人で、人数をちゃんと満たしているな」とか。ほかにも「この人は予約できる条件を満たしているな」というチェックがあると思います。そういうものや「何日前のキャンセルだからキャンセル料はいくらです」という計算をするとか。こういうのがドメインロジックの例です。
ホテルの予約の例は、電話予約や対面の予約など、システムなしで人間が対応する時にもチェックするルールだと思います。
もしも電話予約で、人間がちょっと気を利かせてルールを破ってなにかをやってくれる可能性もあり得なくはないですが、人間が電話予約を受けつけて「何人ですか?」と聞いたり、「キャンセル料はいくらです」という話をしたりする時にも登場するルールだと思います。
こんなふうに、システムなしで現実で同じことをやろうとした時にも出てくるルールは、まさにドメインロジック。ビジネスロジックの中でも、コアなルールのわかりやすい例だと思います。
ということで、この後ビジネスロジックの実装方式の話をしていこうと思います。
ややこしい話をしてきたので、いったんここまでのQ&Aタイムにできればと思います。質問はQ&Aにもらえればと思います。1つ(質問)をもらっているものがあって、せっかくなのでこのタイミングで回答しようと思います。
「ビジネスロジック層のクラスを実装する時の命名は、およそどんなものがありますか? Handler、Manager、Controllerなど」ということです。
ここからビジネスロジックの実装方式について少し話すので、そこで出てくる言葉もあるし、この後にServiceにビジネスロジックを実装する以外の方式の話もしますが、例えばServiceにビジネスロジックを実装する時であれば、“なんとかService”とか“なんとかLogic”という名前がついていることが多い気はします。
あとControllerについては、ビジネスロジックはコントロールをしたいわけじゃないというか、Controllerにビジネスロジックが書いてあることはよくあるのですが、ビジネスロジックを実装するクラスにControllerとつけるのはあまり適していないかなとは思います。
Controllerはテレビゲームのコントローラーを想像してもらうとわかりやすいのですが、ただ入力を受けつけるだけで、ゲームの大事な処理はしないところです。ただ手で触るところがControllerです。ゲームのコントローラーを想像してもらうと役割が見えてくる気がしますね。ただビジネスロジック層に刺さっているだけの、入力を受けつけるだけの部品がControllerです。
Handlerみたいな図形は、どちらかというと個人的にControllerの代わりのHandlerという名前を見た気もします。
あとは、Managerみたいな名づけも(見たことがある気がします)。確かにServiceのところがManagerみたいになっている例は見なくはないですが、Managerという名前自体はあまりいい名づけではないと基本的には言われると思います。
Managerというと役割をすごく広く感じやすいので、あまりつけないほうがいいと言われることが多い気はしますね。真っすぐいくと、“Serviceか、なんとかLogic”が多いとは思います。質問ありがとうございます。
では、質問をいただいた範囲では回答できたので、続きにいこうと思います。
(次回に続く)
関連タグ:
“1つの独立して動く要素”の内部を整理し直す 「改めて整理するアプリケーション設計の基本」で伝えたいこと
アプリケーションアーキテクチャ理解に必要な“3層構造” プレゼンテーション層・ビジネスロジック層・データアクセス層それぞれの役割
3層アーキテクチャで最も謎な「ビジネスロジック層」 “システムのコア”をゲーム「リバーシ」で解説
「ビジネスロジックの処理は2つに分類すると整理しやすい」 4つの例から考える、プレゼンテーション層・データアクセス層の見分け方
ビジネスロジック層内部の2つの実装パターンを比較 選択時に考えたい、アプリケーション設計の観点
「クラスごとの役割を明確化すること」がポイント アプリケーション設計におけるドメインロジックの分離法
重要なのは「基本を押さえ、適したものを採用すること」 “本来の役割”を押さえたアプリケーション設計
2024.11.13
週3日働いて年収2,000万稼ぐ元印刷屋のおじさん 好きなことだけして楽に稼ぐ3つのパターン
2024.11.21
40代〜50代の管理職が「部下を承認する」のに苦戦するわけ 職場での「傷つき」をこじらせた世代に必要なこと
2024.11.20
成果が目立つ「攻めのタイプ」ばかり採用しがちな職場 「優秀な人材」を求める人がスルーしているもの
2024.11.20
「元エースの管理職」が若手営業を育てる時に陥りがちな罠 順調なチーム・苦戦するチームの違いから見る、育成のポイント
2024.11.11
自分の「本質的な才能」が見つかる一番簡単な質問 他者から「すごい」と思われても意外と気づかないのが才能
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.11.18
20名の会社でGoogleの採用を真似するのはもったいない 人手不足の時代における「脱能力主義」のヒント
2024.11.19
がんばっているのに伸び悩む営業・成果を出す営業の違い 『無敗営業』著者が教える、つい陥りがちな「思い込み」の罠
2024.11.13
“退職者が出た時の会社の対応”を従業員は見ている 離職防止策の前に見つめ直したい、部下との向き合い方
2024.11.15
好きなことで起業、赤字を膨らませても引くに引けない理由 倒産リスクが一気に高まる、起業でありがちな失敗
2024.11.13
週3日働いて年収2,000万稼ぐ元印刷屋のおじさん 好きなことだけして楽に稼ぐ3つのパターン
2024.11.21
40代〜50代の管理職が「部下を承認する」のに苦戦するわけ 職場での「傷つき」をこじらせた世代に必要なこと
2024.11.20
成果が目立つ「攻めのタイプ」ばかり採用しがちな職場 「優秀な人材」を求める人がスルーしているもの
2024.11.20
「元エースの管理職」が若手営業を育てる時に陥りがちな罠 順調なチーム・苦戦するチームの違いから見る、育成のポイント
2024.11.11
自分の「本質的な才能」が見つかる一番簡単な質問 他者から「すごい」と思われても意外と気づかないのが才能
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.11.18
20名の会社でGoogleの採用を真似するのはもったいない 人手不足の時代における「脱能力主義」のヒント
2024.11.19
がんばっているのに伸び悩む営業・成果を出す営業の違い 『無敗営業』著者が教える、つい陥りがちな「思い込み」の罠
2024.11.13
“退職者が出た時の会社の対応”を従業員は見ている 離職防止策の前に見つめ直したい、部下との向き合い方
2024.11.15
好きなことで起業、赤字を膨らませても引くに引けない理由 倒産リスクが一気に高まる、起業でありがちな失敗