アルゴリズムのコナーセンス

アルゴリズムのコナーセンスは複数のコンポーネントが特定のアルゴリズムに関して一致しなければならないときに生じます。

データの転送

アルゴリズムのコナーセンスは2つのエンティティが同じ方法でデータを操作しなければならない場合によく現れます。たとえば、データが一つのサービスから別のサービスに送信されるとき、ある種のチェックサムアルゴリズムが一般的に使われます。送信側と受信側がどのアルゴリズムを使用するかに関して一致していなければなりません。送信側が使用するアルゴリズムが変更されれば、受信側も更新する必要があります。

データのバリデーションとエンコーディング

仮に、アカウントを作成するときに有効なメールアドレスの入力を要求するソフトウェアを考えてみましょう。このソフトウェアはメールアドレスの有効性を検証しますが、検証はいくちかの場所で行われることが想定できます。

  • データベースモデルオブジェクトの中で検証する
  • ウェブアプリの「コントローラ」クラスのメソッドで検証する
  • フロントエンド UI のフォームフィールドで検証する

これらのコードは別々の言語で書かれているかもしれませんし、ほぼ確実に互いに離れた場所にあります。これらのアルゴリズムが異なるとユーザーが登録できず、なぜ登録できないかフィードバックを得られないかもしれません。

アルゴリズムのコナーセンスに関してまた他の例はユニコード文字列がディスクに書き込まれる場合です。データ文字列をディスク上のキャッシュファイルに書き込む仮のソフトウェアを想像してみましょう。

def write_data_to_cache(data_string):
    with open('/path/to/cache', 'wb') as cache_file:
        cache_file.write(data_string.encode('utf8'))

キャッシュファイルからデータを読み取るために使う関数がこれに対応します。

def read_data_from_cache():
    with open('/path/to/cache', 'rb') as cache_file:
        return cache_file.read().decode('utf8')

ここでアルゴリズムのコナーセンスは2つの関数が同じエンコーディングを使わなければならないということです。もし write_data_to_cache 関数がディスクに書き込むデータを暗号化するよう変更すれば(保存するデータが潜在的にセンシティブな情報かもしれません)、read_data_from_cache 関数も更新する必要があります。

テストコード

テストコードはアルゴリズムのコナーセンスを含む場合がよくあります。次のような仮のテストを考えてみてください。

def test_user_fingerprint(self):
    user = User.new(name="Thomi Richards")
    actual = user.fingerprint()
    expected = hashlib.md5(user.name).hexdigest()
    self.assertEqual(expected, actual)

このテストでは User クラスの 'fingerprint' メソッドが期待通りに動作することをテストしているとします。しかし、これはアルゴリズムのコナーセンスを含んでいるため、テストの有効性が限定的です。User クラスがフィンガープリントの計算方法を変えるとこのテストは失敗します。