ICEの属性配置
6262 ワード
http://www.cppprog.com/2009/0526/119.htmlから回転
前編記事では、Iceの初期化関数initializeの入力パラメータは、主関数の入力パラメータ、すなわちコマンドラインパラメータであることに注目しているかもしれません.
Iceの初期化関数はコマンドラインパラメータを取得した後、Ice特有のパラメータを引き出し、分析後の配置をIceの属性表に保存します.
コマンドの挙動を仮定します.
MyProgg.exe--myoption -x a -y opt file
抜き取った二つのパラメータは属性表に保存されます.属性表の種類はIce:Proptiesで、その一般的な方法は以下の通りです.
std:sting get Property(const) std::string& プロ std:string get PropertyWithDefault(const) std::string& プロ、 コンサート std::string&); Ice:Int get PropertyAspInt(const) std::string& プロ Ice:Int get Property AssInt WithDefault(const) std::string& プロ、 Ice::Int); プロの属性の値を取得します.
Ice:StringSeq get PropertyAssList(const) ::std::string& プロ Ice:StringSeq get PropertyAstWithDefault(const) ::std::string& プロ、 コンサート ::Ice::String Seq;; prop属性の値を取得し、コンマで区切られた値のセットを返します.ここのIce:StringSeqはstd:vector<std:sting>です.例えば、コマンドラインパラメータがあります.--MyProp.Test=abc、def、aa、sde、sは戻ります.
Ice:PropertyDict get Properties ForProfix ::std::string& prefix)prefixプレフィックスを含むすべての属性を返します.PropertyDictはstdです.
void set Property(const) ::std::string& プロ、 コンサート ::std::string&);プロのプロパティの値を設定します.
Ice:StringSeq get Command Linese Options();プロパティテーブルのすべてのデータを文字列リストに変換します.
Ice:StringSeq parse CommundLine Options() コンサート std::string& prefix、 コンサート Ice:String Seq& アークス コマンドラインのパラメータを解析し、すべてのプレフィックスのパラメータを抽出し、残りのコマンドラインのパラメータを返します.main関数はargcとargvで入力されているので、Ice:StringSeq ToSteringSeq(int,char*)とvoid string SeqToArgs(const String Seq&int&char*)関数はSterigSeqとargvの間で変換されます.
Ice:StringSeq parseIceCommundLine Options(const) Ice::String Seq;;Ice独自のコマンドラインパラメータを分析します.
void ロード std::string& file;fileで指定されたプロファイルを読み込み、設定ファイルについては後述する.
Ice:ProptiesPtr clone()属性テーブルのコピーを返します.
属性表を得るための一般的な2つの方法です.
Ice:ProptiesPtr createProperties();新しい属性テーブルを作成します.
Ice:ProptiesPtr Ice::Communicator:get Propties();現在使用されている属性表をコネクタから取得します.
属性表を使って私達のプログラムを改善します.
例えば、前のクライアントの例:
クラス MyApp: public Ice::Application{} public: virtual 要点 run(int char*[] { }
Ice:Communication Ptr ic = communicator(); Ice:Object Prx ベース = ic->stingToProxy("SimplePrinter:default" -p 10000"); PrinterPrx printer = PrinterPrx:checkedCast(base); if(!printer) throw 「Invalid Proxy!「 」
printer->printesing("Hello" ワールド!"); return 0; } ;;
ic->stingToProxy(「SimplePrinter:default-p 10000」)は、エージェント名、プロトコル、ポートおよびホスト名をプログラムに固定しています.コマンドラインパラメータまたはプロファイルによって指定されるなど、より大きな柔軟性が必要です.上記のProptiesインターフェースは私達を助けてくれます.
クラス MyApp: public Ice::Application{} public: virtual 要点 run(int char*[] { }
Ice:Communication Ptr ic = communicator(); Ice:ProptiesPtr プロ = ic->get Propties(); ストリングス s = prop->get PropertyWithDefault()
「Ice.Printer」、「SimplePrinter:default」 -p 10000"); Ice:Object Prx ベース = ic->ストリングスToProxy(s); PrinterPrx printer = PrinterPrx:checkedCast(base); if(!printer) throw 「Invalid Proxy!「 」
printer->printesing("Hello" ワールド!"); return 0; } ;;
ここでは、プロキシ文字列は、属性テーブル(Ice:Propties、Ice:ProptiesPtrはIce:Proptiesのスマートポインタ)から得られます.コマンドラインパラメータを変更すれば、この文字列を変更できます.
また、上の方:
Ice:ProptiesPtr プロ = ic->get Propties(); string s = prop->get PropertyWithDefault( ) 「Ice.Printer」、「SimplePrinter:default」 -p 10000"); Ice:Object Prx ベース = ic->ストリングスToProxy(s);
三つの命令は一つの命令で代替できます.
Ice:Object Prx ベース = ic->propertyToProxy(「Ice.Printer」);
いくつかの行を多く書くのは時々役に立ちます.私達はそれを利用して私達がカスタマイズしたパラメータを読み取ることができます.
上の命令行で私達が取ったのは「Ice.Printer」属性です.そのプレフィックスが「Ice.」であることに注意してください.もし他のプレフィックスに変更したら、「MyProp.」のようにIce初期化時にはIce専用パラメータとは考えられません.
いくつかの属性をカスタマイズして「私用」に使いたいなら、「Ice.」プレフィクスを使うのは不合理です.ここで、属性セットのパースCommundLine Options方法を使ってプレフィクスを指定するパラメータを解析できます.
クラス MyApp: public Ice::Application{} public: virtual 要点 run(int argc char*argv[] { }
Ice:Communication Ptr ic = communicator(); Ice:ProptiesPtr プロ = Ice::createProperties(); prop->parseCommundLine Options(「MyProp」) Ice:args ToSterigSeq(argc、argv); ストリングス s = prop->get PropertyWithDefault( ) 「MyProp.Printer」、「SimplePrinter:default」 -p 10000"); Ice:Object Prx ベース = ic->ストリングスToProxy(s); PrinterPrx printer = PrinterPrx:checkedCast(base); if(!printer) throw 「Invalid Proxy!「」 printer->printesing("Hello" ワールド!"); return 0; } >;
今、プログラムはMyProp.Printerのプロパティを解析できます.
設定ファイル
少数の属性に対しては、コマンドラインパラメータを使うのは確かですが、ユーザー定義の属性が増えれば、コマンドラインパラメータを使うのは不適切です.
Iceは私達がすべての属性パラメータを一つの文書ファイルに書くことを許可します.各パラメータの一行、例えば、次のようなものがあります.
あるいはIce::Propties::parseIceCommundLine Options方法を使ってテキストの内容を解析します.
前編記事では、Iceの初期化関数initializeの入力パラメータは、主関数の入力パラメータ、すなわちコマンドラインパラメータであることに注目しているかもしれません.
Iceの初期化関数はコマンドラインパラメータを取得した後、Ice特有のパラメータを引き出し、分析後の配置をIceの属性表に保存します.
コマンドの挙動を仮定します.
MyProg.exe --myoption --Ice.Config=config\
-x a --Ice.Trace.Network=3 -y opt file
その中でMyProg.exeはIceで作成したプログラムです.Ice:initializeが戻ると、Iceの二つの専用パラメータが引かれます.argcは元の9から7になります.argvは次の通りです.MyProgg.exe
抜き取った二つのパラメータは属性表に保存されます.属性表の種類はIce:Proptiesで、その一般的な方法は以下の通りです.
std:sting get Property(const) std::string& プロ
Ice:StringSeq get PropertyAssList(const) ::std::string& プロ
abc
def
aaa
sde
s
Ice:PropertyDict get Properties ForProfix ::std::string& prefix)prefixプレフィックスを含むすべての属性を返します.PropertyDictはstdです.
void set Property(const) ::std::string& プロ、 コンサート ::std::string&);プロのプロパティの値を設定します.
Ice:StringSeq get Command Linese Options();プロパティテーブルのすべてのデータを文字列リストに変換します.
Ice:StringSeq parse CommundLine Options()
Ice:StringSeq parseIceCommundLine Options(const) Ice::String Seq;;Ice独自のコマンドラインパラメータを分析します.
void ロード std::string& file;fileで指定されたプロファイルを読み込み、設定ファイルについては後述する.
Ice:ProptiesPtr clone()属性テーブルのコピーを返します.
属性表を得るための一般的な2つの方法です.
Ice:ProptiesPtr createProperties();新しい属性テーブルを作成します.
Ice:ProptiesPtr Ice::Communicator:get Propties();現在使用されている属性表をコネクタから取得します.
属性表を使って私達のプログラムを改善します.
例えば、前のクライアントの例:
クラス MyApp: public Ice::Application{}
Ice:Communication Ptr ic = communicator();
printer->printesing("Hello" ワールド!");
ic->stingToProxy(「SimplePrinter:default-p 10000」)は、エージェント名、プロトコル、ポートおよびホスト名をプログラムに固定しています.コマンドラインパラメータまたはプロファイルによって指定されるなど、より大きな柔軟性が必要です.上記のProptiesインターフェースは私達を助けてくれます.
クラス MyApp: public Ice::Application{}
Ice:Communication Ptr ic = communicator();
「Ice.Printer」、「SimplePrinter:default」 -p 10000");
printer->printesing("Hello" ワールド!");
ここでは、プロキシ文字列は、属性テーブル(Ice:Propties、Ice:ProptiesPtrはIce:Proptiesのスマートポインタ)から得られます.コマンドラインパラメータを変更すれば、この文字列を変更できます.
MyProg.exe --Ice.Printer="SimplePrinter:tcp -p 10000"
MyProg.exe --Ice.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5"
...
命令行にIce.Printerが指定されていない場合は、デフォルトの「SimplePrinter:default-p 10000」を使用すると推測されているかもしれません.また、上の方:
Ice:ProptiesPtr プロ = ic->get Propties();
三つの命令は一つの命令で代替できます.
Ice:Object Prx ベース = ic->propertyToProxy(「Ice.Printer」);
いくつかの行を多く書くのは時々役に立ちます.私達はそれを利用して私達がカスタマイズしたパラメータを読み取ることができます.
上の命令行で私達が取ったのは「Ice.Printer」属性です.そのプレフィックスが「Ice.」であることに注意してください.もし他のプレフィックスに変更したら、「MyProp.」のようにIce初期化時にはIce専用パラメータとは考えられません.
いくつかの属性をカスタマイズして「私用」に使いたいなら、「Ice.」プレフィクスを使うのは不合理です.ここで、属性セットのパースCommundLine Options方法を使ってプレフィクスを指定するパラメータを解析できます.
クラス MyApp: public Ice::Application{}
Ice:Communication Ptr ic = communicator();
今、プログラムはMyProp.Printerのプロパティを解析できます.
設定ファイル
少数の属性に対しては、コマンドラインパラメータを使うのは確かですが、ユーザー定義の属性が増えれば、コマンドラインパラメータを使うのは不適切です.
Iceは私達がすべての属性パラメータを一つの文書ファイルに書くことを許可します.各パラメータの一行、例えば、次のようなものがあります.
MyProg.exe \
--MyProp.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5" \
--MyProp.Test="abc,def,aaa,sde,s"
テキストファイルを作成できます.MyProp.Printer="SimplePrinter:tcp -p 1234 -h 192.168.1.5"
MyProp.Test="abc,def,aaa,sde,s"
上のコマンドラインのパラメータを変更します.MyProg.exe --Ice.Config=
またはIce:Propties::load方法でファイルを読み込み、あるいはIce::Propties::parseIceCommundLine Options方法を使ってテキストの内容を解析します.