システムを設計するとき、使用するフレームワークに関する設計に対応することがベストプラクティスですか?


37

特定のフレームワークで使用する予定のシステムまたはアプリケーションを開発する場合、フレームワークを考慮せずにシステムを設計するのがベストプラクティスですか、それとも「フレームワークを使いやすい時間で」という考え方でシステムを設計することをお勧めしますこれとともに"。


4
どのようなフレームワークについて話しているのですか?特定の業界の非常にドメイン固有の問題を解決するために設計された、特定のニッチなビジネス固有のフレームワークを意味しますか?(例:医療、核、防衛、航空など)。または、技術的な問題を解決するために設計された汎用フレームワークについて話していますか?
ベンコットレル

1
技術的な問題を解決するために設計された汎用フレームワーク
ロバートパウンダー

2
時間の不足のための小規模(作業中です。後で詳しく説明する場合があります):デザインに基づいて電子メールを生成するシステムを作成しています。-もしこれをLaravelで書いていたら、おそらくメールの設計にテンプレートエンジンの「ブレード」を使用することになり、フローの面でシステムの設計がずっと簡単になります。ただし、PHPエンジンを使用している場合はテンプレートエンジンを作成するか、別の適切な代替テンプレートシステムを見つける必要があります。それは設計プロセスに追加され、それも質問が参照しています。
ロバートパウンダー

3
この質問は、「フレームワーク」と「デザイン」の両方が私たちの業界で複数の意味でオーバーロードされている単語であるため、非常に異なる答えの束を生成する予定です。さらに、「技術的な問題を解決するために設計された汎用フレームワーク」としてのフレームワークの単一の定義であっても、特定のフレームワークに依存します。
スタニウス

1
車輪付きの公共交通機関の車両を設計しようと考えると迷子になりながら、バスにぶつかることはあまりにも悪いことです。

回答:


51

あなたのデザインはとして密接に彼らができるように、クライアントのニーズを満たす必要があります。デザインには次のような小さなものが含まれていることに注意してください。

  • ユーザー体験
  • 機能性
  • アプリケーションの各部分がそれ自体または外部エンティティと通信する方法

これらのことは、フレームワークによって決定されるべきではありません。これらの目標を達成するためにフレームワークと戦うことが明らかな場合は、コードを書き始める前にそれらの目標を達成するのに役立つ新しいフレームワークを選択します。

適切なツールセットを選択したら(フレームワークはツールです)、使用するように設計された方法でツールを使用することをお勧めします。フレームワークの設計から逸脱するほど、チームの学習曲線が大きくなり、何かがうまくいかなくなる可能性が高くなります。

要するに

  • ユーザー向けの設計
  • 適切なツールを選択して設計を完了します
  • 使用するように設計された方法でツールを使用する

さらなる考え:

20年以上にわたるソフトウェアエンジニアリングと、いくつかのフレームワークの使用の後、いくつかの教訓を学びました。すべてのフレームワークは両刃の剣であり、制約と有効化の両方を行います。上記の大きな3を見る前にフレームワークを決定する際の問題は、平凡な(せいぜい)1つのユーザーエクスペリエンスを損なう可能性があることです。あるいは、特定の機能を実現するために、フレームワークの設計から逸脱することを余儀なくされる場合があります。


3
次に、クライアントといくつかの交渉を行う必要があります。彼らが課した制約でできることとできないことを説明してください。Xフレームワークを選択した場合、それがどのように変化するかを提案してください。彼らは変化する気がないかもしれず、質の悪い経験で生きようとするでしょう。または彼らはあなたがあなたがしていることを知っていてあなたを信頼していると決めるかもしれません。それはクライアントに依存します。一日の終わりには、彼らの期待を管理します。
ベリンロリチュ

4
ここでは、システム設計と詳細設計という異なるレベルの設計の間で混乱が生じているようです。私にとって、この質問は、システム(インターフェイス、同時実行性、データボリューム、ユーザーインターフェイス、ユーザータイプ)ではなく、詳細な設計(実装方法)について尋ねていました。
ガスドール

2
質問が「技術設計」をめぐる場合、言語とOSには設計に何らかの推論があるかもしれません。それでも、設計は実装ではありません。フレームワークの機能を考えているなら、それは設計ではなく、インプリメンテーションです。フレームワークの強度に基づいて設計決定を行う場合は、その弱点に苦しむことに備えてください。そして、弱点が要件を満たしている場合、大きな問題が発生します。大企業は喜びのために独自のフレームワークを構築しませんでした。
ライヴ

1
@Laiv素晴らしいコメント!本当に、それは「いくらか」です。ネイルガンとスクリューガンはどちらも物を固定することができ、一方は他方よりも可逆的であり、動作も遅く、より複雑です。人々が行うすべての選択は、必然的にトレードオフです。あなたはあなたのお金を支払い、あなたはあなたのチャンスを取ります。

1
@RobertPounder、それは解決のための妥当性を決定する必要があるのツールでありながら、システムを設計します。フレームワークがデザインにどのように影響するかを理解していますが、それが指示するべきではありません。
ベリンロリチュ

27

