3

私は、既存のレガシー ソフトウェアを書き直すプロジェクトに取り組んでいます。従来のソフトウェアは、主に SQL データベースに対する CRUD 操作 (作成、読み取り、更新、削除) で構成されています。

CRUD ベースのコーディング スタイルにもかかわらず、レガシー ソフトウェアは非常に複雑です。このソフトウェアの複雑さは、問題領域自体の複雑さの結果であるだけでなく、貧弱な (そして通常は非常識に近い) 設計上の決定の結果でもあります。この不十分なコーディングにより、データベース内のデータの整合性が失われています。これらの整合性の問題は、関係 (外部キー) だけでなく、単一の行内の整合性にも関係しています。たとえば、列「x」の意味は、列「y」の意味と完全に矛盾しています。(質問する前に、答えは「はい」です。私は問題のドメインを分析し、これらの列の意味と目的を正しく理解しており、元のソフトウェア開発者よりも優れているようです)。

代替ソフトウェアを作成するとき、主にドメインの複雑さのために、ドメイン駆動設計とコマンド クエリ責任分離の原則を使用しました。たとえば、書き込みモデルで不変条件を適用する集約ルート、「クロス集約」整合性チェックを実行するコマンド ハンドラー、さまざまな画面に適した方法で意図的に非正規化されたデータをクエリするクエリ ハンドラーなどを設計しました。

新しいデータを入力する場合、正確さと使いやすさの点で、代替ソフトウェアは非常にうまく機能します。その点では成功です。ただし、既存のデータには整合性の問題がたくさんあるため、既存のデータに関係する操作は、例外をスローして定期的に失敗します。これは通常、コンストラクターに渡されたデータが集計の不変条件に違反しているため、リポジトリから集計を読み取ることができないために発生します。

この「ルールを破る」レガシーデータをどのように処理すればよいでしょうか。古いソフトウェアは、ほとんど検証なしで実行されたため、この点で問題なく機能しました。この検証の欠如により、経験の浅いユーザーが無意味なデータを入力するのは簡単でした (また、経験豊富なユーザーは、その「特異性」を何年にもわたって理解しているため、非常に価値のあるものになりました)。

データ自体は非常に重要なため、破棄することはできません。私に何ができる?整合性の問題を整理してみましたが、これでうまくいく場合もあれば、ほぼ不可能な場合もあります (たとえば、元の開発者がデータを保存しないことにしたため、データがデータベースから完全に失われているなど)。データの整合性に関する問題の数は膨大です。

私に何ができる?

4

1 に答える 1

0

DDD でタグ付けされた質問の答えは、ほとんどの場合、ドメインの専門家に相談することです。彼らは物事がどのように機能することを望んでいますか。

また、あなたの質問が CQRS でタグ付けされていることにも気付きました。あなたは実際にCQRSを実装していますか?その場合、それはほとんど問題にならないはずです。

ドメイン モデルはアプリケーションのコマンド側に存在し、常に検証を実施します。読み取りスタックは、ダム ビューモデルのみを提供します。これは、読み取り時に、ドメイン モデルは関係なく、検証も適用されないことを意味します。ビューモデルに入力するために使用できるナンセンスを表示するだけです。ただし、書き込み検証がトリガーされます。また、すべての書き込みは、ビューモデルの完全な検証に従う必要があります。

現実に戻りましょう: 実装するバリデーションが実際に必要なバリデーションであることを十分に確認してください。たとえば、電話番号のような単純なものでも (多くの場合、3 桁のダッシュ 3 桁のダッシュ 4 桁として実装されます)。しかし、企業には 1800-CALLME のような特別な電話番号があり、数字だけでなく文字もあり、長さが異なる場合もあります (国によって規則が異なる場合もあります)。システムがこれを処理する必要がある場合は、電話番号に検証を適用できないことを意味します。

これは、実際の検証であると思われるものを実際にはまったく実装できない例にすぎません。これは、その 1 つの特別なケースを処理する必要があるためです。ここでルールが再びなります。ドメインの専門家がどのように処理したいかを話してください。ただし、検証によって実際のユーザーがシステムを使用することがほぼ不可能にならないように十分注意してください。それがあなたのプロジェクトを殺す最も速い方法だからです。

更新: DDD では、腐敗防止層という用語も耳にします。このレイヤーにより、受信データがドメイン モデルの期待に確実に応えます。これは好ましい方法かもしれませんが、ガベージ データを含むアイテムを無視できないと言う場合、これでは問題が解決しない可能性があります。

于 2016-05-14T13:30:00.253 に答える