2016-12-11 2 views
2

私はレールのソースコードを読んでいますが、クラスを直接使用する代わりに、サブクラスを作成しています。例コード:Railsソースコード - なぜクラス内のクラスをラッピングするのですか?

私の質問は..なぜサブクラスを使用する必要がありますか?どうしてクラス/構造体を直接使うのではないのですか?

ありがとうございました。

更新:

class << self # :nodoc: 
    attr_accessor :active 
end 

def self.inherited(other) # :nodoc: 
    super 
    other.active = Concurrent::Hash.new 
end 

ので、クラスを拡張し、誰でも、新しいConcurrent::Hashで定義されたactive属性を持っているでしょう:私はActiveSupport::Executorinherited methdodを定義してからだと、第二の例の理由を考え出しました。

しかし、なぜStructを拡張する必要があるのか​​まだよく分かりません。

答えて

0

パフォーマンスと論理的に異なるタイプに影響するためです。 RunHookには拡張機能があります。基本Structが使用されるすべての場合にdef before(target)に電話する必要はありません。したがって、このメソッドが必要となる特定の状況で使用される特定のメソッドを持つ新しいクラスが作成されます。また、基本的なStructは、追加の機能を持つ特定のタイプが必要ない他のすべての一般的な状況で使用できます。

また、コードの配置に関するアーキテクチャ上および設計上の質問です。コードがクラス間で正しく分割されていれば、プログラムを簡単に保守できます。 オブジェクト指向プログラミングとデザインには、5つの基本原則、SOLIDがあります。したがって、ISPの原則:「多くのクライアント固有のインタフェースは、1つの汎用インタフェースより優れています。

+0

しかし、Struct.newは必要なメソッドを定義するブロックを取り込むことができます。そのように使うのはどうしてですか?ドキュメント:https://ruby-doc.org/core-2.3.1/Struct.html – songyy

+0

できます。しかし、 'before'メソッドが必要になるたびに、このコードブロックを' new'に渡す必要があります。あなたのプロジェクトのさまざまな部分で 'before 'が必要な場合はどうなりますか?あなたは何をしますか?初期化をコピーしてブロックに貼り付けますか?確かに!問題ない! ...しかし、何かが将来変更される場合、例えば:あなたは 'Struct.new'にもう一つのパラメータを追加する必要があります。これで、プロジェクトのすべての部分でコードを変更する必要があります。そのため、機能やリファクタを拡張するために必要な時間が増えました。 – sig

+0

これは、特定のクラスが便利な理由です。すべての変更は1か所で行うことができます。自分自身を繰り返さないでください。[DRY](https://en.wikipedia.org/wiki/Don't_repeat_yourself) – sig

関連する問題