ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

「PluginHostLib alpha」 反省会

この前、私は“プラグインをロードする汎用的ライブラリ”のアルファ版、「PluginHostLib」を作りました。

(知らねえよ…って人は記事「“プラグインをロードする汎用的ライブラリ” アルファ版の公開!」を参照)

このライブラリをテスト目的も兼ねて使ってみたのですが、いくつか改善すべき点、追加すべき機能を見つけました。

まぁ、三つほどですが。

そこで、反省会として記事に書きます。
ちょっと昔に、AsaBonさんがブログ記事で


> 小学校のときは「反省」という単語に対してマイナスなイメージしかありませんでした。

出典「1月終了 : AsaBonのコンピュータサイエンス」
http://blog.livedoor.jp/asabon_c_science/archives/22991116.html


と書いていました。
私も小学校のときはそうでしたね。

しかし、「反省」はただ自分を責めるわけではなく、問題点はどこかを考えて、より良くしていくための、自分のためのものだと思うのです。

私も、問題点を考えて「反省」します。
ではでは、書いていきましょう。

(久しぶりに「続きを読む」と分離しましたね。)





「PluginHostLib alpha」
ユーザーは怒るはず!三大ポイントぉぉぉ



インスタンス化するクラスを、デリゲートでフィルタがけできるようにしろ!

このプラグインでは、DLLファイルのアセンブリからクラスの属性情報を読み取り、
ある条件を満たすクラスだけをインスタンス化して呼び出し元に渡すようになっています。

しかしその条件とは、プラグインとして最低限必要な条件だけです。(IsPublicとか)

ただ、少し応用を利かせられるように、
「クラスが指定の属性クラスを適用しているか」
という条件を設定できるオーバーロードはあります。

まぁ、この属性のやつだけでも柔軟になるとは思います。
大抵はこれで事足りると思うのですが、

やはり、「クラス名に"AntiMicrosoft"が入っていたら読み込まないようにしたい」とか言う人がいたら対応できないのです。
(検閲みたい?)

そのため、引数にデリゲート型のものを一つ設けて、
(Type t) => !t.FullName.Contains("AntiMicrosoft")
なんて設定できるようにしたらいいと思いますね。

具体的には、Type型の引数が一つあって、bool値を返すデリゲート型を、このライブラリで定義。

引数のデリゲートにクラスの型情報となるTypeをセットして呼び出す。
trueが返ってきたらいいけど、falseならクラスはインスタンス化の条件を満たしていない。

…というふうに。

実装までここで考えちゃったので、実現性は高いはずです。


●クラスに設定した属性を取得できるようにしろ!

ここでいう属性とは、さっき述べた「クラスが指定の属性クラスを適用しているか」を調べる際の指定の属性です。

クラスがインスタンス化されたということは、この属性が適用されていたということですから、その属性が取得できてもいいんじゃないのということですね。

プラグインの中のクラスにも名前などの情報をもたせる必要がありますが、どうしてもクラスにNameプロパティなんかを作らないといけません。

しかし、クラスのフィールドやプロパティは仕組み上 必要な、機能に関するものだけにしたいところです。

つまり、プログラムと関係ない属性情報は、属性に追い払おうと。

しかし、このプラグインでは属性は条件判定のみに使われて、クラスへの属性を呼び出し元が取得できない状況です。

ですから、属性を取得できるようにすればいいわけですが、実装が厄介なのです。

戻り値の配列を構造体の配列にして、構造体に
・プラグインのインスタンス
・属性

の2つのメンバを持たせればいいですけども、

属性を指定しなかった場合、すなわちインスタンス化の条件に
「クラスが指定の属性クラスを適用しているか」を挙げなかったときにどうするかという問題が起きるわけです。

まぁ、属性を表す構造体のフィールドをnullにすればいいじゃないかという声もあるでしょうが、もっといい方法は無いかと。

これについては、メソッドにも型引数を設けるとかで色々考えています。


また、属性を指定せずにやるオーバーロードもあります。
(引数に“指定の属性”というものがそもそも無いやつ)

この場合、戻り値の構造体の属性を表すフィールドが常にnullになりますが、なんかそれって、おかしいじゃないですか。

