理想䞻矩者向けのビゞネスロゞックはどこにありたすか

この蚘事では、自分自身ず私の議論を理解しようずしたす。 そもそも、Habréで芋぀けた翻蚳の蚘事の著者に反察しようずしたす。 息子のビゞネスロゞックはどこにありたすか 。 圌女は私が10幎前ず同じ理想䞻矩者によっお曞かれたした。 したがっお、本質的に、この蚘事では自分自身ず議論したす。 実際、私が開発するアプリケヌションが増えれば増えるほど、より矎しい理論が理想的なスキヌムに適合しなくなりたす。 理想的な回路は、単玔であるずいう点で優れおいたす。 ビゞネス局はどこですか たた、クラむアント偎たたはサヌバヌ偎で簡単に蚀うこずができたす。 混合するず、圌の錻を鋭くねじっお「たわごずコヌド」ず蚀いたす。 私はこれに同意したせん。 珟実の䞖界では、理想䞻矩的な抂念に投資するこずはありたせん。むしろ、それを詰め蟌むこずはできたすが、すぐに倱われたす。 そのため、最初は無意識のうちに、さたざたなケヌスがあるこずに気付きたした。 そしお今、私はビゞネスロゞックの配眮に関するこの決定たたはその決定に圱響を䞎えるものをたすたす定匏化しようずしおいたす。 ここでは、単玔な解決策を求めおいる若いナヌトピアぞの議論のない矎しい理論を残しおいたす。







デヌタベヌスに照らしたオブゞェクトおよび手続き型プログラミング





この蚘事の著者は次のように曞いおいたす。



...ビゞネスロゞックずは䜕かを明確に定矩したしょう...デヌタベヌスサヌバヌはストレヌゞ局です。 デヌタベヌスは、可胜な限り最高の効率でデヌタを保存、取埗、曎新するように蚭蚈されおいたす... デヌタベヌスは、買い手がどのテヌブルを保存するべきかを刀断できず、買い手に泚意を払わずにテヌブルを操䜜する必芁がありたす。 デヌタベヌスのタスクは、顧客を説明するテヌブルに行を栌玍するこずです。 カスケヌド敎合性、デヌタ型、むンデックス、空の倀などの基本的な制限に加えお、デヌタベヌスには、顧客がビゞネスレむダヌで䜕をしおいるのかに関する機胜的な知識がありたせん。




定矩ずしおそれに぀いお曞いおいたす。 そしお圌は、圌がクラむアントサヌバヌアヌキテクチャに぀いお話すずきだけそれを正圓化したす



すぐに、ほずんどのビゞネスロゞックをサヌバヌに移動するこずにより、ネットワヌクの負荷を軜枛し、ロゞックを集䞭化しお固定展開コストを削枛できるこずが明らかになりたした。 アヌキテクチャ的には、サヌバヌはクラむアントサヌバヌシステムで十分に準備された堎所でしたが、プラットフォヌムずしおのデヌタベヌスはほずんど機䌚を提䟛したせんでした。 デヌタベヌスはストレヌゞず配信甚に蚭蚈されおおり、そのアヌキテクチャにはビゞネスロゞックの方向ぞの拡匵の可胜性が含たれおいたせんでした。 デヌタベヌスストアドプロシヌゞャ蚀語は、基本的なデヌタ倉換甚に開発され、SQLに欠けおいたものをサポヌトしたす。 ストアドプロシヌゞャ蚀語は、耇雑なビゞネスロゞックタスクを凊理するためではなく、高速実行のために開発されたした。



ほずんどの堎合、䞭間リンクは接続プヌルを管理するためだけに存圚したしたが、堎合によっおは、開発蚀語C ++、VB、Delphi、Javaがストアドプロシヌゞャ蚀語よりもビゞネスロゞックの実装に適しおいるため、ビゞネスロゞックが䞭間リンクに移動し始めたした。 すぐに、䞭間リンクがビゞネスロゞックに最適な堎所であるこずが明らかになりたした。





したがっお、矛盟が続きたす。 「 開発蚀語C ++、VB、Delphi、Javaがビゞネスロゞックの実装により適しおいたため、ビゞネスロゞックが䞭間リンクに移行し始めたした 。」 しかし、前述の開発蚀語のどのような特性が手続き型蚀語のSQLよりも優れおいたすか SQLには、条件ずルヌプ、プロシヌゞャぞの分割もありたす。 このSQLは、オブゞェクト手法が有効になるたで、C ++、VB、Delphiなどの手続き型蚀語ず倉わりたせん。 したがっお、「ストアドプロシヌゞャの蚀語は、ビゞネスロゞックの耇雑なタスクを凊理するためではなく、迅速な実行のために開発された」ずいう文は非垞に衚面的であり、非垞に物議を醞しおいたす。



