OS X用GigE Visionカメラドライバ - その39 [OS X用GigE Vision]
GigEカメラドライバの仕切り直し。実はレジスタのハードコード版が動いてから、GenApiを実装しようとして、途中まで書いては複雑すぎてわからなくなって投げる、ということを何回か繰り返している。
コードの大きさや複雑さの許容できる閾値が、歳をとるにつれて明らかに下がっている。このままでは何か対策しないと小さなユーティリティ程度のものさえ作れなくなってしまいそうで、不安を感じる。
今回その対策のひとつとして、実装前に見通し良くする手間をかけることに決めた。作業量はそれなりに増えるけど、これでダメならほんとにダメかも....
スキーマファイルは例えば、普通のノードが持っているエレメントを定義した部分は
みたいな感じで、ざっと見るにはまったく適さないし、概観しやすいようなフォーマットにしてくれるビューアみたいなのも見つからないので、この場限りのダイアグラムを作ることにする。非常に面倒だけど、それをやらないと僕の頭の中に収まりきれないのは明らかなので、しょうがない。
スキーマファイルは最新のものを使う。GenApiは3.0だけどスキーマファイルのバージョンはGenApi 1.1のままらしい。
ノードは四角で囲った大きな文字で書く。エレメントは四角で囲った小さな文字で、アトリビュートは楕円で囲った小さな文字で書くことにする。
エレメントはノードの中の出現のしかたに従って枠で分類する、ということにする。
この調子であとも続ける。
コードの大きさや複雑さの許容できる閾値が、歳をとるにつれて明らかに下がっている。このままでは何か対策しないと小さなユーティリティ程度のものさえ作れなくなってしまいそうで、不安を感じる。
今回その対策のひとつとして、実装前に見通し良くする手間をかけることに決めた。作業量はそれなりに増えるけど、これでダメならほんとにダメかも....
10.4 エレメントオブジェクト設計のためのノードの整理
ノードの持っている機能をエレメントに分担させるとすると単純にGenApiのスキーマファイルのとおりにクラス設計をしない、という方針だということになる。そのためにもう一度スキーマファイルからノードの定義を全部拾ってどの部分を複合エレメントとしてまとめるか、というのを見直すことにする。スキーマファイルは例えば、普通のノードが持っているエレメントを定義した部分は
<xs:group name="NodeElementTemplate"> <xs:annotation> <xs:documentation xml:lang="en"> Lists the elements which are common to (nearly) all nodes. </xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="Extension" type="ExtensionType" minOccurs="0"> </xs:element> <xs:element name="ToolTip" type="nonEmptyString_t" minOccurs="0"> </xs:element> <xs:element name="Description" type="nonEmptyString_t" minOccurs="0"> </xs:element> <xs:element name="DisplayName" type="nonEmptyString_t" minOccurs="0"> </xs:element> <xs:element default="Beginner" name="Visibility" type="Visibility_t" minOccurs="0"> </xs:element> <xs:element name="DocuURL" type="DocURL_t" minOccurs="0"> </xs:element> <xs:element default="No" name="IsDeprecated" type="YesNo_t" minOccurs="0"> </xs:element> <xs:element name="EventID" type="Hex_t" minOccurs="0"></xs:element> <xs:element name="pIsImplemented" type="CName_t" minOccurs="0"> </xs:element> <xs:element name="pIsAvailable" type="CName_t" minOccurs="0"> </xs:element> <xs:element name="pIsLocked" type="CName_t" minOccurs="0"> </xs:element> <xs:element name="pBlockPolling" type="CName_t" minOccurs="0"> </xs:element> <xs:element default="RW" name="ImposedAccessMode" type="Access_t" minOccurs="0"> </xs:element> <xs:element minOccurs="0" maxOccurs="unbounded" name="pError" type="CName_t"> </xs:element> <xs:element name="pAlias" type="CName_t" minOccurs="0"> </xs:element> <xs:element name="pCastAlias" type="CName_t" minOccurs="0"> </xs:element> </xs:sequence> </xs:group>
スキーマファイルは最新のものを使う。GenApiは3.0だけどスキーマファイルのバージョンはGenApi 1.1のままらしい。
10.4.1 ダアグラムの書き方
あまりめんどくさいことはしたくないけど、ぱっと見てわかるように書きたいので図-7みたいな書き方にする。ノードは四角で囲った大きな文字で書く。エレメントは四角で囲った小さな文字で、アトリビュートは楕円で囲った小さな文字で書くことにする。
エレメントはノードの中の出現のしかたに従って枠で分類する、ということにする。
10.4.2 NodeElementTemplate
まず、NodeElementTemplateのダイアグラムを図-8に示す。これはノードの抽象ベースクラスという感じになっている。NodeElementTemplateはノードではなく、ノードが持つべき最小限のエレメントの集合を示しているということらしい。 pErrorエレメント以外は0個または1個だけ出現するということを表している。pErrorエレメントは0個以上何回現れてもいい。アトリビュートはNameアトリビュートが必須で、それ以外はなくてもいい、ということを表す。この調子であとも続ける。
10.4.3 Groupノード
Groupノードのダイアグラムを図-9に示す。 GroupNodeは特殊なノードで、NodeElementTemplateのサブクラスの格好になっていなくて、単にノードを子要素として列挙しているだけである。Commentアトリビュートが必須になっている。2016-04-16 21:50
nice!(0)
コメント(0)
トラックバック(0)
コメント 0