web-dev-qa-db-ja.com

オブジェクト指向の不変条件を理解する

私はいくつかの建築様式について言及しています ここ そしてObject Oriented建築様式の下には、いくつかの不変条件が言及されています。

  • オブジェクトは、データ表現の整合性(たとえば、一部の不変条件)を維持する責任があります
  • データ表現は他のオブジェクトから隠されています

しかし、明確な説明は提供されていません。誰かが私がこれらを理解するのを手伝ってくれるなら、おそらくいくつかの例で本当に感謝します。

1
prime
  • オブジェクトは、データ表現の整合性(たとえば、一部の不変条件)を維持する責任があります。

不変条件は、常に真実であり続ける必要があるものです。たとえば、ある種の範囲を表し、下限(aと呼びましょう)と上限(b)を格納するオブジェクトがある場合、不変条件はa <= bという要件。
オブジェクトは、クライアントコード(それを使用するコード)がa > bになるように変更するのを防ぐことにより、この不変条件を維持します。たとえば、ユーザーがこれら2つの値を設定できるとします。 setterメソッド/プロパティでは、ユーザーが指定した値を受け入れる前に、a > bかどうかを確認し、例外がある場合は例外をスローするか、他のメカニズムを使用して不変条件を維持します。

  • データ表現は他のオブジェクトから隠されています

これはカプセル化として知られています。基本的に、他のオブジェクトがこのオブジェクトと対話するために使用できるパブリックメソッドの制限されたセット(パブリックインターフェイス)を提供します。これは一種の公的な「契約」のようなものです。あなたのオブジェクトは基本的に「私はこれらのサービスをこの方法でこの形式で提供します」と宣言します。ただし、オブジェクトが定義されたインターフェイスを確認する限り、内部状態はさまざまな方法で表現および操作できます(さまざまな実装を使用できます)。この内部状態は他のオブジェクトには「見えない」ので、これは良いことです。これにより、理論的には、システムの他の部分のコードに影響を与えることなく(したがって、変更する必要なく)、オブジェクトの実装の詳細を変更できます。

たとえば、いくつかのアイテムが含まれるNxNグリッドであるレベルがある単純なゲームについて考えてみます。

// (pseudocode)
class Grid 
{
    // represent items locations as an NxN 2D array of Booleans
    // (omitted)

    bool IsItemOn(x, y) 
    {
        // check the 2D Boolean array
    }
}

しかし、その後、何らかの理由で、内部表現を2Dブール配列から1Dブール配列に変更することにしました。

class Grid 
{
    // represented as 1D array of NxN Booleans
    // (omitted)

    bool IsItemOn(x, y) 
    {
        // calculate the index into the 1D array from x and y
        // check the value at the calculated index
    }
}

ただし、他の考慮事項があるため、後でスキームを変更して、アイテムの場所のリストを保存することにしました。レベルには3つの項目しかないので、NxN要素の配列を使用するのは無駄に思えました。このようにして、3つの2次元ポイントを保存するだけです。

class Grid 
{
    // just store item locations as (x, y)
    // (omitted)

    bool IsItemOn(x, y) 
    {
        // check if this location matches any of the ones stored
    }
}

いずれの場合も、外部から見えるのはIsItemOnメソッドのみであるため、内部表現のみが変更され、外部コードはそれを認識しません。他のコードを変更する必要はありません。すべてがそのまま機能します。

6