11

これは、私がここで始めた議論の続きです。この分野の経験がないため、Delphi ソース コードをモジュール化する最善の方法を見つけたいと考えています。私はあなたのすべての提案に感謝します。

私がすでにそこに書いたことを投稿させてください。

私が働いている会社が開発したソフトウェアは、100 以上のモジュールで構成されています (そのほとんどは、さまざまなデバイスのドライバーのようなものです)。それらのほとんどは同じコード (ほとんどの場合クラス) を共有しています。問題は、これらのクラスが常に個別のスタンドアロン PAS ユニットに配置されるとは限らないことです。共有コードは、モジュール固有のコードを含むユニットに入れられることが多いということです。これは、共有クラスのバグを修正する場合、それが定義されている PAS ユニットをすべてのソフトウェア モジュールにコピーして再コンパイルするだけでは不十分であることを意味します。残念ながら、固定されたコードを各モジュールに 1 つずつコピーして、適切なユニットとクラスに貼り付ける必要があります。これには多くの時間がかかります。これは、正しいアプローチを選択することで、近いうちに排除したいものです。助けてください。

EXE と共に配布される BPL を使用することは良い解決策になると思いましたが、前の議論で述べたように、いくつかの欠点があります。最悪の問題は、各 EXE が複数の BPL を必要とする場合、テクニカル サポート担当者が、どの EXE がどの BPL を必要とするかを把握し、エンド ユーザーに適切なファイルを提供する必要があることです。ソフトウェア アップデーターがない限り、これは技術者とエンド ユーザーの両方にとって大きなメリットとなります。彼らは確かに迷子になり、怒るでしょう:-/.

また、互換性の問題も発生する可能性があります。1 つの BPL が多くの EXE で共有されている場合、その BPL の変更は、1 つの EXE には有効で、他の一部の EXE には無効になる可能性があります。

非常に多くのプロジェクトでバグ修正を迅速に行うにはどうすればよいでしょうか? 以下のいずれかの方法が考えられます。より良いアイデアがあれば、お知らせください。

  • 共有コードを個別のスタンドアロン PAS ユニットに配置して、そのうちの 1 つにバグ修正があった場合、それをすべてのプロジェクトにコピー (古いファイルを上書き) し、すべてを再コンパイルするだけで十分です。これは、各ユニットが使用されているプロジェクトの数だけコピーされることを意味します。

めったに変更されないコードに関する限り、この解決策は問題ないようです。しかし、一般的な機能と手順を備えた pa ユニットもあり、これらはしばしば変更されます。誰かが新しい関数をこのファイルに追加するたびに、同じ手順 (非常に多くのプロジェクトをコピーして再コンパイルする) を行うことは不可能です。

  • すべての共有コードの BPL を作成しますが、それらを EXE にリンクして、EXE がスタンドアロンになるようにします。

私にとっては、これが最善の解決策のように思えますが、いくつかの短所があります。BPL でバグ修正を行った場合、各プログラマーは自分のコンピューターで BPL を更新する必要があります。彼らがそれを忘れたらどうしますか?ただし、それは小さな問題だと思います。変更についてお互いに通知するように注意すれば、すべてがうまくいくはずです. どう思いますか?

  • そして、CodeInChaos によって提案された最後のアイデア (正しく理解できたかどうかはわかりません)。プロジェクト間で PAS ファイルを共有する。おそらく、共有コードを別のフォルダーに保存し、すべてのプロジェクトでそのコードを検索する必要があることを意味しますよね? また、プロジェクトを変更する必要がある場合はいつでも、共有ファイル フォルダーと一緒に SVN からダウンロードする必要があると思います。共有コードを変更するたびに、そのコードを使用する各プロジェクトを再コンパイルする必要があります。

良い解決策を選択するのを手伝ってください。ソフトウェア開発への愚かなアプローチのせいで、会社がバグ修正のために必要以上に多くの時間とお金を失うことを望んでいません。これまでのところ、誰もそれを気にかけたことがなく、それがどれほど多くの問題を引き起こしているか想像できるでしょう.

どうもありがとうございました。

4

2 に答える 2

5

あなたは言う:

  • すべての共有コードの BPL を作成しますが、それらを EXE にリンクして、EXE がスタンドアロンになるようにします。

BPL を実行可能ファイルにリンクすることはできません。BPL にもある個別のユニットにリンクしているだけです。そうすれば、実際にBPL を使用したり、BPL を必要としたりする必要さえありません。

BPL は、共有コードとして使用されることを意図しています。つまり、共有されるコードを 1 つまたは複数の BPL に配置し、.exe、.dll、またはその他の .bpl のそれぞれからそれを使用します。バグ修正 (BPL のパブリック インターフェイスを変更しない場合) は、修正された 1 つの BPL を再配布するだけで済みます。

前述したように、DLL のパブリック インターフェイスを決定したら、それを変更しないでください。ルーチン、型、およびクラスを追加できますが、既に使用されている既存のクラス、型、インターフェイス、定数、グローバル変数などのパブリック インターフェイスを変更しないでください。そうすれば、BPL の固定バージョンを簡単に配布できます。

ただし、BPL はコンパイラのバージョンに大きく依存することに注意してください。新しいバージョンのコンパイラを使用する場合は、BPL も再コンパイルする必要があります。そのため、コンパイラのバージョンに応じて、BPL に 100、110 などの接尾辞を付けることが理にかなっています。コンパイラ バージョン 15.0 でコンパイルされた実行可能ファイルは、サフィックス 150 の BPL を使用するように指示され、バージョン 14.0 でコンパイルされた実行可能ファイルは、サフィックス 140 の BPL を使用します。これにより、異なるバージョンの BPL が平和的に共存できます。サフィックスは、プロジェクト オプションで設定できます。

異なるバージョンをどのように管理していますか? 私のComponentInstaller BPL のような構造のディレクトリを作成します (これは Delphi/C++Builder/RAD Studio XE IDE のメニュー [コンポーネント] -> [コンポーネントのインストール] で確認できる専門家です):

Projects
  ComponentInstaller
    Common
    D2007
    D2009
    D2010
    DXE

Common ディレクトリには、各バージョンで共有される .pas ファイルとリソース (ビットマップなど) が含まれ、各 Dxxxx ディレクトリには、BPL の特定のバージョンの .dpk、.dproj などが含まれます。各パッケージは、Common ディレクトリ内のファイルを使用します。もちろん、これは一度に複数の BPL に対して実行できます。

ところで、バージョン管理システムを使用すると、これがはるかに簡単になる可能性があります。BPL の各バージョンには必ず異なるサフィックスを付けてください。

実際にスタンドアロンの実行可能ファイルが必要な場合は、BPL を使用せずに、個別のユニットにリンクするだけです。オプション「BPL でコンパイル」がこれを制御します。

于 2011-08-15T16:29:31.230 に答える