2

最近、カスタムの [Attributes] 割り当てに頼っていることに気づきました。私は、最も頻繁に使用する VCL コントロールの RTTI および Generics ベースのバリアントを作成しようとしています。私の意図は定型コードの量を最小限に抑えることであり、RTTI、匿名メソッド、および属性が素晴らしいと思います。

異常な問題が発生しました。[属性] を大量に使用することになるため、このコードを読みやすくフォーマットする方法が必要です。取るに足らない問題のように聞こえるかもしれませんが、私は書式設定とインデントに非常にこだわっています。属性の問題は、IDE によって特別な方法でフォーマットされていないことです。複数のフィールド宣言のブロックで、[Attribute] 宣言と相互に絡み合うと、何が型で、何が属性で、どの属性がどのフィールドに適用されるかを推測するのに苦労します。最小限の例を次に示します。

type
  [OneAttribute('SomeParam', 7), AnOtherAttribute]
  TSomething = class
  public
    [OneAttribute('SomeParam', 7), AnOtherAttribute]
    FieldName: string;
    [OneAttribute('SomeParam', 7), AnOtherAttribute]
    OtherField: Integer;
    [OneAttribute('SomeParam', 7), AnOtherAttribute]
    function Sum(a,b:Integer):Currency;
    [OneAttribute('SomeParam', 7), AnOtherAttribute]
    property Name:string read FieldName write FieldName;
  end;

上記の例でこれらの [属性] をフォーマットした方法は、C#コードで最もよく見られる方法です。残念ながら、属性を使用した Delphi コードの例は、私のものを除いて見たことがありません。C#これは、属性を実際のフィールドに適用する可能性が低く、propertiesorに適用する可能性が高いため、わずかにうまく機能しますfunctions。関数の実装はC#宣言の直後に続くため(プロパティも同様)、Delphi の場合と同じ種類のブロックは得られません。関数とプロパティの宣言は自然に分離されているため、属性の使用によってコードの概要が妨げられることはありません。

Delphi 関連の「スタイル」情報の明らかな情報源を試してみました。Delphi 2010 のコード フォーマッタは、プロパティ宣言をまったく理解していません。上記の例で、キーワードを削除しpublicて組み込みのコード フォーマッタを実行すると、属性宣言の最初の行がclassキーワードの後ろに 1 行移動され、あたかも先祖クラスを宣言しているかのようになります。

Delphi 2010 のソース コードを調べてみました。私のgrep-fuがひどく失敗しているか、Delphi 2010ソース全体で属性がまったく使用されていません。明確にするために、属性の実際の使用法をgrepしようとした後(角括弧が割り当てられ、属性宣言であることを意味することはめったにないため難しい)、grepを開始しましたTCustomAttribute:どこにも子孫がないTCustomAttributeため、明らかに属性の使用はありません.

最後に質問に:

読みやすくするために[属性]をどのようにフォーマットしますか?

私の最新のソリューションは次のようになります。

type
 [OneAttribute('SomeParam', 7), AnOtherAttribute]
  TSomething = class
  public
   [OneAttribute('SomeParam', 7), AnOtherAttribute]
    FieldName: string;
   [OneAttribute('SomeParam', 7), AnOtherAttribute]
    OtherField: Integer;
   [OneAttribute('SomeParam', 7), AnOtherAttribute]
    function Sum(a,b:Integer):Currency;
   [OneAttribute('SomeParam', 7), AnOtherAttribute]
    property Name:string read FieldName write FieldName;
  end;

私は通常、2 列のインデントを使用しています。属性については、属性宣言を 1 つ左に移動することを考えています。私のタイプ、フィールド、メソッド、およびプロパティには、常に最小で 2 列 (タイプの場合) またはクラス メンバーの場合は 4 列の右インデントがあるため、そのためのスペースが常にあります。左インデントのようなものは、属性を使用しない既存の宣言とうまく調和しているようです。属性を「目立たせる」必要があるため、左インデントは右インデントよりも優れています。

どう思いますか?もっと良いアイデアはありますか?

4

1 に答える 1