フレームワークは、特定のモジュールとサブシステム(GUIフロントエンドなど)の設計に自然に影響します。他の回答で述べたように、自分が選択したフレームワークと戦っているのに気づいた場合、あなたは苦労するでしょう。

ただし、より広範には、単一のフレームワークまたはテクノロジがシステムアーキテクチャ全体の「全体像」を決定または駆動することを避ける必要があります。ほとんどの汎用アプリケーションフレームワークはこれを奨励していません。そのため、1つのフレームワークを中心にシステム全体を記述していることに気付いた場合、そのフレームワークの作成者が意図しないことをしている可能性があります。

多くの場合、さまざまなフレームワークを使用してさまざまな問題を解決します。システムがより複雑になると、泥の大玉を作らないように注意する必要があります。可能な場合は、システムをモジュール化して疎結合にしてください。一部のフレームワークは、他のコンポーネントからフレームワーク固有のワークフローを「隠す」ラッパーとアダプターを作成することにより、抽象化の背後に保持される場合があります。GUIツールキットはフロントエンドGUI機能のみを提供する傾向があるため、これらのGUIモジュールはシステムの他の部分から離しておく必要があります。

システムの完全なアーキテクチャを規定する汎用フレームワーク(UIフレームワーク、データレイヤーフレームワークなど)は存在しません。せいぜいコンポーネントまたはモジュールの設計を規定するだけです。たとえば、一部のGUIテクノロジーは特定のMV *パターンを対象としています。

システムの全体的なアーキテクチャは、主にビジネス要件によって決定される必要があります。すべてを結び付けるために特定のツール(メッセージングミドルウェアツール、ORMフレームワークなど)に大きく依存していることがありますが、「サービス」クラスなどの抽象化でフレームワークをカプセル化している場合は、その制限に直面したときに、そのフレームワークに制約されていることに気付く可能性は低くなります。

全体像の設計では、次のことに留意してください。


一部のフレームワーク作成者は、ユーザーにフレームワークと緊密に結合したアプリケーションコードを記述することをまったく気にしないようです。
から来る

2
@COMEFROM-コードをフレームワークに緊密に結合することは、最初に設計した同じ問題を解決するためにフレームワークを選択したと仮定するため、開発者によって奨励されます。
-JeffO

設計の原則からコーディングの原則に至るまで、少し主題から外れましたが、私はあなたの言っていることの要旨を得ます。ビジネス要件が特定のフレームワークの使用である場合はどうでしょうか?(会社のアウトソーシングと社内開発者は1つの言語しか知らないと考えています)私は元の投稿でこれをより明確にすべきだと思います。
ロバートパウンダー

1
@RobertPounder私が取得しようとしていた本当のポイントは(おそらくあまりよくない)、人々が特定のフレームワークをアプリケーション全体の「グラウンディング」として使用する傾向があることがあります-これは必然的にビジネスロジックなどにつながります無関係なコードがそのフレームワークに不適切に融合されている-たとえば、ビジネスロジックがUIコントロールと結合されていたのは、それが当時は簡単ではなかったからです。それは非常に簡単ですので、注意する必要があります
ベンコットレル

2
ここで@nocomprendeに反対しなければなりません。将来のすべての要件を予測できるわけではありません、以前のソフトウェアを拡張/保守するのが難しすぎるという理由だけでシステムが書き直される場合あります。
SeldomNeedy

7

はい、できる限りフレームワークが「伝える」ことに固執する必要があります。

その理由は、単純にフレームワークの「考え方」に固執するほど、そのフレームワークを使用している問題やアイデアについて他の開発者と話しやすくなるからです。

後で使用する他の人との相互運用性と使いやすさが向上し、使用しているものの根底にある哲学に固執すれば、チュートリアルや一般的なソリューションをよりよく理解して組み込むことができます。

フレームワークを「壊す」理由を考えることができる唯一の正当な理由は、「デフォルト」の構成/原則の適用を考えれば、提供できないものが絶対に必要だからです。しかし、その後、それは最初から正しいフレームワークではないかもしれません。

基本的に、これは他の決定にも適用できます。他の人と同じ言語を話せば物事が簡単になるので、使用する言語を使用するつもりの言語にできるだけ近づけて使用する必要があります。


質問の変更により、回答を確認する必要があるかもしれません。あなたの答えは、実際にはOPの質問には答えません。
ライヴ

1
@Laivトピックに対するあなたの意見と一致しないかもしれませんが、それが質問に答えない方法がわかりません。それはまだ答えです。問題のトピックの矛盾する性質を表示するために、独自の回答を書くことを最も歓迎します。
FP

自分でうまく説明できなかったらすみません。私は英語が堪能ではありません。IMO、質問とあなたの答えは異なることについて語っていると言いたいだけです。そうでないと思うなら、それは大丈夫です。私はそれを主張しません。それでおしまい。
ライヴ

1
これは絶対にそれです。これは、ドメイン固有言語と同様のアイデアが機能する方法に似ています。製品は、ツール(フレームワーク)によって形作られ、その逆ではありません。フレームワークが「勝つ」。結婚できない場合は、別のものを選択してください。(ヒント:理想的なフレームワークはありません。ただ

1
デザインは、選択するフレームワーク(もしあれば)に影響を与え、その逆ではありません。
ラバーダック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.