テキストエディタ実装技術 ■ テキストエディタ  テキストエディタは、簡単に言うと、プレーンなテキスト情報を保持し、ユーザの指示により内容を表示、修正するプログラムである(図1参照)。 ## column     図1 テキストエディタ   エディタ ┏━━━━━━┓ ┃┌────┐┃  表示  ┃│テキスト│┃ ───→ ユーザ ┃│ データ │┃ ←─── ┃└────┘┃ 編集操作 ┗━━━━━━┛ ## endcolumn  図1のような構造はオブジェクト指向な設計と親和性が高い。テキストデータをメンバ変数に持ち、データを参照、変数するメソッドを持つオブジェクトと、ユーザの指示を解釈し、適切なメソッドを呼び出すオブジェクトを導入するとよい。前者をエディットエンジン、後者をUIオブジェクトと呼ぶ(図2参照)。 ## column           図2 エディタのクラス図 ┏━━━━━━━━━┓     ┏━━━━━━━━━━┓ ┃エディットエンジン┃     ┃ユーザインタフェース┃ ┠─────────┨     ┠──────────┨ 表示 ┃テキストデータ  ┃←───→┃          ┃────→ ユーザ ┠─────────┨     ┠──────────┨←──── ┃ 参照メソッド  ┃     ┃描画メソッド    ┃編集操作 ┃ 編集メソッド  ┃     ┃イベントハンドラ  ┃ ┗━━━━━━━━━┛     ┗━━━━━━━━━━┛ ## endcolumn  ユーザの編集操作とはキーの押下やマウス、メニュー選択である。オブジェクト指向的なOSでそのような操作を行うと、イベントが発生し、プログラム内のイベントハンドラが呼ばれ、必要な処理が行われる。したがって、この部分のプログラムはOSに大きく依存することになる。一方エディットエンジンは純粋にテキストデータの操作を行うだけなので、(文字コードを何にするかという問題を除けば、)OSに依存しないので、普遍性が高いと言える。  図2の構造はMFCのドキュメント・ビューアーキテクチァーと本質的に同じである。MFCではデータを保持するクラス CDocument と、ユーザインタフェースのためのクラス CView があり、それぞれの派生クラスを定義・実装することがプログラミングとなる。したがって、エディットエンジンの機能を CDocument 派生クラスに実装すればいいのだが、機能を直接実装すると移植性が低下するので、CDocument 派生クラスがエディットエンジンを所有するのがよいと考える。 ## column           図3 MFC でのクラス図 ┏━━━━━━━━━┓     ┏━━━━━━━━━━┓ ┃  CDocument   ┃     ┃    CView    ┃ ┠─────────┨     ┠──────────┨ 表示 ┃    ●─┐  ┃←───→┃          ┃────→ ユーザ ┠──────┼──┨     ┠──────────┨←──── ┃      │  ┃     ┃描画メソッド    ┃編集操作 ┃      │  ┃     ┃イベントハンドラ  ┃ ┗━━━━━━┿━━┛     ┗━━━━━━━━━━┛        │        │        ↓ ┏━━━━━━━━━┓ ┃エディットエンジン┃ ┠─────────┨ ┃ テキストデータ ┃ ┠─────────┨ ┃  参照メソッド  ┃ ┃  編集メソッド  ┃ ┗━━━━━━━━━┛ ## endcolumn