5

私は最近いくつかの読書をしていて、デメテルの法則に遭遇しました。今、私が読​​んだもののいくつかは完全に理にかなっています。たとえば、紙の少年は顧客のポケットをライフル銃で撃ち、財布をつかんでお金を取り出すことは決してできないはずです。ウォレットは、ペーパーボーイではなく、顧客が管理する必要があるものです。

法則について私を悩ませているのは、おそらく私は全体を誤解しているだけかもしれませんが、機能/情報の階層と一緒にプロパティを文字列化することは非常に役立つ可能性があるということです。例:.NETsHTTPContextクラス。

次のようなコーディングはしません:

If DataTable.Columns.Count >= 0 Then
   DataTable.Columns(0).Caption = "Something"
End If

または

Dim strUserPlatform as string = HttpContext.Current.Request.Browser.Platform.ToString()

または

If NewTerm.StartDate >= NewTerm.AcademicYear.StartDate And 
   NewTerm.EndDate <= NewTerm.AcademicYear.EndDate Then
   ' Valid, subject to further tests.
Else
   ' Not valid.
End If

この法律を破っていますか?私は(おそらく誤って)OOPのポイントは、部分的には、優れた階層構造で関連するクラスへのアクセスを提供することだと思いました。

たとえば、ページクラスで使用できるユーティリティツールキットを参照して、メールの送信や便利な文字列メソッドのカプセル化などの反復的なタスクを回避するというアイデアが好きです。

Dim strUserInput As String = "London, Paris, New York"
For Each strSearchTerm In Tools.StringManipulation.GetListOfString(strUserInput, ",")
    Dim ThisItem As New SearchTerm
    ThisItem.Text = strSearchTerm 
Next

どんな明快さも素晴らしいでしょう...現時点では、法律が文字列のプロパティとメソッドを一緒に追放するように見える方法を調整することはできません...あまりにも多くの力を無視する必要があるのは私には奇妙に思えますか?ご想像のとおり、私はOOPにかなり慣れていないので、簡単に行ってください:)

4

3 に答える 3

6

デメテルの法則(「関数/メソッドのデメテルの法則」)が「ドットを1つだけ使用する」と言って削減したいのは、メソッドでは、提供された引数からそれほど多くのコンテキストを想定する必要がないということです。これにより、クラスの依存関係が高まり、テストが困難になります。

上記の例のすべてを使用できないという意味ではありませんが、メソッドに顧客を提供する代わりに、ウォレットにアクセスしてそこからお金を取得することをお勧めします。

function getPayment(Customer customer)
{
    Money payment = customer.leftpocket.getWallet().getPayment(100);
    ...
    // do stuff with the payment
}

代わりに、ペーパーボーイが必要とするものだけをメソッドに渡し、可能であればメソッドへの依存を減らします。

function getPayment(Money money)
{
    // do stuff with the payment
}

それからのあなたの利益はあなたが左のポケットに財布を持っていることを顧客に依存するのではなく、代わりに顧客があなたに与えるお金を処理するだけであるということです。しかし、それはあなたがあなたの個々のケースに基づいていなければならない決定です。依存関係が少ないため、テストが簡単になります。

于 2011-08-02T21:40:19.797 に答える
3

デメテルの法則を個々のクラスに適用することは、少し行き過ぎだと思います。より良いアプリケーションは、コード内のレイヤーに適用することだと思います。たとえば、ビジネスロジック層はHTTPコンテキストに関するものにアクセスする必要はなく、データアクセス層はプレゼンテーション層の何にもアクセスする必要はありません。

はい、通常は、大量のプロパティチェーンを実行する必要がないようにオブジェクトのインターフェイスを設計することをお勧めしますが、次のように指定したクラスに対してそれを実行しようDataTableとした場合の非常に複雑なインターフェイスを想像してみてください。HttpContext例。

于 2011-08-02T21:26:57.890 に答える
1

法律では、クラス内の情報にまったくアクセスできないようにする必要があるとは定められていませんが、情報を簡単に悪用できない方法でのみアクセスできるようにする必要があります。

Countたとえば、プロパティに何かを割り当てることで、データテーブルに列を追加しないようにすることができます。

DataTable.Columns.Count = 42;

代わりAddに、オブジェクトのメソッドを使用しColumnsて、列に必要なすべての情報がそこにあるように列を追加し、データテーブルにその列のデータを設定できるようにします。

于 2011-08-02T21:33:40.537 に答える