ユビキタス言語

Domain-driven design (DDD) は新しいテーマではありません(Eric Evans氏が10年以上前にコンセプトを定式化しました)。 しかし、今日に至るまで、このテーマに関する基本的な概念が、特に .NET コミュニティで関心を集めていることは不思議なことです。 さらに奇妙なことに、これらの同じコンセプトがどのように誤解されているかということです。

私たちが受ける印象は、DDD を勉強し始めた人は誰でも、Evans 本または Vernon 本の最初の数ページを読み、パターンを説明するページにすぐに飛びつくということです。

ユビキタス言語の重要性を理解するために、以下に挙げる「エンティティ」から始めましょう:

public class Employee{ public string Id { get; set; } public string Name { get; set; } public string Cpf { get; set; } public decimal Salary { get; set; }}

ここに、貧弱な実装の優れた例があります!

public class Employee{ public string Id { get; set; } public string Name { get; set; } public string Cpf { get; set; } public decimal Salary { get; set; }}

ユビキタス言語の重要性を理解するために、以下に挙げる「エンティティ」から始めましょう:

public class Employee{ public string Id { get; set; } public string Name { get; set; } public string Cpf { get; set; } public decimal Salary { get; set; }}

ここに貧弱な実装の優れた例があります。

私たちの日常業務では、この例を使用すると、このクラスには動作が欠けているという指摘を受けます (これは正しい!)。 しかし、そのような「振る舞い」が何であるかを尋ねると、人々は一般的な議論を(その考えを「理解」していない人々から)繰り返し、何が間違っているかを特定できないことがわかります!

最も頻繁な議論の 1 つは、プロパティ・セッターはプライベートであるべきだというものです。 その代わりに、検証を実装する “DefineXXX” メソッドを用意すべきです。 この考えは意味をなさない。なぜなら、セッターの目的はまさにプロパティの値を設定することであり、その中に検証ロジックを実装することに問題はないだろう。

例えば、設定しようとしている値が非NULLであるかどうかをチェックするプロパティを持つクラス実装を見つけることは、これらの同じプロパティがデフォルト値としてNULLを持っている場合でも、珍しいことではありません。 このロジックは何でしょうか。

Anamic クラスの別の例を参照してください。

public class Customer { public string Name { get; private set; } public string Email { get; private set; } public DateTime BirthDate { get; private set; } public Customer(Guid id, string name, string email, DateTime birthDate) { Id = id; Name = name; Email = email; BirthDate = birthDate; } }

上記のクラスでは、関数型実装の典型的な「レコード」を持っています。 しかし、オブジェクト指向言語では、これは実体ではありません。

このアイデアは、「実体」が動作を定義するさまざまな関数に概念的に広がっている純粋な関数型言語では意味をなすことさえありますが、C# ではまったく意味をなしません。

Employee クラスの 2 番目のバージョンを試してみましょう。 やはり、プロパティ値の変更を推進する動機は明らかです。 テスト記述の価値さえもより明確になることに注目してください。

Anyway, we still have problems. 私たちはメソッドを “RaiseSalary” と名付けましたが、これはドメインの専門家がこの操作を説明する方法とは異なります。 プロパティ値を変更する実際の理由を定義する唯一の方法は、これらの専門家と話すことです。

To think about…

ユビキタス言語の識別と実装は、クラス名やプロパティを定義するためだけではありません。 ユビキタス言語は、主に我々のエンティティの状態変化の動機を明示しなければならない。

ユビキタス言語を理解することは、標準を学ぶことよりもはるかに重要である。 ドメインに関する本当の知識がなければ、デザインパターンの価値は無効です。

最も重要なことを学ぶことをまず心配しましょう。 時間と労力をかけてドメインをよく理解し、そのユビキタス言語を綴りましょう。 そうすれば、DDDをより高度な技術的概念と関連付けることを考えることさえ意味を持つかもしれない。

コメントを残す

メールアドレスが公開されることはありません。