2009-06-02 8 views
3

私が持っている:このAPIと連携既存のオブジェクト指向APIからコンソールアプリケーションを作成するにはどうすればよいですか?

  • 既存のオブジェクト指向のネイティブコードAPI(非GUI)
  • GUIアプリケーション

目標: ユーザーをすることができます追加のコンソールアプリケーションを作成するにはコマンドを入力してワークフローの一部(上記のGUIアプリケーションのものに類似)を実行します。このアプリは「ステートフル」でなければなりません。使用可能なコマンドとその結果は、以前に発行されたコマンドに依存します。

問題: 私は "ホイールを再発明"したくありません。アプリの構築と「ボキャブラリ」の定義の両方に既存のパターンがありますか?現在のところ、最良の選択肢は、ヘルパーとコマンドパーサのセットを「ゼロから」書くことです。

P.S.私のAPIが.Netにあれば、PowerShellの方向性を調べることができますが、APIは大きく、.Netにラッピングするのは非常に時間がかかることです。

答えて

1

コマンドラインを使い始めるには、まずホイールを改造しないでください。コマンドを解析するには多くのオプションがあります。

Javaでは、必要なものすべてを提供するCommons CLIがあります。 .NET CLI portもあります。

InfiniteRedには、Rubyでこれを行う方法のa good writeupがあります。

実装が進む限り、正しいアイデアがあります。しかし、ここでも車輪を再発明しないでください。 Commandオブジェクトの作業をカプセル化し、Chain of Responsibilityパターンを使用します。 Commons Chainはうまくいきます。 .NET Chain portもあります。

これらのフレームワークを使用することができない場合は、その実装方法を見てください。また、これらのオプションのいくつかを使って相互運用するのに問題がある場合、Rubyは実際にこの種の処理を行うための優れたスイス軍ナイフです。それは比較的移植性があり、コードは本当にきれいになり、保守しやすくなります。

更新:JCommanderも面白そうです。

+0

Chain of Responsibilityは自宅にかなり近いです。ありがとう! –

+0

それはおそらくあなたが必要とするものだと思います。チェーンの実行コンテキストに必要なすべての状態をオフにするだけです。 – cwash

1

COMインターフェイスはありますか? PowerShellは、COM、WMI、または.NETをシームレスにスクリプト化できます。純粋なスクリプトを使用してランタイムp/invoke呼び出しを行うこともできます。プロトタイプにかかる時間が大幅に短縮されます。デザインを固めたら、オプションで後でネイティブコマンドレットとしてラップすることができます。

-Oisin

+0

これは、ユースケースのログインシェルのような状態-光環境で動作に向いていない「利用可能なコマンドは、API状態はに基づいて変更」の状態を維持することのように思える...のためのPowerShellの能力の私の印象でありますコマンドレットは状態ストアと相互作用しますか? –

+0

私の考えは正確です。私は強くあなたのAPIからCOMオブジェクトを作成することを検討します。最も速いアプローチである可能性が最も高いです。 – skamradt

+0

@Tetsujin powershellには、バッキングストアの状態(通常はプロバイダとしてカプセル化されている)に応じて、既存のコマンドで条件付きで使用できる動的パラメータの概念があります。たとえば、ファイルシステムプロバイダによってGet-Contentコマンドレットに-Waitスイッチが追加されました。これは、そのプロバイダへの現在のパスおよび/または内部状態を条件にすることができます。 – x0n

1

は、.NETを使用して終了しなければ、おそらくあなたはMono.Optionsライブラリ@見てとることができます:http://tirania.org/blog/archive/2008/Oct-14.html

「Mono.Optionsは美しいコマンド ライン解析でありますライブラリは小さいですが、 簡潔で使いやすい喜び、そして簡単に 強力な、1つのすべてです。

+0

.Netを使用しない場合でも、パターンとして良い! –

3

あなたが記述しているパターンは、解釈された言語の相互作用の一般的なモードであるRead-Eval-Printループ(REPL)のように聞こえます。

実際には、コマンド言語とインタープリタについて説明しているようですので、APIの既存のバインディングに一致するパターンについてドメインを調べることをおすすめします。

0

私はxOnの答えに強く同意しますが、コール間の状態を維持するには、単一インスタンスのcomオブジェクトにしてから、AddRefを呼び出すlogin関数とReleaseを呼び出すlogoff関数を記述します。そうすればオブジェクトは呼び出しの間にくっつくでしょう。唯一のリスクは複数のログインがある同じボックスで複数回実行されるためです。そのためにトラップする必要があります。

必要な状態によっては、それほど多くなくてもディスクファイルやデータベースに簡単にストリーミングできれば、マルチインスタンスのcomオブジェクトはよりよく動作し、addrefやreleaseを呼び出す必要はありません。

1

SIPまたはSWIGなどの自動ツールを使用してAPIをラップし、Pythonモジュールとしてipythonセッションにインポートして、オブジェクトをコマンドラインから処理します。ジョブが完了しました。

これが失敗した場合、それはどちらかのためにすることがあります:

  • あなたのオブジェクト/ APIは、自動ラッピングには適していません(ただし、巻き付け可能な状態にそれらを得るためのプロセスは、一般的に、それらを向上させることを意味します)。
  • Pythonは、(ipythonの拡張機能を使用していても)コマンドラインで気にしたことではありません。
関連する問題