目次
4.2. 非常に多くの O を定義する必要があるのはいつですか
4.3. エンティティオブジェクト間で変換するにはどうすればよいですか?
1.アリ仕様
まず、 Ali Development Manual のPOJO /DO/DTO/BO/VOの関連説明を見てください。
1.1. サービス/DAO レイヤーメソッドの命名規則
1.2. ドメインモデルの命名規則
知らせ:送信を意味する単語: 送信。したがって、データ送信オブジェクトは DTO と呼ばれます。
1.3. 命名スタイル
[必須] DO / BO / DTO / VO / AO / PO / UID などの場合を除き、クラス名には UpperCamelCase スタイルを使用します。
正の例: ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion
負の例: Forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion
【必須】DO/DTO/VOなどのPOJOクラスを定義する場合は、属性のデフォルト値を設定しないでください。(4) OOP プロトコル
【必須】 DO/DTO/VO などの POJO クラスを定義する場合、属性のデフォルト値を設定しないでください。
反例: POJO クラスの createTime のデフォルト値は new Date() ですが、このプロパティにはデータの抽出時に特定の値が設定されず、他のフィールドが更新されるとこのフィールドも更新されるため、作成時刻が変更されます。現在の時間まで。
2. 簡単なクラス: DO/DTO/BO/VO などを含む
これは、主にデータベースと対話するためのデータ アクセス インターフェイスです。主にデータへのアクセスをカプセル化するために使用されますが、データベースへのアクセスではなく、データへのアクセスであることに注意してください。
DO(データオブジェクト)
Alibaba では、データベース テーブルに 1 対 1 で対応する POJO クラスを特に指します。
一般的にはビジネスロジック層(Service)がデータベース(SQL)にアクセスする際にデータを受け取るために使用されます。
xxxDO、xxx はデータテーブル名です
さらに、DO は概念的には Entity と同じであり、実際のアプリケーションでは 1 つのものです。わずかな違いは、DO はデータベースと特定のマッピング関係を持つエンティティであり、一般的に言えば、DO はエンティティの一種です。
VO (View Object) ビュー モデルは、
フロント エンドと対話し、フロント エンドから返されたデータを受け取り、ビュー表示のためにフロント エンドに返すために使用されます。
xxxVO、xxx は通常、Web ページの名前です。
AO (アプリケーション オブジェクト) アプリケーション オブジェクト
AO は、あまりにも一般的であり、その詳細については意図的に説明していないため、比較的一般的な概念です。非常に単純な例を取り上げます。制御層 (Controller) はビジネス ロジック層 (Service) 内の 1 つ以上のデータをクエリし、このデータ送信プロセスのトランスポートは AO によって完了します。通常のビジネス ロジックには、整数、文字、コレクション、クラスなどの多くの種類のデータがあり、これらを総称して AO と呼びます。
**コントローラ**と**ビジネス ロジック層 (サービス)** の間の抽象再利用オブジェクト モデルは、プレゼンテーション層に非常に近い場合があり、再利用の程度は高くありません。
BO (ビジネス オブジェクト) ビジネス オブジェクト
ビジネス オブジェクト (ビジネス オブジェクト、BO) は、データを取得して処理するコンポーネントです。主な機能は、ビジネス ロジックをオブジェクトとしてカプセル化することです。このオブジェクトには 1 つ以上の他のオブジェクトを含めることができます。画像の記述は、オブジェクトの形式と動作を指しますが、もちろん、他のオブジェクトのいくつかの形式と動作も含まれます。
通常、ビジネス機能モジュールを含む特定のインスタンスで使用されます。たとえば、いくつかの機能を実現するために、コントローラー、サービス、DAO、ツール クラスなどの一連のインスタンスを作成しました。これらの一連のインスタンスがコンポーネントに結合されます。 . このコンポーネントは BO です。
POJO (Plain Ordinary Java Object) 純粋な通常の Java オブジェクト
POJO は、setter/getter/toString のみを持つ DTO を参照します。一般に、POJO には、本質的に単純な Java オブジェクトである DO、DTO、BO、VO が含まれますが、実際には通常の JavaBeans であり、EJB との混同を避けるために作成された略語です。
PO (Persistent Object) 永続オブジェクトは
データベースのプロパティとフィールドに対応します
エンティティ(アプリケーションドメインの概念) エンティティ
エンティティ(アプリケーションドメインの概念)エンティティ
Eitity は永続化されていないオブジェクトであり、現実からコードに抽象化したクラスです。
モデル (概念エンティティ モデル) エンティティ クラスとモデル
モデルは、コンピュータ プログラミングにおける 2 つの概念です。1 つは3 層アーキテクチャのエンティティ クラスで、もう 1 つは MVC アーキテクチャのモデルです。
3. MVC 3層アーキテクチャとの関係
オブジェクト指向プログラミングの「3 層アーキテクチャ」では、各層で送信されるデータがエンティティ クラスにカプセル化されるため、データ送信が容易になり、可読性が向上します。
MVC (モデル モデル-ビュー ビュー-コントローラー コントローラー) パターンでは、モデルはビジネス プロセス/状態の処理とビジネス ルールの定式化であるモデルを表し、ビューによって要求されたデータを受け取り、最終的な処理結果を返します。 。View はビューを表し、Model によってもたらされたデータ モデルを解析するために使用されます。ビジネスモデルの設計はMVCの最も重要な核と言えます。
通常の意味での 3 層アーキテクチャとは、ビジネス アプリケーション全体を、プレゼンテーション層、ビジネス ロジック層、およびデータ アクセス層に分割することです。レベルを区別する目的は、「高凝集性、低結合性」という考え方です。
プレゼンテーション層 (Web):ユーザーの送信要求の受信と応答の処理に使用されます。
ビジネス ロジック層 (サービス) : データのビジネス ロジック処理。
データアクセス層(dao):この層で行われるトランザクションは、データの追加、削除、変更、更新、検索などのためにデータベースを直接操作します。
4. まとめ
PO 永続オブジェクト:データベース属性およびフィールドとの 1 対 1 対応
DO ドメイン オブジェクト:エンティティとイベントに基づくビジネス オブジェクト。複雑なシステムを構築する場合、ドメイン駆動の設計アイデアを採用すると、開発の複雑さを軽減できます。
DTO データ転送オブジェクト:さまざまなアプリケーションのデータ転送に使用され、分散、マイクロサービスの名前
VO 値オブジェクト:フロントエンドと対話し、フロントエンドから返されたデータを受け入れ、フロントエンドに返し、ビューを表示するために使用されます。
BO ビジネス オブジェクト:複数の PO をカプセル化し、サービス層でさまざまなビジネスを処理します。
4.1. これらのオブジェクトを分割する理由
なぜなら、ビジネスが異なれば、同じオブジェクトの役割も異なるからです。たとえば、ユーザーの追加にはパスワードが必要ですが、情報の閲覧には一部の情報しか返せませんし、機密情報であっても特別に扱う必要があります。しかし、その処理は包括的ではなく、状況に応じて処理することができず、逆にビジネスの複雑さを増し、ビジネスの直結性を低下させます
。 , 他のビジネスに影響を与えることなく、フィールドの内容を変更します。プログラムを通常に実行すると、
プログラマは名前を知り、意味を理解できます。オブジェクトに名前を付けるときは、他のプログラマも同じように、XXXDO、xxxVO と名前を付ける必要があります。コードを保守するときにこの情報を処理する方法を知っている必要があります。
4.2. 非常に多くの O を定義する必要があるのはいつですか
プロジェクトで VO、BO、PO、DO、DTO を定義する必要は本当にありますか? 理論的には
プロジェクトが比較的小規模で、単純な MVC プロジェクトであり、1 人の兵士による操作である場合は、VO、BO、PO、DO、DTO の使用はお勧めしません。各レイヤーの送信を担当する POJO を使用するだけです。 、このプロジェクトの「目的」がすぐに達成されるからです。
ほとんどの場合、私たちは継続的に反復的なチーム コラボレーション プロジェクトを行っています。現時点では、VO、BO、PO、DO、DTO を使用することをお勧めします。また、標準仕様を形成するにはチーム内で合意に達する必要があります。
4.3. エンティティオブジェクト間で変換するにはどうすればよいですか?
BeanUtils.copyProperties(srcVo,destDto);
mapper.map(srcVo,DestDto.class);
参考文献
Concept POJO Xiaofengwanyuedanのブログ
『Ali Java開発マニュアル 黄山編』