ならば、戻り値の型を、このオーバーロードでは(普通の配列に)変えるというのも考えられますが、
同じ名前のメソッドなのに、戻り値の型が違うのはちょっと、ためらってしまいますね。

いっそのことメソッドの名前を変えるかぁ~。

あと、先ほど言っていたデリゲートで、属性にアクセスさせるという手もありますね。

まぁ、あのデリゲートは条件を記述するためのものなので、ふさわしくないですが…。

実装に悩むところです。


●読み込みに失敗したクラスを取得できるようにしろ!


これは、複数のDLLファイルから一気に読み込むときのはなしですが、
もしかすると、DLLファイルの中に、「指定パスにファイルがなかった」とか「中身がテキストファイルだった」とか「ネイティブアセンブリだった」とか、読み込みができないものがあるかも知れません。

ただ、それについては大丈夫なのです。

参照渡し引数に、読み込みに失敗したDLLファイルのパスを配列で設定するようになっています。

そして、「DLLファイルの形式自体はよかったんだけど、インスタンス化の条件に合うクラスが一つもなくて、なんの役にもたっていないDLLファイルだよ」というクラスも、読み込みに失敗したと見なされます。


問題は、1つ以上のクラスがインスタンス化されたけど、その他にインスタンス化されるべきなのに、インスタンス化されなかったクラスがある場合です。

“インスタンス化されるべきなのに、インスタンス化されなかったクラス”というのは、
インスタンス化の条件は満たしているのに、インスタンス作成時になんらかのエラーが発生して、インスタンス化できなかったクラスのことです。

こういうクラスは、読み込まれずに捨てられますが、呼び出し元に報告されません。

DLLファイルが1つ以上のクラスは読み込めているからです。
こういうのはダメですね。

読み込みに失敗した物を、アセンブリ単位の物ではなく、クラス単位の物として扱うべきです。

まぁただ、そうしたところでメリットが生じるかというと疑問です…。

「面倒くさい」で片付けてしまうかも知れません。




以上です。

この三点に共通していることは、自由度の向上ですね。
色んなケースに対応できるようにするためのものです。

いやぁ、実装は大変なんですよね~。


さてみなさん、正式版にこれらの機能の搭載を期待されたかも知れませんが、搭載しません

正式版は、操作マニュアルを作る等の、付属ファイルいじりしかしないつもりです。
ご了承ください。


ならばみんなで待とう、Version 2.0

tag:

コメント

プロコンの件

いつであればプロコンを開催しても問題ないですか?

  • 2013/08/08(木) 20:56:12 |
  • URL |
  • div9851 #-
  • [ 編集 ]

Re: プロコンの件

いつやるか、今でし…なんでもないです。
明日はもしかしたら無理かもしれませんが、あさってならOKです。
時間帯は0:00 - 23:59(つまり1日中)がありがたいです。

あと、こういう業務連絡系はメールのほうにお願いします。

コメントありがとうございます。

相互リンクとは、互いにブログのリンクを張ることでいいのですか?
もちろん歓迎です。

余談ですが、Perlの他にもHTML CSS も扱っています。

  • 2013/08/15(木) 20:59:48 |
  • URL |
  • funcHM #-
  • [ 編集 ]

Re: コメントありがとうございます。

ありがとうございます!

互いのリンクを貼るだけでOKですね。
それでまぁ、互いの記事にコメントしあったり…と。

ほんの少しの期間、そちらの新着記事を拝見して、
うちのリンク一覧のほうでの説明文を考えるので、
こちらにリンクを貼るまで少し時間がかかります。ご理解お願いします。

1週間はかかりませんので。


HTML CSSですか。FC2ですからブログの独自デザインとか出来ますね。
私も少しだけ、このブログのソースをいじっていますが、汚いHTMLでして…。
CSSも無視してます。スタイルはCSSに書くほうがいいですよね。


私がすでに相互リンクを貼っている方々は、みんな中学生や高校生でプログラミングをやっています。

私よりもウルトラ級にすごい方がたくさんいるので、ぜひご覧になってみてはいかがでしょうか~。

コメントの投稿

トラックバック

トラックバック URL
http://cyberboy6.blog.fc2.com/tb.php/291-5a151ce5
この記事にトラックバックする(FC2ブログユーザー)

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。