最近、カスタムの [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#
これは、属性を実際のフィールドに適用する可能性が低く、properties
orに適用する可能性が高いため、わずかにうまく機能します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 列の右インデントがあるため、そのためのスペースが常にあります。左インデントのようなものは、属性を使用しない既存の宣言とうまく調和しているようです。属性を「目立たせる」必要があるため、左インデントは右インデントよりも優れています。
どう思いますか?もっと良いアイデアはありますか?