2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
リンクをコピー
記事をブックマーク
大嶋勇樹氏:(スライドを示して)続けて「これはビジネスロジック?」(というもの)をもう少し見ていこうと思います。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.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05