ユーザーインターフェイスクラスをコマンドラインインターフェイスに置き換えることができると考えるアーキテクチャを設計することは良い考えですか?


92

コード完了ページ25では、通常のユーザーインターフェイスクラスをコマンドラインクラスで簡単に置き換えることができるとよいと言われています。

テストの利点を知っていて、それがもたらす問題についてはどうでしょうか?

この余分な作業は、Webプロジェクトとモバイルプロジェクトにとって本当に成果がありますか?中小規模のプロジェクトはどうですか。同じルールが適用されますか?設計がより複雑になる場合はどうしますか?


2
Perlでは、これはMooseX :: GetoptPlack :: Handler :: CLIのようなツールの目的です。
エーテル

4
最初にCLIを使用してプログラムを構築する場合、UIをその上に階層化して、プログラムに深く埋め込まれたUIよりもはるかに高い柔軟性を与えることができます。これはWebサービスでもほぼ同じです。
zzzzBov

28
常に強い言葉です。
マークカンラス

8
元の引用に注意してください:「アーキテクチャはモジュール化して、新しいユーザーインターフェイスをプログラムのビジネスルールと出力部分に影響を与えずに置き換えられるようにする必要があります。たとえば、アーキテクチャにより、対話型インターフェイスクラスのグループと、コマンドラインクラスのグループのプラグイン。」したがって、CCは、GUIをコマンドラインに置き換える準備をする必要はなく、アーキテクチャがUIの変更に対応する必要があるとだけ言っています。GUI->コマンドラインは単なる例です。
sleske

2
@Vandell第2版のCode Completeがありますが、これは25ページには記載されていません。どのエディションを参照していますか?
JW01

回答:


43

さまざまなインターフェース(GUI、CLI、RESTなど)で機能を再利用できることは必ずしも必要ではありませんが、他の人がシステムとやり取りする新しい方法を見つけるので、システムを偶然再利用できるようにしておくと便利です。

これには、重み付けが必要ないくつかの欠点があります。

  1. 追加の抽象化レイヤー(場合によっては階層)が必要になります。これらのレイヤーは優れたエンジニアリング手法ですが、開発には追加のコストがかかりますが、他の領域(メンテナンス、再利用、テストなど)の労力を削減することはできないため、少し検討する価値があります。
  2. 媒体に最適なフローは、他の人にとってはひどい場合があります。機能がGUIをサポートするように設計されている場合、Webにとってはおしゃべりすぎるかもしれませ。すべての機能がすべての媒体で価値があるわけではありません。
  3. サービスとユーザーインターフェイスの間に汎用コンバーターを定義しようとするとトラップが発生するため、サービスコントラクトを定義して、すべてのメディアのUIを自動的に(または可能な限り)派生させることができます。多くのプロジェクトは、このようなフレームワークを構築しようとして、要件の変更に応じて可能な限りのカスタマイズを追加しようとして、あまりにも多くの労力を浪費しました。

そうは言っても、私の経験では、そのような層を実装することは常に努力を払うことになりました。いくつかのケースでは、納期の数週間前にメディアを交換する必要が生じたため(たとえば、Webサービス統合からUIへ)、システムを時間通りに展開できました。


2
他のコメントが指摘しているように、コードの凝集度を高め、結合を減らす必要があります。これらの両方により、コードがよりシンプルになり、テストが容易になります。フローはよりGUIの概念であり、通常、他の機能には存在すべきではありません。
BillThor

これがまだ言及されていないとは信じられませんが、これはModel-View-Controllerアーキテクチャの本質です。ポイントは、@ BillThorが言うように、ビューとコントローラーを自由に交換して、結合を減らすことができるようにすることです。これは、MVCの最適な使用例です。
ルドルフオラー

110

テストとは別に、このアプローチの明らかな利点は、プロジェクトを自動化およびスクリプト化できることです。コマンドラインコマンドをプログラムに送信できる場合は、GUIで同じことを自動化するマクロを作成するよりもはるかに簡単に(より確実に)複雑なタスクを実行するスクリプトを作成できます。

