web-dev-qa-db-ja.com

インターフェースの対称性を説明するオブジェクト設計の原則

価値があると思ったコードについて誰かがコメントし、詳細を知るためにデザインパターンを調べたかったのですが、それに関連するデザイン原則を特定するのに苦労しています。

基本的に、私はエンコーダー/デコーダーオブジェクトを持っていました。一方向では、文字列を受け取り、その文字列に関する情報を含むオブジェクトを返します(たとえば、単一の整数を持つオブジェクトを考えます)。逆方向はその整数を取り、文字列を返します。

私に与えられた推奨事項は、1つの方向が文字列を取り、オブジェクトを返す場合、逆はその同じオブジェクトを取り、文字列を返すことです。

このインターフェースの対称性は(もしあれば)どの設計原則に関係しますか?

5
nanotek

この設計は、 逆関数 の数学的概念に対応しています。

2つの関数fとgが次のような場合:

_    f: S -> D  (f takes elements in set S and maps them to elements in set D) 

    g: D -> S  (g takes elements in set D and maps them to elements in set S) 

    and for any x in S,  g(f(x)) = x
_

その場合、gはfの逆関数と呼ばれます。

これをあなたの問題に置き換えれば:

_   encode:   object -> string 
   decode: string -> object
   decode(encode(text)) = text
_

そして、decode()encode()の逆であることに誰も異議を唱えません。

7
Christophe