Swift では、私は歴史的に拡張機能を使用して閉じた型を拡張し、アニメーション、数学拡張機能などの便利でロジックのない機能を提供してきました。ただし、拡張機能はコードベース全体に散在するハードな依存関係であるため、実装する前に常に 3 回考えます。拡張子としての何か。
しかし、最近、Apple が拡張機能をさらに使用することを提案しているのを目にしました。たとえば、プロトコルを個別の拡張機能として実装するなどです。
つまり、プロトコル B を実装するクラス A がある場合、次の設計になります。
class A {
// Initializers, stored properties etc.
}
extension A: B {
// Protocol implementation
}
そのうさぎの穴に入ると、次のような拡張機能ベースのコードが増え始めました。
fileprivate extension A {
// Private, calculated properties
}
fileprivate extension A {
// Private functions
}
私の一部は、プロトコルを別々の拡張機能で実装するときに得られる構成要素が好きです。これにより、クラスの個別の部分が非常に明確になります。ただし、このクラスを継承するとすぐに、拡張関数をオーバーライドできないため、この設計を変更する必要があります。
2 番目のアプローチは... 興味深いと思います。拡張機能に対して指定できるため、各プライベート プロパティに注釈を付けてプライベートとして機能させる必要がないという点が優れています。
ただし、この設計では、保存されているプロパティと保存されていないプロパティ、パブリック関数とプライベート関数も分割されているため、クラスの「ロジック」を理解するのが難しくなっています (より小さなクラスを記述します)。それは、サブクラス化の問題と相まって、私をエクステンション ワンダーランドの玄関口で少し足を止めさせます。
世界の Swift コミュニティが拡張機能をどのように見ているかを知りたいです。どう思いますか?銀の弾丸はありますか?