Ruby on Rails でポリモーフィズムをマスターする:実践ガイド
オブジェクト指向プログラム (OOP) の構築に時間を費やしたことがあるなら、おそらくアプリケーションでポリモーフィズムを使用したことがあるか、少なくともその用語を聞いたことがあるでしょう。
これは、科学やコンピューター サイエンスの教科書で目にするであろう種類の単語です。ポリモーフィズムの研究に時間を費やし、その概念を明確に理解せずにアプリケーションに実装したことがあるかもしれません。
この記事では、特に Ruby on Rails におけるポリモーフィズムについての理解を深めることができます。これを達成するために、以下について詳しく説明します。
- 現実世界でのポリモーフィズムの使用
- OOP によるプログラミングにおけるポリモーフィズム
- 高品質のコードを維持するために、Rails アプリケーションにこれを組み込む方法
さあ、始めましょう!
現実世界におけるポリモーフィズム
さまざまなコンテキストでポリモーフィズムを定義するには、いくつかの方法があります。コンテキストに関係なく、有用な定義は、「複数のフォームを表示するオブジェクトの能力」です。 。実際、この言葉自体を分解すると、poly は「多くの」を意味し、morph は「形」を意味します。
現実世界では、この定義の基本的な例は、警察官、姉妹、誰かの子供、誰かの母親などでもある女性です。それぞれの役割が彼女の行動を決定し、彼女という人間に貢献します。
多態性と遺伝学
コンピューター プログラミング以外では、ポリモーフィズムは生物学と遺伝学に一般的に関連付けられている用語です。この文脈において、多型は、より具体的には、種内でいくつかの異なる形態またはタイプの個体をもたらす遺伝的変異として定義されます。
ジャガーのことを考えてみましょう。ジャガーには複数の遺伝子変異があり、それが毛皮の色に影響を与える可能性があります。ほとんどのジャガーは、黒い丸のある黄褐色の体色をしています。ただし、遺伝子の変化により、円が明るくなったり、暗くなったりする場合があり、毛皮の色が黒い場合もあります。
同じ種の鳥内で色素が異なることも多型の例です。個体間で色に明らかな違いがあるキンカチョウについて考えてみましょう。
モノモーフィズムとポリモーフィズム
モノモーフィズムに注目すると、ポリモーフィズムをさらに理解することができます。生物学にこだわると、 単型性は「1 つの形態だけを持つ種」 として定義できます。 、開発のさまざまな段階で同じ形式を維持します。
ペンギンは単形です。専門家でも性別を区別することは困難です。ペンギンの遺伝子の違いは最小限です。したがって、ペンギンの身体的特徴、特にサイズと白と黒の色の点では、ほとんど見分けがつきません。
多くの場合、行動の手がかりは、単形種の雌雄を識別する最も簡単な方法です。
特にプログラミングにおけるポリモーフィズムに注目してみましょう。
OOP におけるポリモーフィズム
ポリモーフィズムの最初の定義を考慮すると、オブジェクトが複数の形式を表示できる能力です。 — OOP にシームレスに関連付けることができます。
OOP では、同じメソッドを使用して別のオブジェクトを渡すことにより、異なる結果を生成できます。これを達成するには、条件文を使用できます。ただし、これにより分厚いコードが作成される可能性があり、DRY 原則から遠ざかる可能性があります。クリーンで論理的な OOP アプリケーションを作成するには、ポリモーフィズムが不可欠です。
Ruby のような OOP 言語でポリモーフィズムを実装する方法の 2 つの例、つまり継承とダックタイピングを見てみましょう。
Ruby におけるポリモーフィズムと継承
継承とは、子クラスが親クラスのプロパティを継承することです。
以下は、継承を使用してポリモーフィズムを実装する方法の例です。
上記のコードには 2 つの子クラス Stringed があります。 と Percussion — 親クラス Instrument から継承 。この例は、メソッド instrument_example を呼び出しているため、ポリモーフィックです。 — 複数のフォームを出力します:Saxophone 、Guitar 、および Drums .
継承を通じてポリモーフィズムを実現するこの例は、基本的にメソッドをオーバーライドしていますが、OOP 言語におけるポリモーフィズムをより明確に理解するのに役立ちます。
Ruby におけるダックタイピングとポリモーフィズム
OOP におけるポリモーフィズムのより実際的な例は、以下で参照するダックタイピングによるものです。
各クラスメソッドの名前は brand ですが、 、(ポリモーフィック継承とは異なり) メソッドをオーバーライドしません。ここでは、親クラスから継承する代わりに、それぞれが独自のメソッドを持つ 4 つの独立したクラスがあります。ダックタイピングは、(各メソッドを個別に呼び出すのではなく) クラスを反復処理するだけで各メソッドの出力を取得できるので便利です。
繰り返しますが、ダックタイピングはメソッド brand と呼ばれる多態性です。 — 複数の形式を取る出力を生成します:Gibson 、Pearl 、Fender 、Casio 。もちろん、ダックタイピングとポリモーフィズムは、この結果を生み出すのに必須ではありません。ただし、クリーンで論理的なコードを実装することは非常に役立ちます。
Ruby on Rails のポリモーフィズム
ポリモーフィズムは、Ruby on Rails でアクティブ レコード関連付けとしてうまく機能します。モデルが本質的に同じことを行う場合、それらを 1 つのモデルに変換して多態性の関係を作成できます。
楽器のテーマにこだわり、ユーザーが楽器を投稿、コメント、レビューできるアプリケーションを考えてみましょう。以下のエンティティ関係図 (ERD) を調べてください。