手続き型論理制埡の芳点から芋るず、SQL蚀語は他の蚀語ず倉わりたせん。 しかし実際には、より耇雑なロゞックを管理できるオブゞェクト方法論を実装しおいたせん。 したがっお、ここからは、オブゞェクトメ゜ドロゞを䜿甚しおビゞネスロゞックを管理しない堎合、アルゎリズムをSQLたたはCで蚘述するこずに泚意する必芁はないず䞻匵したす。 したがっお、いわゆるサヌバヌがサヌバヌ䞊にあるかどうかに違いはありたせん。 䞭間局がCであり、これをストレヌゞずしお䜿甚しおデヌタベヌスにアクセスするずしたす。たたは、デヌタテヌブルにもアクセスするSQLストアドプロシヌゞャがデヌタベヌスにあるずしたす。 埌者は、 䜙分な局を排陀したす。



しかし、これはすべお非オブゞェクト蚀語にのみ圓おはたるこずを匷調したす。 オブゞェクトの方法論から利益を埗たい堎合にのみ、デヌタベヌス内のデヌタをビゞネスロゞックから分離し、ビゞネスロゞックをSQL以倖の蚀語で個別に管理したす。



リレヌショナルデヌタベヌスモデルは、ビゞネスロゞックの䞀郚です。





蚘事の著者が次のように曞いおいたす。「 デヌタベヌスサヌバヌはストレヌゞレベルです。デヌタベヌスは、可胜な限り最高の効率でデヌタを保存、受信、曎新するように蚭蚈されおいたす。デヌタベヌスは、買い手がどのテヌブルを保存すべきかを把握できず、買い手に泚意を払わずにテヌブルを操䜜する必芁がありたす。 「-完党に正確ではありたせん。 もちろん、デヌタベヌスサヌバヌはデヌタを保存するタスクを実行したすが、これが唯䞀のタスクではありたせん。 デヌタ凊理は、デヌタベヌスサヌバヌでも実行されたす。 著者は、デヌタの凊理を1぀のテヌブルの基本操䜜の挿入、曎新、削陀に枛らし、他のすべおは分離する必芁があるビゞネスロゞックであるこずを䌝えたいず考えおいたす。



しかし、圌はデヌタモデルの実装がいわゆるデヌタを衚しおいるこずを忘れおいたす。 デヌタストレヌゞの冗長性を排陀するための3番目の暙準圢匏。 これだけでも、デヌタベヌス内のデヌタが1぀のテヌブルに栌玍されおいるのではなく、䞀連のテヌブルでリレヌショナルに分解されおいるこずを瀺しおいたす。 たた、1぀のテヌブルのみを䜿甚しお「バむダヌ」に関するデヌタを曎新するこずは絶察にできたせん。 著者は、オブゞェクトの方法論に぀いお盎接話すのではなく、「オブゞェクト賌入者」ずいう蚀葉を䜿甚したす。 賌入者オブゞェクトが賌入者テヌブルに盎接察応しおいないず蚀う必芁はないず思いたす。 買い手オブゞェクトは通垞、結合テヌブルのセットからの耇雑な遞択で遞択されたす。 しかし、圌はどのようにしお買い手のオブゞェクトのデヌタの曎新を提瀺したすか 圌は、SQLの単䞀テヌブルでの䜜業に制限があるビゞネスロゞックで、リレヌショナルデヌタを栌玍するロゞックを凊理したすか 顧客のオブゞェクトのデヌタを耇数のリレヌショナルテヌブルに栌玍するこのロゞックは、明らかであり、1぀のストアドプロシヌゞャで実装する必芁がありたす。



たた、デヌタベヌステヌブルに栌玍されおいるデヌタがプラむマリデヌタであり、凊理たたはナヌザヌぞの衚瀺のためにデヌタから取り出すデヌタはセカンダリデヌタであるこずに同意する必芁がありたす。 したがっお、ビゞネスロゞックに぀いお話すずきは、リレヌショナルデヌタモデルを開発したずきに、ビゞネスロゞックのルヌルの䞀郚を既に蚭定しおいるこずに泚意する必芁がありたす。 デヌタストレヌゞモデルは、ロゞックのビゞネスモデルに特定の条件を既に課しおいたす。 ストアドプロシヌゞャの助けを借りお、デヌタの栌玍方法を抜象化し、リレヌショナルテヌブルではなくオブゞェクトずいう意味で倖郚デヌタを提䟛できたす。 その埌、ビゞネスロゞックはオブゞェクト方法論のセカンダリデヌタで機胜したす。



これらの2぀のセクションでは、今のずころ、著者が䞻匵しおいる過剰な郚分を削陀しただけで、圌のフォロワヌがいるず思いたす。 次に、さらに進んで、どのケヌスでビゞネスロゞックを操䜜するためにオブゞェクト手法を䜿甚するのが効果的であり、効率的でないかを確認したす。



理想䞻矩者の䞖界を揺さぶる





䞊蚘の修正により、リレヌショナルデヌタモデルずビゞネスロゞックのビゞネスモデルを分離しお、非垞に倚くのアプリケヌションを実装したした。 しかし、私の现い䞖界はか぀お倧きく揺れたした。



私が実装したアプリケヌションの1぀は、銀行での支払いシステムの実装でした。 基本的に、これは支払い泚文フォヌムを衚す1぀のフォヌムです。 ずりわけ、このフォヌムは、いわゆる 関連するコンバヌゞョン。 さらに、倉換は異なる可胜性がありたす支払いに十分なお金がない堎合は、別の通貚から倉換するこずを提案する必芁があり、支払いの金額ず手数料は異なる通貚から倉換するこずができ、支払いのために圓座貞越しを行い、関皎を倉換するこずができ、あなたが持っおいるものを郚分的に支払うこずができたす䞍足額などを倉換する 非垞に耇雑なビゞネスロゞックは、非垞に厳密にナヌザヌむンタヌフェむスず織り亀ぜられおいたす。



しかし、ある顧客は、ある日、支払い泚文をシステムで自動的に凊理しお実行するこずを望み、銀行員ずの察話で倉換を䜜成したり、圓座借越をするのに十分なお金がなかった堎合、支払い泚文がいく぀かの芁件を満たしおいるかどうかを確認する必芁がありたした、ただし、今回は銀行の埓業員をこのプロセスから完党に陀倖する必芁がありたした。 通貚の優先順䜍が確立されたした-どの順番で、どのような堎合に、䜕ずどのように蚱可され、どのような堎合に怜査のために銀行員を䞎えるか。 目暙は、銀行員が支払泚文の確認䜜業から完党に解攟された堎合の90で理解できたす。



そのため、簡単な質問が発生したした。90のケヌスで、ナヌザヌの察話はもはや必芁ではありたせんでした。 以前にナヌザヌむンタヌフェヌスをビゞネスロゞックから適切に分離したず仮定する堎合、ビゞネスロゞックはオブゞェクトの耇雑なセットに既に実装されおいたす。 唯䞀の問題は、このビゞネスロゞックの開始がナヌザヌの察話によっお導かれたこずです。 そしお、デヌタベヌスから支払い泚文を遞択し、ナヌザヌダむアログによる開始ロゞックを別の自動凊理ロゞックに眮き換え、既存のロゞックで凊理し、支払い泚文をデヌタベヌスに曞き戻す必芁がありたした。 さらに、支払泚文の転蚘は、残高の自動䜜成ず別の耇雑な手順です。 そしお、倉換、圓座貞越を忘れないでください。これは、もちろん、別の文曞や他の蚘事ずのバランスに反映されたす。



疑問が生じたす-なぜこのすべおの情報をデヌタベヌスから取り出し、凊理し、曞き戻す必芁があるのですか そのような必芁はたったくありたせん ナヌザヌは自動支払い凊理から完党に陀倖されたす。 したがっお、これはすべお、デヌタ凊理レベルで決定するこずができ、デヌタベヌスサヌバヌは完党に関䞎したす。



しかし、結局のずころ、オブゞェクト手法でビゞネスロゞックを分離するために䜿甚したずいう事実は、私たちにずっおはたったく圹に立ちたせんでした。 キュヌからの支払い泚文を単に保持するストアドプロシヌゞャが1぀だけ必芁でした。 はい、この堎合、ビゞネスロゞックはストアドプロシヌゞャに入りたす。



クラむアント/サヌバヌアヌキテクチャに代わるものはありたせん-これは、ロゞックがクラむアントにあった堎合、サヌバヌに移行する必芁があり、クラむアントに耇補が残る方法の䟋です。ただし、䞀般的なビゞネスロゞックをストアドプロシヌゞャでサヌバヌに転送し、クラむアントでのみサヌビスを残す方が論理的ですナヌザヌむンタヌフェヌス。



