2010-12-30 5 views
0

これはどの言語にも関連しない一般的な設計上の質問です。私は最小限のコードや最適な組織の間に少し破れています。デザイン - 新しい機能を作成するタイミングは?

例として私の現在のプロジェクトを使用します。私はさまざまな機能を実行するフォームにタブの束を持っています。タブ1は特定のレイアウトのファイルを読み込み、タブ2は特定の場所にファイルをエクスポートするなどと言うことができます。私が今実行している問題は、これらのタブが、変数。 1が含まれている場合、レイアウトAを使用して余分な連結を行う必要があるかもしれません.2が含まれていれば、レイアウトBを使用し、連結を行わずに2つの整数フィールドなどを追加する必要があります。見ているだろう。

各コードの個別のパスを早期に作成するか、絶対に必要なときにのみ分岐する単一のパスを作成する方が望ましいですか?

コードごとに個別のパスを作成すると、コードを一目でわかりやすく表示でき、デバッグや変更の際に後で道に出るのを助けます。これの欠点は、複数の場所で同じ関数の一部を呼び出すことによってコードの量を増やすことです(たとえば、1つのコードごとに3,5および9のステップがまったく同じかもしれないなど)。

必要な場合にのみ分岐する単一のパスは少し複雑で一見するのが難しくなりますが、条件付きのコードを独自のステップで配置することでコードを少なくします。

ケースバイケースの決定ですが、一般に、以前に構築されたプログラムを手渡した場合、どちらを優先しますか?


編集:私はそれを表現するのに役立つ簡単な画像を描きました。コード1/2/3が変数であり、その下の線が取る経路を表しています。これらのステップはすべて、時系列順に実行する必要があるため、本質的に他の関数を適切な順序で呼び出す機能があります。

別のパス

alt text

シングルパス

alt text

+2

これはProgrammers.SEに属する主観的な質問の一種です。 –

+0

デビッドありがとうございました。それを今すぐチェックしてください –

答えて

3

必要な場合にのみ アウト分岐となる単一のパスを作成すると、 ビットメシエとより困難になります 一目でわかりますが、私はを作成します条件式を に配置することで、コードが少なくなります。

このステートメントは購入しません。新しい機能を書くタイミングを決めるときに、ある程度の精巧さがあります。関数はできるだけシンプルで再利用可能でなければなりません(ただし単純ではありません)。正解はほとんど決して「分岐が多い1つの大きなファイル」ではありません。

LOC(コード行)を目標にすることはできません。可読性と保守性が目標です。関数を作成するときには、その名前は自己文書化する必要があります。大きなコードブロックをお持ちの場合は、

function doSomethingComplicated() { 
     stepOne(); 
     stepTwo(); 
     // and so on 
    } 

のように、関数名が自己文書化されているようにするとよいでしょう。コードを読みやすくするだけではなく、コードの各セグメントを単体で単体テストするのが簡単になります。

同じ正確なメソッドを呼び出すメソッドがたくさんある場合は、同じOOデザインとデザインパターンを使用して、同じことを行う関数の数を最小限に抑えることができます。これはあなたの声明を参考にしています。「これの欠点は、同じ機能のいくつかを複数の場所で呼び出してコードの量を増やすことです(例えば、各コードごとにステップ3,5、 。同じ」

コードの一つの大きなブロックから始まるの最大の危険は、それが実際より小さな単位にリファクタリングしない飽きないだろうということであるだけで始めるために正しい道を下り始める....

EDIT。 - -

あなたの写真には、私は使用されるすべての一般的なメソッドを使用してベースクラスを作成します。基本クラスは抽象メソッドで抽象メソッドであり、サブクラスは抽象メソッドを実装し、彼らが必要とする共通の機能。もちろん、あなたの選択した言語が提供するものに「抽象」を置き換えてください。

+0

@ Eclyps19、確かに、関数は独自の内部分岐を行うことができます。それは問題ありません。問題は、あまりにも多くの機能を持つ大規模な機能を持つことです。ある関数が複数のことをする場合、それは複数の関数に分解されるべきです。 – hvgotcodes

+0

申し訳ありません - 追加した後、元のコメントを削除しました。私は各メソッドが単一の関数だけを実行しようとするべきであることに同意します。ほとんどの場合、私はそのモジュール化を続けています。それが少しクリアすると私は元の投稿に画像を追加しました。私のコードは年代順に実行する必要があります(ステップ1〜ステップnが常にあります)。 –

+0

@ Eclyps19、私の答えを更新しました。 – hvgotcodes

0

このような未解決の質問にも具体的に答えるのは難しいですが、私はあなたがもう一方の質問を犠牲にする必要はないと信じています。

OOPの手法では、コードの再利用可能な部分をカプセル化し、オブジェクト固有の動作を処理するための子クラスを生成できるため、この問題を解決します。

1

初期のプロトタイピング(正しい抽象化/一般化を設計することによって、作業用の生成物のスループットに大きな影響があります)を除いて、常に一般化の面で誤りがあります。最初のプロトタイプ段階を過ぎても、一般化されていないクローンブランチの混乱を避けてはいけません。これは、コードを維持するのが面倒です(もしあなたがほぼ同じことを3回行っていて、 3のうち1を変更することを忘れてしまいます)。

0

個人的には、(可能な場合はAPIで)継承したフォームを作成し、マスターフォーム(タブ付き)で作成し、器具を渡してタブコンテナに埋め込むことができると思います。

フォームを継承するとき、および機能を表示/非表示/追加/削除するために引数(コード)を使用することはあなた次第ですが、マスターフォームには意思決定と引数の受け渡しと埋め込み可能なフォームのみが含まれています組織を実装から分離することができます。