この例では、ユーザーが商品とその詳細を投稿できるアプリケーションの ERD があります。ユーザーは、投稿された楽器についてコメントを提供することもできます。
他のユーザーは、ツールの評価を提供し、コメントを評価して、その有用性または有効性を判断できます。これらのアクティブ レコードの関連付けは問題なく機能し、アプリケーションの目的を果たします。
他の関連付けをアプリケーションに追加したい場合はどうすればよいでしょうか?重複する関連付けを追加して繰り返す必要があります。
たとえば、user_rating を追加したい場合 ユーザーの信頼性を評価するモデルを使用するには、独自の関連付けを持つ別のテーブルを作成する必要があります。これは、user 間に新しい関係を追加することを意味します。 および user_rating モデル。 ERD は次のようになります。

これで、オブジェクトの評価という基本的に同じことを、異なるコンテキストで実行する 3 つのモデルができました。これらの関連付けは、多態性の関連付けに向けて機が熟しています。
多態性の評価モデルを使用した ERD を見てみましょう。

rating があるので、 列では、モデルに reviews という名前を付けました。 ratings とは対照的に 混乱を避けるため。ここでは、非レビュー モデルは他のモデルとの関連付けを維持していますが、個別の評価モデルは 1 つのレビュー モデルに統合されています。
reviewable_type と reviewable_id レビューがどのモデルに関連付けられているかを表すことにより、個別の評価モデルと同じ役割を担うようになりました。
reviewable_type 列にはモデルのクラス名 (user) が格納されます。 、instrument_post 、または comment )、および reviewable_id そのモデルの対応する ID を保存します。
これら 2 つの列を使用して、Active Record クエリや条件ステートメントを介して、評価整数を特定のユーザー、投稿、またはコメントにリンクできるようになりました。外部キー user_id これにより、どのユーザーがレビューを残したかを追跡できるため、レビュー モデルに残ります。
現時点では、ポリモーフィック モデルの「-able」という用語は奇妙に思えるかもしれませんが、その目的は Rails マジックを実行するとすぐに明らかになります。
レビュー モデルは、ユーザー、コメント、ツール投稿レビューなど、複数の形式を表現し取ることができる 1 つのモデルまたはオブジェクトがあるため、多態性であるとみなされます。
Ruby on Rails でのポリモーフィズムの実装
Rails アプリケーションにポリモーフィズムを実装しましょう。 user をすでに作成したかのように動作すると、 、instrument_post 、および comment モデルを作成したら、ポリモーフィック モデルの組み込みを開始できます:reviews .
まず、次のようにテーブルを作成し、ターミナルからモデルを生成します。
これにより、移行ファイルが構築されます。
schema.rb 移行の実行後にファイルが更新されます。ポリモーフィック オプションは、reviewable を変換します。 列を reviewable_type に挿入します と reviewable_id 列:
上で「-able」という用語について言及したことを覚えていますか?これは、ポリモーフィックな関連付けを指定するための Rails 命名規則であり、ユーザー、インストゥルメントの投稿、およびコメントを「レビュー可能」にする機能を提供します。
この Rails マジックが機能するには、他のモデルがポリモーフィック モデルに正しく関連付けられていることを確認する必要があります。
user 、instrument_post 、comment モデルをレビューして評価できるようになりました。
少なくとも 2 人のユーザー、コメント、および楽器の投稿をすでに作成している場合は、次のようにアクティブ レコード クエリを使用してさまざまな方法でレビューを作成し、アクセスできます。
reviews を操作する方法は他にもたくさんあります。 レンダリングする必要があるデータに応じてモデルを変更します。親モデルがレビューを作成する方法を共有することが重要です。レビューがユーザーとレビュー可能なモデルに関連付けられている限り、Active Record は自動的に reviewable_id をリンクします。 および reviewable_type
Rails の例にポリモーフィズムがなければ、さらに多くのテーブル、不要な重複列、belongs_to が存在することになります。 、および has_many モデル内の関連付け。ポリモーフィズムによりテーブルを結合する必要性が減り、アクティブ レコードのクエリと関連付けがより簡単かつ迅速に行えるようになりました。
まとめ:クリーンで論理的な Ruby コードにポリモーフィズムを使用する
この投稿では、生物学と Ruby プログラミングという 2 つの異なる環境におけるポリモーフィズムを調査しました。どちらの場合も、ポリモーフィズムとは、オブジェクトが複数の形式を表示できる能力です。
Ruby on Rails でのポリモーフィズムの使用法を具体的に説明する前に、継承とダックタイピングを通じて Ruby でポリモーフィズムを実装する方法を検討しました。
ポリモーフィズムは、クリーンで論理的なコードを作成するのに役立ちます。私の目標は、この重要な OOP コンセプトを、現在、将来、さらには過去のアプリケーションのツールベルトに追加できるよう支援することです。
コーディングを楽しんでください!
追記Ruby Magic の投稿を報道後すぐに読みたい場合は、Ruby Magic ニュースレターを購読して、投稿を 1 つも見逃さないようにしてください。
-
Pryでの例外の処理
あなたが私のようなら、あなたはRailsコンソールをよく使います。そして今では、PryがRailsコンソールに起こる最良のことであることに誰もが同意していると思います...まあ、これまで。 組み込みのこじ開けは、昔ながらのIRBに比べて、例外を除いて作業をはるかに簡単にするいくつかの非常に優れた機能です。 完全なバックトレースを表示 Pry(またはそのことについてはIRB)で例外が発生すると、バックトレースの短縮バージョンが表示されます。通常はこれで十分ですが、常にそうとは限りません。 pryでは、wtf -vコマンドを使用して、最新の例外の完全なバックトレースを確認できます。 -vフラ
-
Rails 開発者向けのトップ Ruby IDE:生産性向上に最適なツールを選択してください
ある時点で、プログラマは統合開発環境 (IDE) について考える必要があります。この記事では、Ruby on Rails 開発者に最適なテキスト エディタと Ruby IDE を紹介します。 Ruby IDE とテキスト エディター テキスト エディタ 以前は、テキスト エディターでプレーン テキスト ファイルを作成および編集し、ターミナルのコマンド ライン インターフェイス (CLI) でコンパイルおよび実行していました。一部のテキスト エディターは依然としてそのように機能しますが、ユーザーがテキスト エディターの機能をカスタマイズできるものもいくつかあります。 統合開発環境 (IDE