web-dev-qa-db-ja.com

トランザクションスクリプトはアンチパターンですか?

NoSQLデータベースを使用したトランザクションスクリプトについても同様のトピックがありますが、これは一般的なパターンについてです。トランザクションスクリプトについて私が見つけたところ、それはオブジェクト指向ではありません。コードのすべての行でオブジェクトを使用する可能性があるにもかかわらず、基本的に手続き型コードです。

より良い解決策は、代わりにドメインモデルを使用し、アクティブレコードまたはデータマッパーと作業単位/ IDマップ/遅延読み込み/クエリオブジェクトなどを組み合わせて使用​​することです。トランザクションスクリプトは使いやすいかもしれませんが、実際には手続き型プログラミングであるため、オブジェクト指向の世界ではアンチパターンと見なす必要があります。

どう思いますか?トランザクションスクリプトがアンチパターンであることに同意しますか?または、実際には、手続き型ではなくオブジェクト指向のトランザクションスクリプトを設計する方法がありますか?しかし、これが可能かどうかは疑問です。

28
Lord Yggdrasill

トランザクションスクリプトは間違いなくではなくアンチパターンです。

トランザクションスクリプトについて私が見つけたところ、それはオブジェクト指向ではありません。

あなたは正しいです、そうではありません。ただし、その事実はそれをアンチパターンにしません。これは手続き型のアプローチですが、実際、一連のビジネスロジックアーキテクチャパターンの中で適切な位置を占めています。どの場合に使用するのがベストプラクティスであるかを知っておく必要があります。その場合はそうではありません。簡単に言えば、問題のドメインが非常に単純な場合、ビジネスロジックでより複雑なパターンを使用することはオーバーヘッドの価値がありません。

または--as Fowler 書き込み:

いつ使用するか

トランザクションスクリプトの栄光は、そのシンプルさです。この方法でロジックを編成することは、ロジックの量が少ないアプリケーションにとっては当然であり、パフォーマンスまたは理解のいずれにおいてもオーバーヘッドはほとんどありません。

あなたが考えるかもしれないアンチパターンは 貧血ドメインモデル と呼ばれます。これは、ドメインモデルを構築している意図および考える場合です-問題のドメインはそのために十分に複雑であるため、 -しかし、実際にはトランザクションスクリプトで終了します-コードの編成が悪いため/弱いOOスキル。

44
Gustin

notアンチパターンです。実際、ほとんどのエンタープライズアプリケーション(私が見たすべて)は、リッチドメインモデルパターンではなく、トランザクションスクリプトを使用しています。

アクティブレコードパターンは、ドメインエンティティから永続ストア集計(RDBMSテーブル)への単純な1対1のマッピングがある場合にのみ便利です。

データマッパーはORM(Hibernateとその仲間)のようなものです。ビジネスロジックがドメインエンティティ内にある場合、これらのエンティティはそれ自体を変更する必要があります。私の意見では、これは状態(ORMを使用するときに固有)を変更するロジックを状態自体と結合します。ドメインモデルを外部から見て、ビジネスロジックをサービス(トランザクションスクリプト)に組み込む方が簡単です。また、ビジネスロジックのボリュームが大きい場合、ドメインエンティティ全体に分散していると、関連するコードを見つけるのが難しくなります(トランザクションスクリプトが混在しているようなものです)。

しかし、サービスを自己完結型の非常にまとまりのある「手続き型コンテナー」に分解できる(そしてそうすべきである)ので、完全に手続き型のアプローチで終わる必要はありません。

9
Tvaroh