[解決済み] Rubyの継承とミキシンの比較
質問
Rubyでは、複数のmixinを含めることができますが、1つのクラスしか拡張できないので、継承よりもmixinの方が好ましいと思われます。
質問: もしあなたが、拡張されたりインクルードされたりしなければ有用にならないコードを書いているなら、なぜそれをクラスにするのでしょうか? あるいは別の言い方をすれば、なぜ常にモジュールにしないのでしょうか?
クラスを必要とする理由はただ一つ、クラスをインスタンス化する必要がある場合だけです。しかし、ActiveRecord::Baseの場合、直接インスタンスを作成することはありません。ですから、代わりにモジュールにするべきではなかったでしょうか?
どのように解決するのですか?
I ちょうど でこのトピックについて読みました。 総合的なRubyist (ちなみに素晴らしい本です)。著者が私よりも上手に説明してくれているので、引用します。
単一のルールや公式が常に正しいデザインになることはありません。しかし、クラス対モジュールの決定をする際に、以下のことを念頭に置いておくと便利です。 クラス対モジュールの決定をするときに、2つの考慮事項を心に留めておくことは有用です。
-
モジュールはインスタンスを持ちません。 エンティティやモノは一般的にクラスでモデル化するのが最も良いということになります。 クラスでモデル化され、エンティティやモノの特性やプロパティは モジュールでカプセル化するのが最善です。これに対応して、4.1.1節で述べたように、クラス のように、クラス名は名詞になりがちですが、モジュール名は形容詞になることが多いようです (Stack 対Stacklike)。
-
クラスは1つのスーパークラスしか持つことができませんが、望むだけ多くのモジュールを混ぜることができます。 もし 継承を使用する場合は、スーパークラスとサブクラスの関係を適切にすることを優先してください。 の関係作りを優先してください。クラスの唯一無二のスーパークラス関係を使い果たさないようにしましょう。 クラスの唯一無二のスーパークラスの関係を、いくつかの特性のうちの 1 つであることが判明するようなものをクラスに与えるために使用しないでください。
これらのルールを1つの例でまとめると、やってはいけないことは次のようになります。
module Vehicle
...
class SelfPropelling
...
class Truck < SelfPropelling
include Vehicle
...
むしろ、こうしてください。
module SelfPropelling
...
class Vehicle
include SelfPropelling
...
class Truck < Vehicle
...
2番目のバージョンでは、実体とプロパティをよりきちんとモデル化しています。Truck は Vehicle の子孫であり(これは理にかなっています)、一方 SelfPropelling は乗り物(少なくとも、この世界のモデルで気になるものすべて)の特性であり、その特性は Truck が子孫、または特化した形であることによってトラックに受け継がれます。 の子孫、または特殊化された形態であることによって、トラックに受け継がれる特性です。
関連
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] 私的相続、公的相続、保護相続の違いについて
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] 現在の日時をDD/MM/YYYY HH:MM形式で取得するにはどうすればよいですか?
-
[解決済み] Ruby: 文字列の最初の文字を取得する方法
-
[解決済み] rubyのinjectはreduceと同じ意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン