デザインとコーディング - 上から下、それとも下から上?[閉まっている]

StackOverflow https://stackoverflow.com/questions/130933

  •  02-07-2019
  •  | 
  •  

質問

コーディングするとき、あなたの経験からより良いアプローチは何ですか?

  1. 問題を十分に小さな部分に分割し、各部分を実装します。
  2. 問題を細分化してから、トップダウンのアプローチを使用して実装します。
  3. 他の?
役に立ちましたか?

解決

私がやることは次のとおりです。

まずドメインを理解してください。解決すべき問題を理解する。どのような問題を解決すべきかについて、あなたと顧客 (たとえその顧客があなたであったとしても) が同じ認識を持っていることを確認してください。

次に、問題に対する高レベルの解決策が提案され、そこからデザインがページ上などのバブルや箇条書きに変わりますが、重要なのは、それがデザイン可能なコンポーネントに振り分けられるということです。

その時点で、まだ書かれていないクラスのテストを作成し、それらのテストに合格するようにクラスを肉付けします。

私はテストファーストのアプローチを使用し、動作するテスト済みのコンポーネントを構築します。それが私にとってはうまくいきます。コンポーネントのインターフェースがわかっていて、コンポーネントがどのように通信し、相互にサービスを提供するかについての「ルール」がわかっている場合、一般的には単純な「すべてを接続する」作業になります。

それが私のやり方であり、私にとってはうまくいきました。

他のヒント

私はトップダウンで設計し、ボトムアップで実装する傾向があります。

実装に関しては、最小の機能部分を構築し、それらを上位レベルの構造に組み立てることが私にとって最も効果的であるように思えます。しかし、デザインの場合は、全体像から始めて、それを細分化して、それらの部分が何になるかを決定する必要があります。

に目を通したほうがいいかもしれません アジャイルマニフェスト. 。トップダウンとボトムアップは、Built It All At Once の設計と構築を前提としています。

「包括的なドキュメントよりも実用的なソフトウェア」とは、最初に構築するものは、実行できる最小の有用なものであることを意味します。上?底?どちらでもない。


私は若い頃、契約により厳密にトップダウンのプロジェクトに取り組みました。これは機能しません。確かに、それは機能しません。その結果、山ほどの冗長な設計とコードが得られます。何も考えずに適用した場合、それは健全なアプローチではありませんでした。

私が気づいたのは、アジャイル アプローチ (小さな部分で機能させる) では、問題を一度に把握できる部分に分割する傾向があるということです。トップダウン/ボトムアップはもはやそれほど重要ではありません。確かに、それはまったく関係ないかもしれません。

どのリードが次のことを行うか:「アジャイル開発のためにどのように分解しますか?」トリックは、作成を避けることです 大きなこと それから分解する必要があるということです。問題を分析すると、アクターがユースケースを達成しようとして、すべての情報を持っていない、間に合わない、決定を実行できないなどの理由で失敗していることがわかります。

多くの場合、これらは分解が必要な大きなものではありません。そのような場合は、次の問題に対処する必要があります。 目標を後方へ 方向。目標から、その目標を達成できるようにするもの、イネーブラーを可能にするものなど。目標は大きなものであることが多いため、一般的なビジネス目標から詳細なビジネス プロセスやステップに至るまで、トップダウンで行われる傾向があります。

ある時点で、目標に至るさまざまなステップを概観します。分析部分 (物事を分解すること) を完了しました。次に合成部分です。私たちは自分たちが持っているものを実際に構築できるものに再組み立てします。合成はボトムアップです。ただし、調子に乗らないようにしましょう。私たちにはいくつかの視点があり、それぞれが異なります。

モデルがいます。これは多くの場合、詳細からより大きな概念モデルに構築されます。その後、OLTP 用に正規化されたモデルに再分解​​される場合があります。または、OLAP 用に正規化されたスター スキーマに分解されます。次に、正規化されたモデルから ORM マッピングを作成する作業に戻ります。上、下、上。

加工をしております。これは多くの場合、ビジネス プロセスの概要から処理ステップの詳細に至るまで構築されます。次に、ソフトウェアはステップに基づいて設計されます。次に、ソフトウェアはクラスとメソッドに分割されます。下→上→下。

[余談. 。賢明なユーザーの場合、この分解により新しい役職と働き方が定義されます。啓発されていないユーザーの場合、古い仕事が残り、私たちは古い仕事を新しいソフトウェアにマッピングするために山ほどのドキュメントを作成します。]

コンポーネントがあります。私たちは頻繁に部品を調べ、利用可能なコンポーネントについて知っていることを調べ、一種のマッチングを行います。これは最もランダムなプロセスです。それは結晶が形成される方法に似ています。核生成の中心があり、デザインはそれらの中心の周りで固まります。ウェブサービス。データベース。トランザクション管理。パフォーマンス。音量。ソリューションの一部またはすべてを実装するコンポーネントを選択するのに何らかの形で役立つさまざまな機能。ボトムアップ (機能から製品へ) であることが多いですが、トップダウン (「ハンマーを持っている、すべてを釘と呼ぶ」 == すべてに RDBMS を使用する) である場合もあります。

