フリーゲーム・フリーソフトの開発過程を記録していく、TDtechnic公式ブログです。製品はカテゴリの「ダウンロード場」からダウンロードして頂けます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

お久しぶりです、Shiroです。

前回は実装部の隠蔽をテーマに、PImplイディオムについてグダグダ述べて終わりましたね。それでその改善案なんですが、実はあれを書き終えた直後から改良の嵐で、なかなかブログに起こすことができませんでした。申し訳ございません。

とりあえず今現在採用している方法を簡単に説明します。まず、基本的にPImplイディオムそのままです。やっぱり先人の知恵とはよく言ったもので、試行錯誤すると結局行き着く先は同じようです。ただ、やっぱりPImplそのままでは「クラス間の通信の隠蔽」ができないため、ちょっとアレンジします。それが「Contextイディオム」です。

もちろんこれは私が勝手に名付けた名前です。Contextは「文脈」ですが、具体的には「データの共有単位」を表します。つまり、複数のクラスが共有するデータがあるときに、それをコンテキストクラスとしてまとめるのです。そして、各クラスは、コンテキストクラスを通じて通信するのです。これをContextイディオムと名づけました。

なぜこのような回りくどいことをするのでしょうか。肝は、「非公開なpublicメンバを作りたい」というそもそもの目的と、「Impl構造体は不完全型である」ということです。これを組み合わせると…そう!不完全型にpublicメンバを書けば、「クライアントは利用できないが開発者は利用できる」がまさに実現できるのです。ですから、そのような不完全型(を管理するクラス)としてコンテキストクラスを作って、各クラスはコンテキストクラスを参照して生成するようにすれば、各クラス同士はコンテキスト内のデータを用いて自由に通信でき、一方クライアントの名前空間は一切汚しません。ああ、不完全型とはなんと素晴らしいのだろうか!

なお、コンテキストクラス自体も、PImplイディオムっぽく設計します。ただし、本来公開メソッドが入るところには、「そのコンテキストに依存するクラス」のfriend宣言を書きます。普段はカプセル化を破壊するものとして忌み嫌われているfriendですが、この状況においてはなんと過不足ない効果を発揮します。コンテキストクラスでpublicでないのはもともとImplの宣言とpImplの定義だけですから、friendによって公開されるのはこの2つだけなのです。そしてまさに、コンテキストクラスを参照するクラスにとって必要なのは、この2つなわけです。私、初めてfriendを正しく使えた気がします…。

ちなみに、PImplは中継メソッドを大量に手書きしなければならないのが嫌だと前回申しましたが、それはある意味解消されました。コンテキストクラスの導入により、クラス間の橋渡しをする処理が必要になるわけですが、その処理をするのに最適な場所が中継メソッドだからです。つまり、もはや中継メソッドは単に引数と返り値を受け渡しするものではなくて、クラス同士が互いを参照できるようにするという立派な中間管理職となったのです。これで、PImplを使いたくない理由が全てなくなったのです。

というわけで、今まで書いていたタスクシステム(メッセージシステムとタスクリストに分離しました)をContextイディオムで書き直しました。クライアントは(インライン関数などを除いて)開発者用のものには一切触れません。完璧です。もちろん、これは単なる自己満足ではなくて、翻訳単位間の依存性を軽減するというれっきとした効果を持っています。さすれば、コンパイル時間が短くなるだけでなく、クラス同士の結合も極限まで疎にすることができるのです。

しかも、このContextイディオムは、かなりの汎用性があるようで、大概のプログラムはこれで書けそうな勢いなのです。少なくとも前述のメッセージシステムとタスクリストは、ほぼ機械的に同じパターンのコーディングでできています。ちょっと思い上がりかもしれませんが、これは私の中での一つのデザインパターンとして、これからも使えるのではないかと期待しています。

…まあ、これまでだってその期待は何度も裏切られてますからね、今回だってわかりませんけどね(笑)では今回はこの辺で失礼します。
スポンサーサイト

[2016/02/25 00:30] | (コードネーム:モンジュラ)
|

こんばんは
Sva
お久しぶりです、Shiroさん。
以前もコメントで告知いたしましたが、ついに明日28日、もとい本日夜0時に『紛り物のダイヤ』新HPを公開いたします。
是非よろしければ遊びにいらしてください^^

こんにちは
Shiro (管理人)
> Sva さん

了解しました、遊びに行かせていただきます。

こんばんは
Sva
お久しぶりです。最近体調はいかがでしょうか?また悪化してなければよいのですが。
最近私はTOEICの勉強のため懐かしのターゲット1900を引っ張り出して読んでいるのですが、ターゲットといえばShiroさんというイメージがあって、ついコメントしてしまいました(笑)
ちなみにShiroさんはTOEIC受けましたか?

こんばんは
Shiro (管理人)
> Svaさん

ご無沙汰しております。最近は以前と比べて気胸の頻度も減っていて少し安心しているところです。

TOEICは受けましたが、結果は受け取りに行ってないのでまだわかりません。内容がビジネス寄り(らしい)せいか、非常にやりづらく感じました。まだTOEFLの方がやりやすかった気がします。

こんにちは
Sva
そうでしたか…。なんか、確かにやりづらそうですよね。
三年生になって履修も楽になるかと思いましたが教職組には関係なく、なかなか多忙な日々にまりそうですー><
お互い頑張りましょうね!

コメント:を閉じる▲
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。