もちろん、それが実際に行う価値があるかどうかは、プログラムを自動化するユーザーがたくさんいるかどうかに完全に依存します。


12
多くのアプリケーションは、スクリプト作成にプラグインモデルを使用します。通常、オブジェクトモデルが公開され、pythonなどの言語がスクリプトの記述に使用されます。コマンドラインパラメータが重要なアプリでは機能しないと思います。
softveda

別の利点は発見可能性です。Sublime TextのCtrl-Shift-P機能は、この素晴らしい例です。メニューを検索するのではなく、必要なあいまいな機能がある場合は、それが呼び出されると思うものを入力するだけで、コマンド(およびショートカット)が表示され、すぐに実行できます。
アダム・アイリー

OpenDJ、オープンソース、JavaベースのLDAPサーバーは、この優れた例です。GUIで行うすべての変更のコマンドラインは、確認ダイアログボックスで利用できます。
フランク

1
@ Marnixv.R .:ジェスチャは、「35.73N 118.23Wでズームイン」などのコマンドで指定できるアクションを実行する便利な方法にすぎません。図面はコマンドとして入力できますが、不便です。それでも、便利なスクリプト可能なインターフェイスには優れたユーティリティがあり、作成に必要な労力はほとんどないと思います。
ケビンクライン

7
+1:もう1つの重要な利点は、ユーザーの操作を簡単に記録できることです。これにより、運用上の問題の再現が簡単になります。
ケビンクライン

81

余分な作業ではなく、異なる作業です。適切に行うと、より複雑になるだけでなく、設計を切り離す必要があるため、より簡単になります。実際にCLIを実装するかどうかに関係なく、設計はそれを可能にする方が良いでしょう。


4
いくつかの完全に不正なステートメントの場合は-1。もちろん、より複雑になります。結局のところ、それは追加の要件/機能です。
ボリスヤンコフ

@BorisYankov私は彼が「複雑な」の代わりに「複雑な」ことを意味したと思う-それらは似て聞こえ、意味が重複しているので、時々混乱しやすい
-Izkata

43

言及されていないように見える主な利点の1つは、これを実行できることにより、UIが基になるコードから厳密に分離されることです。このことの一つの重要な利点は、それはあなたが大幅にGUIを(OSX規格にiOSの基準を言う、または別のグラフィックエンジン)を変更する必要がある場合、それはだということを意味していることである、すべての基本的なコードはに依存しないように、あなたが変更する必要がありますUIのレイアウト。それができない場合、コマンドラインツールが機能しないためです。

それ以外に、テストを自動化できることが重要な利点です。


私が間違っているなら、私を修正しますが、別のGUIから変更することは、まだフォーム検証/など、イベントハンドラを設定し、エラーメッセージを示すという点で重要な仕事を必要とする
Upvoteクリックして

5
はい。ただし、すべての検証は優れたUIの一部であり、変更する必要があると述べました。ユーザーのアカウントの現在の状態、アイテムを検索するためのアルゴリズム、ゲーム固有のルールなどを保存するバックエンドコード。ここで重要なことは、マウス/キーボードベースのUIからゲーム用のタッチスクリーンUIでは、戦闘計算とスコアリングの処理に同じバックエンドエンジンを使用できるので、同じ基盤システムを使用する新しいイベントハンドラーの作成に集中できます。
deworde

2
それは決して簡単なことではありません。私はビジネスコードよりもイベントハンドラとフォーム検証コードを書くのが嫌いです。(私はあなたが説明した方法でそれらを
分離

2
@ClickUpvoteある程度までは、GUIの実装方法によって異なります。ValueChangedメッセージをサポートクラスに送信し、それに応答してValueValid / ValueInvalidメッセージを受信するだけの非常に薄いGUIは、OnTextboxChangedイベントですべての検証を行うものよりもはるかに簡単に交換できます。
ダン・ニーリー

@ClickUpvote私はまったく同意します。だから、私は破損していないものに焦点を当てたい、または私が完全な注意を嫌うものを与えたいので、できるだけ早くそれを行うことができます。
-deworde

17

はい、それはほとんど常に良い考えです。

このアプローチに従えば、GUIと同じスレッド内で、GUIハンドラーの背後でビジネスロジックやデータにアクセスすることはほとんどないでしょう。この理由だけでも投資する価値があります。


2
テキストエディタなどを作成している場合、その利点は何でしょうか?
ニキー

5
@nikieたとえば、WYSIWIGテキストエディタービューをプレーンテキストまたはマークアップベースのフロントエンドに置き換えることができ、同じ情報を基になるモデルに渡す限り、既存のインフラストラクチャは引き続き機能するためです。
deworde

5

いいアイデアだと思います。さらに、2番目のコマンドラインフロントエンドを作成できることにより、ビジネスロジックが特定のアプリケーションサーバーアーキテクチャに完全に分離されていることを最終的に証明します。


5

これを行う上で私が見る唯一の危険は、UIの特定の部分に到達するために、ユーザーは通常UIの他の部分を横断しなければならないことです。

開発者がUIを直接実行できる場所。開発者が実際に製品を使用するまでユーザーの問題を再現できない状況を見てきました。

そのため、テストを作成するときにも考慮してください。


3

いいえ。ひどいアドバイスです。

それは少しヤグニです(あなたはそれを必要としないでしょう)。

コマンドラインインターフェイスを公開することは、単体テストをサポートする方法でアプリを構造化すること、SOLIDの一部に準拠すること、または推奨するプログラミング方法とは異なります。

コマンドラインインターフェイスに適さないUIでは機能しません。MSペイントは非常にシンプルなアプリですが、どのような状況でも、コマンドラインからコントロールできるという利点はありますか?

スクリプトを実装するのに役立ちません。実際には、その方向への進行を妨げます。

唯一の肯定的なことは、25ページに掲載されていることです。したがって、少なくとも、この本の残りの部分は...においがするかもしれないという警告が表示されます。ずいぶん前に読みましたが、気に入らなかったので、偏見があります。


1
合意+100000000

4
スクリプト可能なMSPaintは実際に非常に便利です。
RoundTower

IMOのベストアンサー。「 'YAGNI'を実装しない」というマントラに従って以来、実際の作業に専念する時間が増え、多くの実験を行うための十分な時間が残っています。事前に賢くしようとすると、ほとんどの場合、顧客は前述の拡張機能とは異なる拡張機能を望んでいたため、不要なものに時間を浪費しませんでした。
-topskip

PSPaint +コマンドラインインターフェイス= AutoCAD
Vorac

-1(できれば)「CLIとGUIの両方を実装する」とは言わないことに注意してください。「CLIのような代替UIを実装するための触媒」と書かれています。
マークハード

2

Mason Wheelerが述べたことに基づいて、コマンドラインを介してアプリケーションとやり取りできることにより、タスクの自動化が非常に簡単になります。

これはテストで特に役立ちます。

実用的な例を挙げると、アプリケーションで自動テストを実行する場合、アプリケーションを自動的にインストールすることができます。これを行うには、次のパラメーター「myApplication.exe / silentinstall」を渡します。

このコマンドラインスイッチを指定すると、GUIインストーラーなしで、バックグラウンドでサイレントインストールが実行されるようにプログラムできます。インストーラへの入力(インストールディレクトリなど)は、おそらくXMLファイルから取得できます。

別の例を見てみましょう。Microsoft Test Manager GUI(Visual Studioに付属)を使用すると、ユーザーはそのGUIインターフェイスからテスト実行を起動できますが、同じことを行うコマンドラインインターフェイスも提供します(コマンドラインスイッチと入力の組み合わせを使用)。これは、PowerShellまたはDOSスクリプトをまとめてテストの起動を自動化でき、スクリプトを毎晩実行するようにスケジュールされたタスクを作成できることを意味します。

一部のアプリケーションには、特定のオプションで開くアプリケーションを指定するコマンドラインスイッチがあります(たとえば、「/ maximize」を使用して、最大化されたウィンドウでアプリケーションを開くことができます)。

コマンドラインインターフェイスが使用される可能性のあるシナリオはたくさんあります。これらはほんの一例です。


1

繰り返しますが、「[通常のユーザーインターフェイスクラスをコマンドラインクラスで簡単に置き換えることができるのは良い考えです」」というフレーズに注目してください。CLIを作成する必要があるわけではなく、簡単に作成できるというだけです。

ですから、UIを他のコードから切り離す必要があるということです。


2
コメントするつもりだったと思いますよね?
フリオロドリゲス

1

それは依存しますが、私がそれを依存すると言うとき、それはいくつかのエッジケースを持っているだけの問題ではなく、アプリケーションとターゲットオーディエンスに非常に依存しています。方程式からゲームを排除すると仮定すると、コマンドのようなものが実装されそうにない、または実装されないようなアプリケーションを幅広く作成できます。頭の中で、モバイル(iOS、Androidなど)環境を対象とするアプリケーションは、この見出しに該当する可能性があります。

これを念頭に置いて、一般的なソフトウェアの分野では、視覚化に大きく依存するアプリケーション(PowerPoint、Mayaなど)でコマンドラインの置換が実装されることはほとんどありません。実際、Mayaなどのグラフィックソフトウェアの場合、完全かつ適切なコマンドラインバージョンがどのように機能するかを判断することは、良いメンタルエクササイズであり、ユーザーの観点からは不可能な場合があります。したがって、インターフェイスのようなコマンドが表示される可能性が低い、またはアプリケーションのスクリプト作成が望ましい場合でも望ましい場合に遭遇する可能性のある、明らかに一般的なアプリケーションがあることは明らかです。

次に、一般的なソフトウェアアーキテクチャの観点から提案フォームを見ると、「ユーザーインターフェイスなしでこの機能にアクセスするにはどうすればよいですか」と定期的に自問するのが理にかなっていることがわかります。一般に、それを行う方法がなく、ユーザーと直接対話しない場合(ジェスチャ入力など)は、アーキテクチャ全体を改善する必要がある可能性があります。テストを簡単にするために、コマンドラインからは呼び出せなくても、ユーザーインターフェイスを経由せずにコマンドに直接アクセスできるようにしたいと考えています。これは一般に、堅固なAPIを配置する必要があり、理論的にはコマンドラインまたはユーザーインターフェイスを介したアクセスを許可する優れたAPIが必要であることを意味します。さらに、長期的には、

結局のところ、提案が得ようとしていることは理にかなっていると思います(つまり、優れたAPIを使用してユーザーインターフェイスを構築します)。 。


1
一般的には異論はありませんが、Mayaの大きな強みの1つは、実際には非常に強力なスクリプトAPI(元々はMELScript、現在はPython)を備えているという事実です。
jwd

@jwd-Mayaが私が選んだ例です。数年前に使用したので、同じ考え方でもっと良いものがあれば教えてください。ブライスはよく知らないかもしれませんが?
rjzii

0

場合によります。

多くの場合、プログラムをmodel / view / controllersまたはmodel / view / view / modelとしてパーティション分割します。モデルはコマンドラインアクセスを許可する必要があるようですが、コントローラーについては確信がありません。当然、ビューは置き換えられるものです。

ツールチェーンに基づいていくつかの違いが存在する場合があります。Code CompleteはMicrosoft Pressの本なので、おそらくこのGUIにMicrosoftテクノロジーを使用していますか?その場合、COMまたはDCOMを介してインターフェイスを公開するためのアプリを作成するときにチェックボックスがあると思います。一部のマイクロソフトテクノロジでは、リソーステーブルとメッセージパッシングは、ウィザードが迅速にプロトタイプを作成するのに役立つすべてのものとかなり密接に結びついていると思います。良くなっていると思いますが、MFCやFormsをメンテナンスしていると、少し痛くなるかもしれません。

場合によっては、GUIベースのプログラムが管理インターフェイスのラッパーであるか、独自のロジックがほとんどないため、コマンドラインインターフェイスで制御することはあまりありません。別のコンソールアプリを作成すると、より迅速になり、重要なものをスクリプト化、テスト、または使用できるようになります。

私が推測するキーポイントは、提案がルールではないということです。従うと、ユニットまたは受け入れテストが簡単になり、クリックする代わりに入力を希望する場合の代替インターフェースが得られます。それがそれ自身のために支払うならば、それをしてください。幸運を。


4
-1:Code Completeは、プログラミング技術に関する言語に依存しない本です。
deworde

1
彼はそうは言っていません。
クリックアップ投票

そして彼の質問はUI開発に固有のものでした...あなたのポイント氏deworde?
イアン

0

これは、コマンドラインプログラムの有用性によって異なります。地図上にルートをプロットしたり、3Dゲームをプレイしたりといったいくつかのことは、コマンドラインインターフェイスには向いていません。しかし、システムツールのような他のものは、スクリプト化できるという単純な理由から、GUIよりもコマンドラインからのほうがはるかに優れています。

リチャードヒップ博士はかつて、彼の理想的なGUIオペレーティングシステムは、コマンドウィンドウを開くためのアイコンとWebブラウザーを開くための別のアイコンを備えた空白のデスクトップだと言っていました。ほぼ同じように感じます。コマンドラインプログラムとして有用であり、そのように構築するのがそれほど難しくない場合は、それを行います。GUIは完全に別のプログラムである可能性があり、おそらく他の誰かが作成したものです!


地図にルートをプロットすると、CLIの自動化に役立たないのはなぜですか?そのようなものPlotRoute(startPoint, endPoint)は非常に簡単です。
メイソンウィーラー

@MasonWheeler -私はそれがより多くのようになると考えているPlotRoute(startPoint, endPoint, chart)
はFabricioアラウージョ

0

最近(少なくともJavaの場合)、遅かれ早かれ、すべてのプログラムが遅かれ早かれWebサービス(SOAPまたはAjax、あるいはその両方)を追加するようです。ですから、一般的にはそう思いますが、より良いメンタルメタファーが必要な場合は、Webサービスのフロントエンドがコマンドラインよりも可能性が高くなります。


0

物事を見る別の方法があります。コマンドラインが唯一の方法であると想定するのではなく、音声制御が代わりに使用されると想定しないのはなぜですか。その場合、まったく異なるパラダイムが必要です。

JobsがAppleを引き継ぐ前に、非常に高度な音声制御メカニズムが検討されていました。Appleはこれをつぶして、Siriなどを支持しました。

はぁ。

人気があり明白であることは、常に「最高」とは限りません。


コマンドラインの主な理由の1つは、主にソフトウェアの機能をテストおよびスクリプト化できることです。ソフトウェアの単体テストまたはバッチスクリプトを実行するためだけに、音声のオーディオクリップを録音するのは少し厄介な(または少なくともディスクのホギー)場合があります。

0

はい、これは一般に良い考えです。

メタファーによって、人々はこれをRESTfulなデザインの一形態と考えるかもしれません。....それ自体は、典型的な(G)UIがアカウント作成などの複雑なマルチステージトランザクションを伴う可能性があるためではありません。

Better that one stays away from multi-stage complexity through shopping-cart-like models for transactional setup.

ブラウザでドラッグアンドドロップUIのメタファーをプログラミングしたことがあります。バックエンドでの非常に複雑な相互作用ルールにより、UXが自然に感じられます。この問題を解決するには、サイトをAPIにし、GUIはアクション時にイベントを生成する完全なアプリでした。モジュールはこれらのイベントをキャッチし、タイマーで「APIコール」にバンドルしました(ネットワーク効率のため)。

その結果、完全にRESTfulなコアシステムが完成しました。2番目の結果は、サードパーティ用のインターフェイスがあり、ビジネスモデルに従って所属プロファイルを使用して公開できることでした。


-1

1つの利点は、ユーザーの観点からUIのフローについて考えることを余儀なくされることです。(何を達成しようとしていますか?どのコンテキストを設定する必要がありますか?そのコンテキストを考慮して、どのように目標を達成しますか?)

「銀行口座の作成」と「ms word documentの作成」には大きな違いがあります。CLIを構築しなくても、必要な「CLIコンテキスト」を考慮するためだけに価値が追加される場合があります。モデルは、ビジネスオブジェクトモデルの中にあるだけではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.