10

Delphi 8 では、VCL/RTL を .NET オブジェクト階層にマッピングする目的でクラス ヘルパーが導入されました。クラスをオーバーライドしたり元のクラスを変更したりせずに、既存のクラスにメソッドを注入できます。それ以降のバージョンの Delphi では、クラス ヘルパーが改善され、Win32 に移植されました。

ヘルプには、「新しいコードを開発するときに使用する設計ツールと見なすべきではありません」と書かれています。

クラス ヘルパーは従来の OOP に違反していますが、それが悪いことだとは思いません。この警告は保証されますか?

新しいコードを開発するときにクラス ヘルパーを使用する必要がありますか?

新しいコードを開発するときにそれらを使用しますか?

なぜですか、そうでないのですか?

Malcolmのコメントによると: 新しいコードとは、いくつかのサード パーティ ライブラリ、いくつかの既存のコード、そして作成中のコードがある日常的なアプリケーション開発を意味します。

4

10 に答える 10

15

「新しいコード」の意味によって異なります。

それらはあなたが新しく開発しているクラスにはあまり関係がないので、その場合、いいえ、おそらく使用すべきではありません。

しかし、まったく新しいプロジェクトであっても、他の方法では変更できない既存のクラス (vcl クラス、サードパーティ クラスなど) を変更する必要がある場合があります。この場合、確かに、先に進むと思います。

それら自体は悪ではありません。他のほとんどのものと同様に、それらがどのように機能するかを理解し、適切なコンテキストで使用する必要があります.

于 2008-12-10T04:32:14.803 に答える
8

派手なコードの新しいツールとしてクラス ヘルパーを採用する前に、インクルードの制限を理解する必要があると思います。1 つのクラスに対して 1 つのクラス ヘルパーしか提供できません。では、自分のクラスにクラス ヘルパーを提供し、そのクラスが、他の誰かがクラス ヘルパーを提供している共通クラスから派生した場合はどうなるでしょうか?

CodeGear はクラス ヘルパーをクールなデザイン機能としてではなく、壊れないようにするための「ハック」として導入します。コードを設計するときは、クラス ヘルパーを使用せずに設計します。私はあなたができることを知っています。制御できる既存のコードを扱う場合は、リファクタリングを使用します。他に方法がない場合は、クラスヘルパーに連絡してください。

どう見ても私の意見です…

于 2008-12-10T10:05:56.500 に答える
6

Microsoft ベースの LINQ は、拡張メソッドに重点を置いています。その観点から、コードを改善する場合は、新しいコードでクラス ヘルパーを使用する必要があります。クラス ヘルパーの適切な使用方法を参照してください。いくつかの良い用途のために。

于 2008-12-10T07:02:59.677 に答える
3

よく使います。私はリモートオブジェクトを使用しており、そこにあるオブジェクトはROエンジンによって作成されているため、それらのオブジェクトから降りて、他のビットをいじり回さずにオブジェクトに追加することはできません。クラスヘルパーとは、他のオブジェクトと同じように扱うことができることを意味します。また、クラスに含めることができるヘルパーは1つだけですが、ヘルパークラスを降順にして、継承された動作を取得することができます。

于 2008-12-10T13:33:34.833 に答える
2

申し訳ありませんが、しばらくの間キャプテンを自明にするしかありません。Delphiの内部の人々自身が「新しいコードを開発するときに使用する設計ツールと見なすべきではない」と述べている場合、定義上、使用すべきではありません。それらは、VCLを独自の目的でのみ拡張するためにあります。それを書いた人々よりも他に誰があなたに良い理由を与えるつもりですか?

于 2008-12-10T03:14:38.390 に答える
2

たぶん、あなたが使用できる良いアプローチは(私が使用しているように)です:

  1. クラスヘルパーより継承を常に優先し、継承がオプションでない場合にのみ使用してください。
  2. ベアグローバル メソッドよりもクラス ヘルパーを優先します
  3. 複数の Unit で extendsend 機能が必要な場合は、別のもの ( class wrappers など) を試してください。

.Net 拡張メソッドは非常に似ており、まったく同じ理由で作成およびサポートされている場所:基本クラスの拡張を作成します ( Delphi.Net でのアップグレードは、Delphi ネイティブ コードの種類を作成するためのオプションではありませんでした)。 .Netコードとの「互換性」の-IMHOこれは野心的すぎました)

とにかく、Delphi クラス ヘルパーは、状況によっては依然としてかなりのツールです。

于 2008-12-11T00:52:30.253 に答える
2

緊急ツールとしてのクラス ヘルパー。提供された時間内に物事を成し遂げるための唯一の方法であることがわかっている場合。後で、時間があれば、それらを削除します。

私はかつてパラメータ化のことを忘れていました.Delphi 2006にクラスヘルパーが存在しなかった場合、膨大な時間がかかりました.....クラスヘルパーを使用すると、正しく動作するようになるまでに6時間かかりました. しかし、これは緊急事態でした。クラス ヘルパーはあいまいな言語機能であり、新しい開発者がプロ​​グラムの流れをたどるのが困難になります。

于 2008-12-10T15:08:46.250 に答える
1

この記事はとても興味深いと思いました。C++ を扱いますが、主なアイデアは言語に依存しません。主な要点は、OOP 環境であってもグローバル ルーチンがメソッドよりも好まれる場合があるということです。この観点からすると、クラス ヘルパーの必要性は少なくなります。

于 2008-12-10T08:14:25.227 に答える
1

私はそれらをデザイン構造としてますます使用していることに気づきました。

私がそれらを使用する状況:

  • クライアント/サーバー セットアップでは、クラス ヘルパーを使用して共有基本クラスを拡張し、サーバーまたはクライアントのみの機能を提供します。
  • VCL/RTL クラス (およびその他のサードパーティ コード) を便利なツール機能で補完します。
  • クラスが同じ継承ツリーを共有していない場合の違いを回避するには (たとえば、ヘルパーを使用すると、一般的な Count および Items プロパティを持つことができます)。

実際、Delphi が同じ基底クラスに対して複数のヘルパーを受け入れてくれることを願っています。私の記憶が正しければ、この要求を提出したことさえあります。

于 2008-12-10T06:45:44.783 に答える
1

これらは C# 拡張メソッドのように聞こえます。このような拡張メソッドは、機能を拡張する必要があるクラスを変更できない場合には便利ですが、独自のコードを設計する方法としては不十分です。独自のコードを設計する場合、さまざまなクラスに分散するのではなく、すべての機能をできるだけ同じコード ファイルに配置する必要があります。基本的には、クローズド クラスに新しい機能を追加するためのデコレータとして使用し、独自のコードの設計には使用しないでください。

于 2008-12-10T02:36:29.170 に答える