Rubyの継承の説明–今日OOPを学びましょう!
クラスの継承は、基本的なOOP(オブジェクト指向プログラミング)機能であり、クラスのより具体的で特殊なバージョンを作成するのに役立ちます。
ここに例があります :
Food -> Fruit -> Orange
これらのクラスの間には関係があります!
オレンジは果物であると言えますが、果物は食べ物でもあります。
親クラス(スーパークラスとも呼ばれます または基本クラス )は常にサブクラスよりも一般的です。
フルーツ
(より一般的な)は Orange
の親クラスです (より具体的に)
Rubyでは次のようになります :
class Food end class Fruit < Food end class Orange < Fruit end
継承の影響の1つ Rubyでは、すべてのメソッドとすべての定数が Food
で定義されています。 Fruit
で利用可能になります 、および Orange
。
メソッドは基本クラスから受け継がれますが、その逆はありません。
継承の目的は何ですか?
オブジェクト階層を作成すると、コードにある種の「心地よい」編成が提供されると思うかもしれませんが、それだけではありません。
継承は、特定の目的に適した異なるバージョンの親クラスを作成するために使用されます。親クラスでは意味をなさない追加の機能やメソッドが必要な場合があります。
ここに例があります :
すべての果物には色、重さ、名前があります。
一部の果物には、他の果物とは共有されない特別な特性がある場合があるため、すべての果物の特性(色、重さなど)を継承する新しいクラスを作成してから、特別な特性を追加します。
それが私が専門化することを意味します。
別の例 :
データベースに書き込むクラスがありますが、すべてのデータベース操作をログに記録する別のバージョンのクラス(おそらくデバッグ目的で)が必要です。
この場合、デコレータパターンが必要です。
この記事の詳細な説明を読むことができますが、基本的な考え方は、継承を使用して別のクラスをラップし、それに新しいものを追加することです。
オリジナルを変更する必要はありません!
実世界での継承
わかりました。
継承については学びましたが、Ruby開発者として毎日使用していることをご存知ですか?
Ruby自体は継承を使用します 次のようなメソッドを有効にするには:
プット
クラス
スーパー
これは、すべてのRubyオブジェクトが Object
から継承するためです。 デフォルトではクラスです。
このようなクラスを作成する場合 :
class Apple end
その親クラスはObject
です :
Apple.superclass # Object
そのため、上記のような方法を使用できます。
たとえば、 puts
を呼び出す場合 Rubyはクラスでこのメソッドを探します。
次に :
- 親クラスの1つでメソッドを探します
- 見つからない場合は、オブジェクトから再度開始し、
method_missing
を見つけようとします。 - 見つからない場合は、
NoMethodError
が発生します 、またはNameError
メソッドが明示的なオブジェクトなしで呼び出された場合(a.size
vsサイズコード> 、ここで
a
明示的なオブジェクトです)
Railsで継承の例をもっと見つけることができます。
ここ :
class ApplicationController < ActionController::Base end
コントローラー :
class SessionsController < ApplicationController end
モデル :
class Comment < ApplicationRecord belongs_to :article end
継承はRubyのいたるところにありますが、適切なソリューションではない場合もあります。
構成:継承の代替手段
継承には特定の制限があります。
例 :
パーツからコンピューターを構築したい。
コンピューターには部品があると言いますが、個々の部品はそれ自体がコンピューターではありません。
それらを分解すると、それらは機能しなくなります。
他に何かが必要です…
作曲が必要です!
コンポジションは、さまざまな部分が集まって機能を実行するクラスを構築します。
コンピューターのように。
これが実際の作曲の例です :
class Computer def initialize(memory, disk, cpu) @memory = memory @disk = disk @cpu = cpu end end
コンピューターには、動作するために必要な部品が与えられます。
これが作曲です。
リスコフの置換原則
適切な状況で使用すると、継承は強力になります。
しかし、すべてのツールと同様に、悪用される可能性があります!
実際、元のデザインパターンの本から次のような人気のある引用があります:
「継承よりも構成を優先します。」
デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素
継承を正しく使用していることを確認する 従うことができる原則が1つあります。それは、 L
SOLIDから。
これは「リスコフの置換原則」の略です。
これは、サブクラスを基本クラスの代わりに使用できる必要があることを示しています。
言い換えれば :
Fruit
から継承する場合 & color
は文字列です。color
は変更しないでください サブクラスのシンボルを返します。
例 :
Fruit
のユーザー color
に依存 文字列を返します。
class Fruit def color "orange" end end
これはLSPを壊します :
class Orange < Fruit def color :orange end end
color
を変更した場合 シンボルを返す場合、 Fruit
を置き換えることはできません Orange
を持つオブジェクト 。
なぜですか?
split
のようなメソッドを呼び出すと シンボルではエラーが発生します。
これは、シンボルにはない方法です。
しかし、文字列はそうです。
もう1つの危険信号は、サブクラスが親クラスの真の特殊化ではなく、親クラスを使用してユーティリティメソッドを共有している場合です。
概要
Rubyでの継承と構成について学びました!
継承を使用できます 親クラスの特殊なバージョンを作成し、構成 コンポーネントを全体にまとめます。 LSP
に従うことを忘れないでください 混乱させたくない場合の原則。
これで、より優れたオブジェクト指向コードを記述できます🙂
読んでくれてありがとう。
-
基本的なOOP原則を使用してRubyコードを劇的に改善する方法
最も重要なオブジェクト指向の原則の2つは、凝集度と結合度です。 結束 クラス内のすべてのメソッド間の関係についてです。それらは同じインスタンス変数とパラメータのセットを使用しており、すべてが同じ目標に向かって協力しています ?それとも、すべての方法が互いに分離していると感じますか? カップリング クラスが他のクラスにどの程度依存しているか、システムの他の部分にどの程度「結びついている」か、そしてこのクラスを単独で使用できるかどうかです。 これらの概念は両方とも、特定のレンズのセットを通してコードベースのすべてのクラスを確認するのに役立ちます。これらのレンズは、クラスのデザインがどれ
-
Rubyのデコレータデザインパターン
デコレータのデザインパターンは何ですか? そして、Rubyプロジェクトでこのパターンをどのように使用できますか? デコレータデザインパターンは、新機能を追加することでオブジェクトを強化するのに役立ちます クラスを変更せずにそれに。 例を見てみましょう! ロギングとパフォーマンス この例では、rest-clientのようなgemを使用してHTTPリクエストを作成しています。 次のようになります: require restclient data = RestClient.get(www.rubyguides.com) 今 : 一部のリクエストにログを追加したいが、RestCli