2010-11-09-01-文字コードの話 - 11 - project-enigma

2010-11-09-01-文字コードの話 - 11

>> Site top >> weblog >> 月別アーカイブ >> 2010年11月のlog >> 2010-11-09-01-文字コードの話 - 11

最終更新日付:2013/12/31 07:35:53


文字コードの話 - 11

2010 年 11 月 09 日

さて今回は、前回持ち上がった「別の問題」について。

前々回、ASCII や UTF8 といった各種のエンコーディングクラスに対して Iterator を用意し、stateful なエンコーディングで問題になる振舞いをそこに移動するという話をした。そして前回、リファレンスを返せない問題に関する解決法を説明した(くどいようだが自分で考え出したわけではない)。

で、前回持ち上がった別の問題とは何か。まぁ問題というほど問題ではないが、順を追って説明しよう。

まず、当初のデザインではイテレータのインスタンスは単体で作成可能だった。以下のように。

Encoding::UTF8::ConstIterator  itr = "utf-8 の文字列";

しかし、これまでのデザイン上の原則では、全てのエンコーディングクラスは名前の変更だけで入れ替え可能でなければならなかった。例外は Dynamic::GetEncoding( ) だけだ。ということは、以下が可能でなければならない。

Encoding::Dynamic::ConstIterator  itr = "utf-8 の文字列";

さぁ困ってしまった。エンコーディングの種類を与える必要があるがそれができない。仮にパラメータを増やしたとしても、今度は Dynamic 以外のイテレータで不自然になる。

結局、イテレータ単体でのコンストラクションを諦め、エンコーディングクラスのインスタンスに作成させることにした。

const char* p = "utf-8 の文字列";
Encoding::UTF8::ConstIterator  itr = utf8.GetConstIterator( p );

少し不便になるが、Dynamic クラスの場合でも以下のようになる。

const Encoding::Dynamic& enc = Encoding::Dynamic::GetEncoding( Encoding::TYPE_UTF8 );
Encoding::Dynamic::ConstIterator  itr = enc.GetConstIterator( p );

しかし、デザイン上の悩みはまだ残っている。Dynamic::Iterator に多態的な振舞いをさせる方法がどうにもすっきりしないのだ。引っ張り過ぎかもしれないが、続きは次回にしよう。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : 開発

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.