10

私は、次のようなユニットを持つ大規模なコードベースを使用しています。

unit myformunit;

interface
type
  TMyForm = class(Form)
  end;

  procedure not_a_method1;

  procedure not_a_method2;

  var
     global1,global2,global3:Integer;
  ...

つまり、コードの作成者はメソッドを作成したのではなく、グローバル プロシージャを作成しました。それらの数は何万もあります。これらのプロシージャ内では、 の 1 つのインスタンスを参照しますMyForm:TMyForm

このコードを「少なくとも最小限のオブジェクト指向コード」に変換するパーサー/リライター ユーティリティを作成することを検討しています。戦略としては、インターフェイスと実装セクションのグローバルをフォームに移動することから始めます。それはほとんどエレガントな OOP ではないことに気付きました。しかし、それはグローバルからの一歩です。

一度に 1 つのユニットでこれを行うことができれば、一度に 1 つのフォームでのみ行うと、プロジェクトの残りの部分で破損を修復できる可能性があります。しかし、手動で行うのではなく、ユニットの書き換えにかかる時間を短縮したいと考えています。一部のフォームには、500 以上のプロシージャと 500 以上のインターフェイスおよび実装グローバル変数があり、これらは実際には、同じユニット内にあるフォームの単一インスタンスの状態に固有のものです。

基本的に、このようなものが存在しない場合は、Castalia Delphi パーサーに基づいてパーサーを作成します。おそらく、ModelMakerCodeExplorer、またはキャスタリア、または他の同様のツールに、少なくとも私が必要とするものの一部を実行する何かがあることを願っているので、このユーティリティを自分で構築する必要はありません. 自分でビルドする必要があるとしても、1,000 時間から 2,000 時間の単調な作業を自動化できると見積もっています。少なくともそれを実行して、どのくらい壊れているかを確認し、このコードをリファクタリングする労力のレベルを決定した後で、元に戻すかコミットすることができます。

同じ目標を達成する代替戦略 (カプセル化ゼロと OOP ゼロから、カプセル化を増やし、OOP をゼロよりわずかに大きくする方法で、避けられない場合にのみオブジェクトを使用し、決してオブジェクトを使用しない大規模な構造化されていない Delphi コードベースで段階的に進めます)。本当の OOP について何か考えがあった) を歓迎します。

4

2 に答える 2

1

グローバルをフォーム フィールドに変更すると、それらをカット アンド ペーストするだけのように見えます。それらをダミーの手順に移動し、MMX を使用して最初に宣言を正規化することを検討してください。

次に、ModelMaker コード エクスプローラーを使用して、プロシージャと関数をフォームに移動します。これは、メンバー ビューでカット アンド ペーストするだけです。

必須ではありませんが、次のステップとして、メソッド本体からフォーム インスタンスへの参照を削除します。これは、検索と置換によって実現できます。

それとも私は何かを逃しましたか?

于 2012-06-20T08:27:21.740 に答える
0

Delphi Sonar プラグイン(オープン ソース)はコードを修正しませんが、「不正なコード」を検索するために使用および構成できます。

Delphi Sonar プラグインは、Delphi または Pascal を使用して記述されたプロジェクトの分析を可能にします。Delphi 6、7、2006、および XE で作成されたプロジェクトでテストされました。このプラグインは Sabre Airline Solutions の寄贈です。そのテストには以下が含まれます: コードの行数、ステートメント、ファイル数、クラス、パッケージ、メソッド、アクセサー、パブリック API (メソッド、クラス、フィールド)、コメントの比率、CPD (コードの重複、行数、ブロック、および方法多くのファイル)、コードの複雑さ (メソッド、クラス、ファイルごと。メソッド、クラス、およびファイルの複雑さの分布)、LCOM4 および RFC、ユニット テスト レポート、ルール、コード カバレッジ レポート、ユニット テストのソース コードの強調表示、「デッド」コード認識、未使用ファイルの認識。

于 2012-06-20T09:35:26.883 に答える