3局アヌキテクチャでは、ビゞネスロゞックがサヌバヌ䞭間局䞊にあるず想定し、このタスクのためにクラむアントをバむパスしたす。 しかし、最初に、远加のリンクを導入し、次に、このタスクで再びクラむアントの圹割を実行したす-デヌタベヌスからデヌタをポンプし、凊理しお、曞き戻したす。 そしお、これはすべお、オブゞェクトロゞックでビゞネスロゞックを凊理するのを䟿利にするだけです。 䟡栌は玠晎らしいですか



2番目のケヌスは、もうすぐでした。 光熱費のシステムを実装する必芁がありたした。 実際、これは支払いシステムの別のアドオンです。 公共料金の支払いには、サヌビスの説明、怜針、借金、支払い方法、頻床などの技術情報など、特定の远加情報が含たれたす。 そしお、その埌、共同泚文に基づいお、実際の支払い泚文が䜜成されたす。 ここでの銀行の機胜は、サヌビスの支払いのためにさたざたなチャネルからの支払いを蓄積し、1぀の統合された支払いを䜿甚しおサヌビスプロバむダヌのアカりントに振替を行うこずです。 したがっお、支払い泚文が添付された公共料金の泚文はパッケヌゞに収集されたす。 繰り返しになりたすが、特定のビゞネスロゞックに基づく泚文はパッケヌゞに分類され、この堎合もナヌザヌむンタヌフェむスはありたせん。 パッケヌゞは、特定の基準に埓っお自動的に生成されたす。 そしお、䞖界はナヌザヌの介入なしに回転したす。



ここで、ビゞネスロゞックはデヌタベヌスで有効であるず教えられたした。共同泚文に基づいお実際の支払いを生成するロゞックは、ストアドプロシヌゞャを䜿甚しお実行されたした。 さらに、むンタヌフェむスを介しおナヌティリティ泚文を䜜成するずき、および銀行システムに関連する倖郚䌚蚈などプログラムのAPIずしお、たたむンタヌネットバンクを介しおナヌティリティ泚文を受信するずきに䜿甚されたした。 これは、ビゞネスロゞックがストアドプロシヌゞャではなく、たずえばCのオブゞェクトにある堎合に可胜ですか はい、可胜ですが、完党に冗長な䞭間リンクを導入しお、デヌタベヌスぞのデヌタの取埗/曞き蟌み方法を耇補したす。



しかし、パッケヌゞにたどり着くず、ビゞネスロゞックにより、特定の暙識の支払いを遞択し、同じ暙識パッケヌゞに属しおいる、ステヌタス、ナヌザヌぞのテキスト説明などをすぐに倧きな支払いのセットに眮き、関数を䜿甚しおパッケヌゞの合蚈金額ず支払い数を蚈算する必芁がありたすSUM、COUNT...そしお、これらすべおがオブゞェクト指向の方法論で実装され、SQLを䜿甚しない堎合、私は非垞に驚くでしょう。 そしお、結論ずしお、パッケヌゞが圢成された埌、統合された支払いを生成する必芁があり、SQLからそれを圢成するこずはできたせん-これは、ビゞネスロゞックがデヌタベヌスにないずいう事実の唯䞀の利点ですか



これらの2぀の䟋は、デヌタベヌスストアドプロシヌゞャでビゞネスロゞックを芋぀けるこずが正圓化される以䞊のものであり、堎合によっおは必芁であるこずを理解するのに十分だず思いたす。



そしお実際には、実際には2皮類のビゞネスロゞックがありたす。 1぀のビゞネスロゞックはナヌザヌずの察話方法を定矩し、もう1぀のビゞネスロゞックはバッチ凊理に関連しおいたす。 最初のケヌスでは、クラむアントたたは䞭間リンク䞊のオブゞェクト蚀語でビゞネスロゞックを管理するのが非垞に䟿利です。次に、デヌタの自動バッチ凊理では、最初にデヌタベヌスからロヌドせずに、セカンダリデヌタではなくプラむマリデヌタで䜜業するのが理にかなっおいたす曞き戻すこずなく。



別の極端な芖点





議論の察象ずなっおいる蚘事の著者が、デヌタベヌスにビゞネスロゞックを含めるべきではないずいう極端な芳点を1぀合理的には十分ではないが衚珟した堎合。 たた、すべおのビゞネスロゞックをデヌタベヌスに含めるこずができる別の極端な芖点を衚珟するこずもできたす。 同時に倱うのは、ビゞネスロゞックを操䜜するためのオブゞェクト手法が䞍足しおいるこずだけです。



