top page > computer > web > rfc > x_690 > 8_1_common > coding > existential > sep_modules.html
更新日:
文責: 重城良国

X.690: ASN.1のBER方式の共通部分の存在型を利用したコーディング: モジュールに分ける

(工事中 10%)

動機

現在のモジュール内での層

現在のAsnableモジュール内ですでにある程度の層構造がある。decodeTagやdecodeLength、IntegerとByteStringとの変換関数等は、より下の層と考えられる。そして、class Asnableやinstance Asnableはより上の層にすることができる。つまり、すでに自然な切れ目があるということだ。

今後大きくなる

orphan instance問題

maoeさんのブログ: Orphan Instances参照。

orphan instanceという問題児がいる。これはクラスが定義されている場所でも、データ型が定義されている場所でもない場所にあるインスタンス宣言であり、予期しない問題を引き起こす。

orphan instnace問題の予防

orphan instance問題を予防するためには、よく使われる型については、クラス宣言をしたモジュールでインスタンス宣言してやる必要がある。このため、クラス宣言をしたモジュールはある程度肥大化する宿命にある。

Asnableクラス

AsnableモジュールではAsnableクラスを宣言している。よって、このモジュール内によく使われる型に対するインスタンス宣言をつめ込む必要がある。

だからモジュールを分割する

上述の2つの理由、「自然な切れ目がある」「今後大きくなる」ことより、モジュールを2つに分けることが適当と判断した。

問題勃発

前置き

コーディングは紆余曲折ある。一直線に進むことなんてない。チュートリアルが一直線に進むのは、教師が自分のなかで紆余曲折した結果だ。ASN.1のデコード・エンコードなんて簡単だと思ったので、チュートリアル的に開発してやろうと思ったのだが、僕の好みを満足させようとするとなかなか複雑になる。まあ、紆余曲折のまま、このページは進めて、後から「そのまま残す」か「一直線」に直すかを決めることにしよう。

モジュールを分けたい

BER形式の部分集合としてDER形式とCER形式とがある。なのでBerモジュールをimportするDerモジュールとCerモジュールとを作りたい。

デコードとエンコードに対象性を持たせたい

BER形式でデコードした結果をDER形式でエンコードしたい。これらは相互に可能であって欲しい。しかし、今の設計でそれをするとBerモジュール内にDerモジュールに依存する部分が出てきてしまう。

上記2つの矛盾

BerモジュールのうえにDer, Cerモジュールを乗せたいが、BerモジュールがDerモジュールに依存する部分が出てきてしまう。

問題の一般化

符号Aの部分集合としての符合Bがある。符号Aをデコードしてデータ型Tを得られる。またデータ型Tをエンコードして符号Bを得られる。このとき、符合Aのデコードはデータ型Tに依存する。データ型Tは符合Bに存在する。しかし符号Aは符号Bに依存しないほうが良い。妥協なしでこれを解決できるか。あるいは妥協するとすれば何を妥協するべきか。

うまくいかない解1

符合Aをデコードして型Taを作る。型Taを型Tbに変換したうえで符号Bにエンコードする。そういう方法が考えられる。しかし、存在型を利用しているので、型Taを型Tbに変換しようとしても、型Ta自体に符号Bにエンコード可能という性質が必要になる。

解2

型T自体にエンコード規則を含めてしまうという方法も考えられる。すると、流れとしては以下のようになる。符合Aを型Tにデコードする。この時点で型Tは空のエンコード規則を持っている。型Tに符号Bのエンコード規則を与えてやる。型Tを符号Bにエンコードする。このやりかたならうまくいくような気がする。つまりたとえばBool等のエンコードのやりかたにバリエーションのないものでは、その型に共通のエンコードルールを用意し、SEQUENCE等のエンコードのやりかたにバリエーションのあるものには、値ごとに別々のエンコードルールを用意してやるというやりかた。そして、たとえばDerモジュールは型Tの値に対してエンコード規則を再帰的に与えてやるようなコードを作る。つまりBerクラスにはgetEncodeRuleとsetEncodeRuleが必要になるだろう。

解2のやりかたで、ひとつやってみることにしよう。

「ルールをクラスに」へもどる 「存在型を利用」トップへ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics