機能分解、それは何のために有用で、何が賛否両論ですか?どのように使用されているのいくつかの実例がありますか?機能分解とは何ですか?
答えて
機能分解は、複雑なプロセスを取り込んで、より小さな、より単純な部分に分解するプロセスです。
たとえば、ATMを考えてみましょう。あなたにプロセスを分解することができます:うまく
あなたのピンを入力してください銀行カード挿入ATM
まで
ウォーク
を...あなたが得ますポイント。
同じようにプログラミングすることができます。カード
PIN検証を読ん
転送処理の
コード
さらに分解することができ、それぞれが:ATMことを実行しているソフトウェアを考えます。サブシステムの最も分解された部分に到達したら、それらの部分のコーディングを開始する方法について考えることができます。それらの小さな部分をより大きな全体に合成します。このWikipediaの記事をチェックアウト:
機能分割の利点は、あなたがコーディングを始めると、あなたはおそらく、あなたのアプリケーションのために働くことができる最も簡単な要素に取り組んでいるということです。したがって、これらのコンポーネントを開発してテストするほうがはるかに簡単になります(もちろん、あなたのニーズに合わせてコードやプロジェクトを設計することができます)。
明白な欠点は、時間の投資です。複雑なシステム上で機能的分解を行うには、コーディングが始まるまでにはるかに時間がかかります。
私は個人的には時間がかかると思います。
私は、プロセスをその機能に分解するために使用されるだけでなく、システム全体をより小さな機能に分解するためにも使用できることを付け加えたいと思います。正確に使用された場合、機能分解は、システムの範囲と機能を指定する最速の方法の1つで、さまざまなステークホルダー間のコミュニケーションと合意を得ることができます。通常、人々はWBSに似た図を使用するように教えられますが、私の経験では、階層的な箇条書きリストは効果的に通信し、ドラフトや編集にははるかに簡単で迅速です。 –
ここでは、Cコンパイラの例を示します。
最初にプリプロセッサがあります:#include
と#define
とすべてのマクロを処理します。あなたはファイル名といくつかのオプションを与え、本当に長い文字列を返します。この関数をpreprocess(filename)
としましょう。
次に、字句解析ツールがあります。それは文字列を取り、それをトークンに分解する。 lex(string)
と呼んでください。パーサはトークンを取り出してツリーに変換し、parse(tokens)
と呼ぶ。次に、ツリーをブロックのDAGに変換する機能があります。それをdag(tree)
と呼んでください。コードエミッタemit(dag)
を呼び出すと、ブロックのDAGを取り、アセンブラを吐き出します。
コンパイラは次のようになります。
emit(dag(parse(lex(preprocess(filename)))));
私たちは、機能を理解しやすく、小さいの束の中に機能(compile
機能)を理解することは、大きな困難を分解しました。パイプラインとして行う必要はありません。プログラムを次のように書くことができます:
process_data(parse_input(), parse_config())
これはより一般的です。コンパイラはかなり深いプログラムであり、ほとんどのプログラムは比較対象となります。
機能分解は、複雑な問題をデータ関係ではなく実行する必要のあるタスクに基づいて簡単な問題に分解する方法です。この用語は、通常、古い手続き指向の設計に関連しています。
A short description about the difference between procedure-oriented and object-oriented design.
はWorkBreakDown構造(WBS)、マインドマップとトップダウン開発が同じです - 基本的に小さく、より分かりサブ部分に大きな問題を壊します。
賛否
- (コードに衝動をresiting)プログラミングへの積極的なアプローチを可能にし、プロジェクトの複雑かつ/または危険領域を特定するのに役立ちます(ATMの例では、セキュリティがおそらくありますより複雑なコンポーネント)
- は、プロジェクト/コードの失敗の原因の1つ(Capers Jones経由)が欠落している - プロジェクトの後半まで考えられていないもの(そう、私は気付かなかった私は$を渡す前に人の残高を確認しなければならなかった)
- は仕事のより良いプログラミングのための部品のデカップリング、コードの共有と配布
短所が可能になります - 本当CONSは分解を行うことではありません、しかし
- を壊していないいくつかの一般的な間違いがあります(コードのプログラミング行に分解しないでください)...
- それぞれの人が、コンポーネントに対する洞察を彼らに提供するために必要な幸せな詳細レベルを決定する必要があります。既存のパターン/コードモジュールを使用して検討する(リワーク)
- が実際に
(案忘れよりも家を設計し、ちょうど一緒にいくつかのボードを爪に開始するように)機能分解をコーディングする際にスコープが
機能要件文書(FD)は、基本的に機能分解のテキスト表現です。 FDから直接コーディングすることは、手続き型言語では問題ないかもしれませんが、オブジェクトを識別しないため、オブジェクト指向ソリューションでは十分ではありません。ユーザビリティの計画とテストにも適していません。
私の意見では、FDを作成するのに時間を取るべきですが、あまり時間をかけすぎないようにしてください。必要なすべての機能を見つけるために、システムに従っているプロセスを知っているすべての人に相談してください。
私はソフトウェアの設計、開発、販売で多くの経験を有しており、開発の第一歩として機能分解を使用しています。私は契約のベースとしてそれを使用するので、クライアントは彼らが得るものを知っています。私は何を提供しなければならないかを知っています。
- 1. オブジェクト分解とは何ですか?
- 2. 「機能」と「機能」の違いは何ですか? VIMで?
- 3. Silverlightの機能とは何ですか?
- 4. ブロック機能とは何ですか?
- 5. 「ページ機能」とは何ですか?
- 6. マクロ機能とは何ですか?
- 7. コントローラのアップ機能とダウン機能は何ですか?
- 8. ダーツ「エクスポ」機能とは何ですか、それは何ですか?
- 9. Clojure関数を分解することは可能ですか?
- 10. ISAPI拡張機能:TerminateExtensionと拡張機能デストラクタの違いは何ですか?
- 11. sharepointの機能は何ですか?
- 12. DataGridView - AllowUserToAddRowsの機能は何ですか?
- 13. IISResetの機能は何ですか?
- 14. CCriticalSectionの機能は何ですか?
- 15. SOCK_STREAMの機能は何ですか?
- 16. WT_EXECUTEINUITHREADの機能は何ですか?
- 17. EndDialogの機能は何ですか?
- 18. Eclipseコンソールスクロールロックボタンの機能は何ですか?
- 19. ルビーの機能は何ですか
- 20. 主な機能は何ですか?
- 21. _stscanf_sの機能は何ですか?
- 22. sun.awt.geom.Crossingsの機能は何ですか?
- 23. WebKitフレームワークの機能は何ですか
- 24. "With"キーワードの機能は何ですか
- 25. System.Reflection.Missing.Valueの機能は何ですか?
- 26. 投機的な解析とは何ですか?
- 27. 解析/解析とは何ですか?
- 28. PERFORCEのバグレビューまたはバグトリアージ機能とは何ですか?
- 29. Eclipseで "エディタとリンク"機能は何ですか?
- 30. KornShellでlocateコマンドと同等の機能は何ですか?
私はまだSOの回答がないので尋ねました。設計方法としてFDのいくつかの批判がhttp://stackoverflow.com/questions/250044/design-pattern-code-smell-denormalisedにあります-data-as-a-result-of-functional-decompo/250132#250132 –
Googleのヒット率が低い場合を除き、SOについて質問する必要はありません。 –