Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

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に従うことを忘れないでください 混乱させたくない場合の原則。

これで、より優れたオブジェクト指向コードを記述できます🙂

読んでくれてありがとう。


  1. 基本的なOOP原則を使用してRubyコードを劇的に改善する方法

    最も重要なオブジェクト指向の原則の2つは、凝集度と結合度です。 結束 クラス内のすべてのメソッド間の関係についてです。それらは同じインスタンス変数とパラメータのセットを使用しており、すべてが同じ目標に向かって協力しています ?それとも、すべての方法が互いに分離していると感じますか? カップリング クラスが他のクラスにどの程度依存しているか、システムの他の部分にどの程度「結びついている」か、そしてこのクラスを単独で使用できるかどうかです。 これらの概念は両方とも、特定のレンズのセットを通してコードベースのすべてのクラスを確認するのに役立ちます。これらのレンズは、クラスのデザインがどれ

  2. Rubyのデコレータデザインパターン

    デコレータのデザインパターンは何ですか? そして、Rubyプロジェクトでこのパターンをどのように使用できますか? デコレータデザインパターンは、新機能を追加することでオブジェクトを強化するのに役立ちます クラスを変更せずにそれに。 例を見てみましょう! ロギングとパフォーマンス この例では、rest-clientのようなgemを使用してHTTPリクエストを作成しています。 次のようになります: require restclient data = RestClient.get(www.rubyguides.com) 今 : 一部のリクエストにログを追加したいが、RestCli