Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。943件41ruby初心者です。以下のようなrequire部分以外ほぼ同じクラスが二つあるのですが、これをもっとすっきり書く方法はありませんか?よろしくお願いいたします。票6まず、次のことに注意してください。Rubyのrequireはインタプリンタへのファイルのロードです。requireが書かれているコンテキスト(その場所という意味、トップレベルとか、classの中とか、defの中とか)で展開する訳ではありません。class中であろうがmoduleの中であろうが、それこそdefやブロックの中であっても、常にトップレベルにあるものとして読み込まれるため、同じ動作をします。classの中に入れたからと言って動作が変わるわけではありません。class定義が評価される時は、classコンテキスト上の文は全て評価されます。実行されないのは条件分岐で除外されている物と、defの中身だけです(defによるメソッドの定義自体は評価されます)。Rubyは既に存在するクラスやメソッドの動作を上書きで変更できるため、requireによってその後の動作が変わる場合があります。requireの動作はclassの中でも外でも同じです。その文ですと、それぞれのclass定義の直前においても動作は変わりません。次に重要なのはbbbによってFooの動作が変わるかどうかです。変わらなければ別にFooクラスの定義の前に、bbbを読み込んでも問題ありません。今回のコードでは条件分岐等で読み込む読み込まないという分岐もありませんので、すべて最初にrequireしても何も問題ありません。:endクラスの定義が終わるまでの時間は同じですので、全体が遅くなると言うわけではありません。問題はbbbが読み込まれてるか読み込まれてないかによってFooの動作が変わる場合です。その場合は、次のような問題があります。requireは一度読み込んでしまったら二度と読み込みません。別の所でbbbが読み込まれてしまった場合は、期待した通りの動作になりません。本来、ライブラリは既存の動作が変わるように作るべきではありません。(標準ライブラリにmathnという動作が変わるライブラリがあるが、非推奨とされてる)確実に動作を変えたいのであれば、必ず再読み込みを行うloadを使用してください。:endただし、bbbが先に読み込まれているとFooの動作が変わるという場合は、これを防ぐことは困難です。bbbとFooの実装を見直し、読み込みタイミングに依存しないようにする作るべきでしょう。機能の有効・無効の条件分岐があるため、有効の時だけ必要なライブラリをrequireするという作りはよくしますが、それ以外の時は、基本的にrequireは全てファイル先頭にまとめて配置します。FooとBarのどちらで必要とされているかわからなくなるのが嫌だというのであれば、FooとBarを別ファイルにすべきでしょう。1ファイルにまとめた簡単な事だけをするツール等を作っているので無ければ、1クラス1ファイルが基本になります。これでrequireはなんとかしました。全てファイルの先頭に書くことができたとします。次に共通部分をまとめるですが、色々と方法あるのですが、通常はクラスの継承を使います。hogehogeが全く同じだったとすれば、次のように書けるはずです。:endFooとBarはFooBarを継承しています。別途上書きで定義(オーバーライドという)等しない限り、FooもBarもhogehogeメソッドは使えて、その内容はFooBarのhogehogeメソッドになります。このFooBarをFooとBarの親クラス(スーパークラスとも)といい、FooとBarはFooBarの子クラス(サブクラスとも)といいます。このようにクラスの継承を使うことで、共通部分を親クラスにまとめることでき、その子クラスでは差異だけ実装すれば良くなります。クラスの継承以外に共通部分をまとめる方法としてMixin(ミックスイン)があります。クラスの継承とあわせて入門書には必ず載っているRubyの基本機能の一つですので、詳細は書籍等を参考にしてください。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。開催しました!🎉コメントで回答する理由を教えてください関連する質問3rubyのeachを使用したファイルの結合方法について2Mix-inしたモジュールの特異メソッドの呼び出し方2特異クラスのインスタンス変数について0Controllerクラス内での標準メソッド利用について0after_initializeが先に実行されることにより、joinsやincludesを使ったn+1問題が解消されません。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。