2013-08-02 7 views
6

ユニットの実装セクションのuses節にユニットを置くと、そのユニットで宣言された識別子はインタフェースセクションで使用できません。実装セクションのユニットにuse節を追加する利点は何ですか?

インタフェースで参照されるユニットの識別子を使用できないという利点は何ですか?

単純にインターフェイスセクションを実行するのではなく、実装セクションに使用済みのユニットを追加するのが面倒であれば、(望ましくない副作用を避けるなど)実用上の利点はありますか?

答えて

5

最も大きな問題は、インターフェイスのセクションでの使用が循環依存とコンパイルの失敗につながる可能性があることです。ユニットAがインタフェースセクションでユニットBを使用する場合、ユニットBはそのインタフェースセクションでユニットAを使用できません。

したがって、実装セクションに少なくともいくつかの用途を入れなければならないことがよくあります。

そうでなければ、可能であれば、私は個人的にユニットの使用をインターフェースセクションに入れることを好みます。主な理由は、スコープと隠れの1つです。名前スコープの衝突がある場合(2つのユニットが同じ名前を定義し、2つ目の使用が最初に非表示になっている場合)、ユニット全体で同じ名前が範囲内にあります。

+2

非常に大きなコードベースでは逆のアプローチを使用しますが、私は小さなものではそれが問題ではないと考えています。 Interface uses節のサイズを最小化します。名前空間の汚染を少なくします。 –

+2

開発者は、 'StrUtils'や' Math'のような 'interface'のためには必要ではない' implementation'領域にできるだけ多くのユニットを置く傾向がありますが、それは必ずしも効果がありません。 –

+0

@Warrenユニットを使用するとシンボルがネームスペースに追加されない –

13

implementationセクションのuses句にユニットを追加すると、そのユニットはimplementationにのみプライベート依存することができ、interfaceには依存しません。 UnitAがUnitBを使用しているにもかかわらず、UnitAのインターフェイスがUnitBを使用していないため、UnitAがUnitBを使用しているかどうかは、UnitA以外のユーザーが気にしない場合、なぜ依存関係を宣伝してinterfaceを混乱させるのですか?また、UnitBを削除したり、別のものに置き換えたりする必要がある場合は、implementationセクションのuses句で宣言すると、UnitAを使用しているすべてのユニットに影響するinterfaceの変更が回避されます。

+2

+1循環参照の「誘惑」を避けるために、必要がない限りは助言を与えてください。このようなインターフェイスと実装の間の明確/必須/構文主義の違いは、私がDelphiで非常に好きでJavaやC#で不足していることです。 –

+0

@Arnaud実装セクションでの使用は、循環参照の導入を容易にします。 C#とJavaのインタフェースと実装の間には明確な違いがあります。 –

+0

@DavidHeffernan私は 'interface'と' class'キーワードの区別について話していませんでした。 「C#とJavaのインターフェイスと実装は明確に区別されています」... IDEフォールディング機能のおかげで?またはpublic/private/protected属性に?私はパスカルの 'interface ... implementation'セクションほど明確ではありません。 –

関連する問題