最終的にはコーディングする必要があります。これはボトムアップです。種の。パッケージ構造を定義する必要があります。クラス全体を定義する必要があります。その部分はトップダウンでした。クラス内にメソッドを記述する必要があります。私はよくボトムアップでメソッドを大まかに作成し、単体テストを作成し、メソッドを完成させます。次のメソッドを大まかに作成し、単体テストを作成して、メソッドを完成させます。

推進原則はアジャイルです。つまり、機能するものを構築します。詳細は、上、下、前、後、データ、プロセス、アクター、対象領域、ビジネス価値など、マップ全体にあります。

はい。それらすべてを実行してください。

皮肉っぽく聞こえるかもしれませんが(申し訳ありません、元に戻ります)、これは本当に正解がないケースです。

アジャイルな方法でも、最初にテストを作成します。

したがって、すべてのソフトウェアは継続的なサイクルになります。

  • 赤 - コードはテストに不合格です
  • 緑 - コードはテストに合格します
  • リファクタリング - 意図を維持したコードの改善。

欠陥、新機能、変更。すべて同じパターンに従います。

2 番目の選択肢は合理的な方法です。問題を理解できる部分に分割すると、トップダウンのアプローチにより、細部をすべて実装する前に大きな設計上の欠陥が明らかになります。下位レベルの機能のスタブを作成して、すべてを連携させておくことができます。

トップダウン設計とボトムダウン設計以外にも考慮すべきことがあると思います。設計を管理可能な作業単位に分割する必要があるのは明らかですが、優先順位付けなども考慮する必要があります。また、反復的な開発プロジェクトでは、前の反復でソリューションを提供した後、次の反復で問題を再定義することがよくあります。

デザインするときは中抜きをするのが好きです。私はドメインをモデル化してからクラスを設計し、そこからデータベースと UI に移行するのが好きです。UI ベースまたはデータベース ベースの特定の機能がある場合は、それらを事前に設計することもあります。

コーディングするとき、私は通常、可能であればボトムアップ (最初にデータベース、次にビジネス エンティティ、次に UI) を行うことを好みます。この方法を使用すると、物事をまっすぐに保つことがはるかに簡単になることがわかります。

私は、優れたソフトウェア設計者がいれば (そして私の考えでは、すべてのソフトウェア開発者もある程度のレベルではソフトウェア設計者であるべきだと考えています)、魔法はトップダウンとボトムアップを同時に行えることにあると信じています。

私がメンターから「教育」されたのは、関係するエンティティを理解するために非常に簡単なトップダウンから始め、次にボトムアップに移行して作成したい基本要素を把握し、次にバックアップしてどのように作成するかを確認することです。ボトムアップの結果について私が知っていることを知りながら、1 つ下のレベルに進むことができ、「それらが真ん中で出会う」まで続きます。

それが役立つことを願っています。

アウトサイドインのデザイン。

トップエンドで何を達成しようとしているのかから始めれば、ボトムエンドで何を取り組まなければならないかがわかります。両端が中央で接触するまで作業を続けます。

「どちらでもない」という意見には私も同意しますが、誰もがスペクトルのどこかに当てはまります。

私はどちらかというとトップダウン型の人間です。私は、高レベルの機能/ポイントなどを 1 つ選択し、それを完全なプログラムとして実装します。これにより、問題領域の範囲内で基本的な計画と構造を概略的に描くことができます。

次に、別の機能から始めて、2 番目の機能で使用できるすべてを元の機能から新しい共有エンティティにリファクタリングします。泡立て、洗い流し、塗布が完了するまで繰り返します。

しかし、私はボトムアップ型の人をたくさん知っています。彼らは問題を聞くと、その上にアプリケーションを構築するために必要となるすべてのサポート サブシステムについて考え始めます。

どちらのアプローチが間違っているとも正しいとも思いません。どちらも結果を出すことができます。私は、2 つの異なる観点から問題に取り組むことができるため、一緒に仕事をするボトムアップのメンバーを見つけるように努めています。

どちらも有効なアプローチです。場合によっては、一方が他方よりも自然に「感じる」ことがあります。ただし、大きな問題が 1 つあります。いくつかの主流言語、特にそのフレームワークとライブラリ 重く 構文の強調表示、バックグラウンドでの型チェック、バックグラウンドでのコンパイル、インテリジェントなコード補完、IntelliSense などの IDE サポート。

しかし、 これはトップダウンコーディングでは機能しません。 トップダウンコーディングでは、変数、フィールド、定数、関数、プロシージャ、メソッド、クラス、モジュール、トレイト、ミックスイン、アスペクト、パッケージ、およびタイプを常に使用します。 まだ実装していないのです! そのため、コンパイル エラーが発生したり、赤い波線が表示されたり、コード補完が得られなかったりするため、IDE は常に警告を発します。つまり、IDE はほとんど 禁止します トップダウンコーディングを行う必要がなくなります。

私はトップダウンのバリエーションをやります。私は最初にインターフェースを試してみる傾向があり、それからそれを機能のリストとして使用します。このバージョンの良い点は、通常なら問題が発生するはずの IDE でも動作することです。まだ実装されていない関数呼び出しを 1 つコメントアウトするだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top