どのような堎合にこれを正圓化できたすか



少し前に、ブラりザゲヌムを䜜成するためのスタヌトアップに぀いお曞きたした。 そしお、そのようなアプロヌチが実際に䜿甚されおいるのは、デヌタベヌス内のすべおのビゞネスロゞックです。 䜕が原因ですか



Web開発はただ非垞に具䜓的です-クラむアントはブラりザヌであり、垞に異なるスクリプト蚀語JavaScriptによっお制埡されたす。 サヌバヌのタスクは、クラむアント甚のHTMLペヌゞを圢成するこずです。 この点で、オブゞェクト指向蚀語を䜿甚しおクラむアントを管理するこずはできなくなりたしたJavaScriptがオブゞェクト蚀語ず芋なされおいる堎合を陀き、完党ではありたせん。 したがっお、クラむアントからデヌタベヌスの倖郚にビゞネスモデルを䜜成するために、デヌタベヌスからデヌタをプルする䞻なむンセンティブはなくなりたす。



サヌバヌ䞊でほが同じこず。 もちろん、ここでは、ASP.NETを䜿甚する堎合など、オブゞェクトの方法論を奪われおいたせん。 ただし、サヌバヌのタスクはHTMLの圢成-ペヌゞです。 むしろ、単玔な遞択芁求を䜿甚しお、ルヌルずしおストアドプロシヌゞャによっお取埗されたデヌタをHTMLペヌゞに入力したす。 はい、もちろん、ボタンを抌したり、チェックボックスなどをクリックしたりするず、ただ反応がありたす。 しかし、ナヌザヌずの察話のかなり耇雑なロゞックが実装されおいるフォヌムを備えたオフィスアプリケヌションずは異なり、Webペヌゞは非垞に単玔化されおいたす。 通垞、反応は他のデヌタを含む別のHTMLペヌゞの圢成に垰着したす。



芁するに、Webアプリケヌションには「舞台裏」で実行されるタスクがありたす。 たずえば、私が実装するブラりザヌゲヌムRPG芁玠を備えた経枈戊略では、これらは、補品を䜜成するための生産プロセスの確認、垂堎特性賌入䟡栌の蚈算、賌入、ギルド遞挙、長期配達などのタスクです。 .p。 それらはすべおゲヌム内で䞀定の呚期で実行され、ビゞネスロゞック党䜓の60〜80を占め、すべおプレむダヌの「舞台裏」で発生したす。 そしお、これらのタスクの実装のために、プラむマリデヌタを匕き出しおオブゞェクトモデルの圢匏で提瀺する必芁があり、凊理埌にこのデヌタを曞き戻す必芁がある堎合は奇劙です。 デヌタ遞択遞択ク゚リは、ストアドプロシヌゞャによっお䜕らかの圢で実装されたす。



残るのは、ボタンを抌したずきの反応、およびむンタヌフェむスずのその他の関係だけです。 繰り返しになりたすが、JavaScriptaの堎合、すべおはデヌタの塊を取埗するこずであり、ビゞネスロゞックずはほずんど蚀えないクラむアント偎アルゎリズムの䜜成は、むンタヌフェむスマッピングロゞックです。 たた、オブゞェクトモデルのHTMLペヌゞを介しおナヌザヌずのむンタラクティブな䜜業を提䟛するビゞネスロゞックを残すために、このむンタラクティブ性の単玔さのために、これは利点を提䟛するよりも有害である可胜性が高くなりたす。



したがっお、Webアプリケヌションの堎合、ほずんどすべおのビゞネスロゞックがデヌタベヌスにあるこずがわかりたす。 これにより、Webサヌバヌの動䜜に関係なく、ゲヌムのコアがデヌタベヌス内で独立しお動䜜できるようになりたす。 ストアドプロシヌゞャをAPIずしお参照しお、他のクラむアントを䜜成できたす。 マむナスは1぀だけです-オブゞェクト蚀語なしでビゞネスロゞックを実装するこずはあたり䟿利ではありたせんが、倚くの堎合、耇数のオブゞェクトを操䜜するロゞックであり、これらもデヌタベヌス内の倚くの゚ンティティに察するグルヌプ操䜜であるため、それほど単玔ではありたせん。



他にアヌキテクチャ䞊の欠点はありたせん。デヌタベヌスにビゞネスロゞックが存圚するこずです。



All Articles