Rubyで犬のオブジェクトに対して、年齢や体重に応じた分類(子犬・成犬・シニア犬など)を行う場合、単純なif/elseの条件分岐だけでは可読性や拡張性が低くなりがちです。この記事では、保守性の高い設計例と実装パターンを解説します。
条件分岐をシンプルに保つための方法
まず基本として、条件分岐は明確でシンプルに保つことが重要です。年齢や体重のしきい値を定数やハッシュにまとめることで、変更が容易になります。
例として、年齢ごとの分類をハッシュで定義し、年齢に応じて判定する方法があります。
ハッシュと範囲を活用した分類
Rubyでは範囲オブジェクト(Range)を使うことで、条件を直感的に表現できます。例えば以下のように書くことができます。
AGE_CLASSIFICATION = { (0..1) => :puppy, (2..7) => :adult, (8..Float::INFINITY) => :senior }
このハッシュを利用して、犬の年齢に応じた分類メソッドを定義すると、if/elsifの連続を避けられ、可読性が向上します。
体重条件の組み合わせ
体重も考慮したい場合、年齢と体重の条件を組み合わせて分類することが可能です。配列やStructを使って条件をまとめると、拡張性の高い設計が可能になります。
例えば、各分類ごとに必要な年齢範囲と体重範囲をStructで定義し、犬オブジェクトの属性と照合する方法があります。
拡張性を高めるデザインパターン
将来的に分類ルールを増やす場合、Strategyパターンやポリモーフィズムを活用すると良いでしょう。分類のロジックを別クラスとして分離することで、メインのDogクラスが肥大化せず、テストやメンテナンスも容易になります。
また、分類ルールを外部のYAMLやJSONにまとめ、設定として読み込む方法も拡張性の高い設計と言えます。
まとめ
Rubyで犬オブジェクトを年齢・体重で分類する際は、単純な条件分岐よりもハッシュや範囲、Structを活用することで可読性と拡張性を高められます。さらに、Strategyパターンや外部設定ファイルを組み合わせることで、将来的なルール追加にも柔軟に対応可能です。


コメント