TL; DR:これを行うための最も一般的で最良の方法は、基本クラスとそのサブクラスを含むモジュールを使用することです。しかし、すべてを調べてみましょう。
これに関する公式の情報源は多くありません。ただし、モジュールを使用してライブラリ、コード、およびクラスのグループを含めるのがスタイルです。
スーパークラスのサブクラス
長所:
- 自己完結型:クラスシステム全体が1つの名前で含まれています
短所:
- 不自然:スーパークラスの内部でサブクラスを探すのは誰だと思いますか?
スーパークラスにサブクラスを含めることは、実際には状況によって異なります。ただし、このメソッドの利点は、モジュールメソッドによっても実現されます。しかし実際には、これは行われていません。クラスには、メソッド、インスタンス変数、クラスメソッドなどが含まれます。ただし、クラスはネストの最後のレベルと考えることができます。非常に特殊な状況でない限り、クラスにクラスはありません。
これが理にかなっていると私が考えることができる1つのケースは、サブクラスが使用される唯一の方法がスーパークラスを介する場合です。たとえば、、などのFormatter
内部サブクラスを持つクラスです。これらのクラスは、何かをすることによってのみ使用するとします。のように。しかし、これを行う場合、サブクラスはプライベートであり、とにかく外の世界にアクセスできないようにする必要があります。そしてその時点で、継承は非常にC ++ yの方法であり、Rubyishではありません。XML
PDF
Formatter.new(:xml)
モジュール外の基本クラス、内のサブクラス
長所:
短所:
- 非接続を意味します:Elementがその子と同じ名前空間にない場合、名前を超えて、それが関連していることを私に教えてくれますか?
この方法は非常に不自然です。子とは何の関係もないように見えますElement
。別の見方をすれば、子は処理されない内部実装の詳細であるように見えます。いずれにせよ、それはぼろぼろでずさんなネーミングと悪いコード構造計画のように見えます。これを使用してコードを読んでいた場合、Elements
モジュールの内容を調べて、それElement
がサブクラス化されていることを確認する必要があります。これは、最も自然なことではありません。
モジュール内のクラスとサブクラス(最良のソリューション)
長所:
- 含まれるもの:スーパークラスとすべてのElementクラスは、1つの名前空間に含まれているため、簡単にインポート、要求、反復などできます。メタプログラミングも支援します。
include
含めることができます:クラスは任意のコードに簡単に組み込むことができます。
- 明確:
Element
とサブクラスの間には明らかな関連性があります。それらは明らかに機能のバンドルです。
短所:
- 怠惰な命名を奨励する:これは、クラス
Base
に非常にあいまいな名前を付けることを奨励します。
これが最善のアプローチです。それはクラスをきちんとしたバンドルにしますが、それでも明白な関連性と明白な「ここで、私のDiv
クラスを使用してください」を示します(クラス内のサブクラス戦略とは対照的です)。また、これはメタプログラミングに非常に役立ちます。メタプログラミングでは、すべてをモジュールに含めることが、物事を機能させるために重要です。最後に、これは、、、などautoload
の構造でうまく機能します。これらは、これが言語が使用されるように設計された方法であることを示しています。require_relative
include
命名規則を強制する
長所:
- シンプル:ここでは複雑さはありません。
Div
あいまいさを取り除く:またはのような短い名前をandPara
に変換することにより、あいまいさを取り除きます。DivElement
ParaElement
短所:
- 古語法:クラスまたはメソッドをグループ化するための命名規則は、CやObjective-Cなどのより良い方法がない言語でのみ存在する必要があります。C ++は、名前空間を取得するとすぐにそれを削除しました。
- プログラムによるグループ化なし:これらの命名規則は、人間には明らかですが、クラス構造をメタプログラミングコードに対して非常に曇らせ、プログラムがクラスをグループとして処理することを不可能にします。
- グローバル名前空間を汚染する:これにより、グローバル名前空間に多数の名前が作成されますが、これは常に悪い考えです。
これは非常に、非常に悪い解決策です。それは、ほとんど組織化されておらず、ほとんど意味のない、ずさんなCスタイルのコードを書くことを奨励しています。これらの種類の命名規則は、より良い解決策がない言語でのみ使用する必要があり、Rubyにはより良い解決策がたくさんあります。配列内のすべてのクラスを定義することでさえ、命名規則よりも優れています。
注:ただし、本当に必要な場合は、モジュール内に保持している限り、Div
またはのような短い名前に命名規則を定義できます。ただし、これはDRYに違反するため、お勧めしません。Para
Elements::DivElement
結論
したがって、実際には2つのオプションがあります。すべてをモジュールに入れるだけです。
module Elements
class Element; end
class Div < Element; end
#etc...
end
または、すべてを命名規則のあるモジュールに入れます。
module Elements
class Element; end
class DivElement < Element; end
#etc...
end
明確さ、標準的な方法の使用、およびメタプログラミングの理由から、前者を推測します。