実際、OOコードは再利用性がはるかに低く、それは仕様によるものです。OOPの背後にある考え方は、特定のデータの操作を、クラスまたは継承階層の適切な場所にある特定の特権コードに制限することです。これにより、可変性の悪影響が制限されます。データ構造が変更された場合、責任を持つことができるコード内の場所は非常に多くなります。
不変性を使用すると、だれもデータのコピーを変更できないため、特定のデータ構造を誰が操作できるかは気にしません。これにより、既存のデータ構造で機能する新しい関数の作成がはるかに簡単になります。関数を作成し、それらをドメインの観点から適切と思われるモジュールにグループ化するだけです。継承階層のどこに当てはめるか心配する必要はありません。
他の種類のコードの再利用は、既存の機能で動作する新しいデータ構造を作成することです。これは、ジェネリックや型クラスなどの機能を使用して関数型言語で処理されます。たとえば、HaskellのOrd型クラスを使用するsort
と、Ord
インスタンスを持つ任意の型で関数を使用できます。インスタンスは、まだ存在していなければ簡単に作成できます。
Animal
例を挙げて、フィード機能の実装を検討してください。簡単なOOP実装は、Animal
オブジェクトのコレクションを維持し、すべてのオブジェクトをループして、各オブジェクトでfeed
メソッドを呼び出します。
ただし、詳細を把握すると、事態は複雑になります。Animal
オブジェクトは、当然、それが食べる食べ物の種類を知っているし、どのくらいそれが満腹感を感じるために必要です。それはないではない食品が保たれてどこ当然知っているので、どのくらいの、利用可能であるFoodStore
オブジェクトは、ちょうどすべてのの依存関係となっているAnimal
いずれかのフィールドとして、Animal
オブジェクト、またはのパラメータとして渡されたfeed
方法。代わりに、Animal
クラスをよりまとまりのある状態に保つためfeed(animal)
に、FoodStore
オブジェクトに移動するか、クラスAnimalFeeder
などの嫌悪感を作成することができます。
FPでは、aのフィールドがAnimal
常にグループ化されたままになる傾向はありません。これは、再利用性に興味深い意味を持ちます。あなたはのリスト持っていると言うAnimal
のフィールドが好きで、レコードをname
、species
、location
、food type
、food amount
、などまたのリスト持っているFoodStore
ようなフィールドを持つレコードをlocation
、food type
とfood amount
。
給餌の最初のステップは、それらの記録リストのそれぞれ(food amount, food type)
を、動物の量が負の数であるペアのリストにマッピングすることです。その後、これらのペアを使用してあらゆる種類のことを行う関数を作成できます。たとえば、各タイプの食品の合計を計算できます。これらの関数はAnimal
、FoodStore
モジュールまたはモジュールに完全に属しているわけではありませんが、両方で高度に再利用できます。
最終的に[(Num A, Eq B)]
は、再利用可能でモジュール化された便利な機能を実行する関数の束になりますが、それらをどこに配置するか、グループとして何を呼び出すかを理解するのは困難です。その結果、FPモジュールは分類が難しくなりますが、分類はそれほど重要ではありません。