Tatsächlich ist OO-Code weitaus weniger wiederverwendbar, und das ist beabsichtigt. Die Idee hinter OOP ist, Operationen auf bestimmte Datenelemente auf bestimmten privilegierten Code zu beschränken, der sich entweder in der Klasse oder an der entsprechenden Stelle in der Vererbungshierarchie befindet. Dies begrenzt die nachteiligen Auswirkungen der Veränderlichkeit. Wenn sich eine Datenstruktur ändert, gibt es nur so viele Stellen im Code, die verantwortlich sein können.
Aufgrund der Unveränderlichkeit ist es Ihnen egal, wer mit einer bestimmten Datenstruktur arbeiten kann, da niemand Ihre Kopie der Daten ändern kann. Dies erleichtert das Erstellen neuer Funktionen zum Bearbeiten vorhandener Datenstrukturen erheblich. Sie erstellen einfach die Funktionen und gruppieren sie in Module, die aus Domain-Sicht angemessen erscheinen. Sie müssen sich keine Gedanken darüber machen, wo sie in die Vererbungshierarchie eingefügt werden sollen.
Die andere Art der Wiederverwendung von Code besteht darin, neue Datenstrukturen zu erstellen, um an vorhandenen Funktionen zu arbeiten. Dies wird in funktionalen Sprachen mithilfe von Funktionen wie Generika und Typklassen erledigt. Mit der Ord- Typ-Klasse von Haskell können Sie die sort
Funktion beispielsweise für jeden Typ mit einer Ord
Instanz verwenden. Instanzen können einfach erstellt werden, wenn sie noch nicht vorhanden sind.
Nehmen Sie Ihr Animal
Beispiel und überlegen Sie, eine Fütterungsfunktion zu implementieren. Die einfache OOP-Implementierung besteht darin, eine Sammlung von Animal
Objekten zu verwalten und alle zu durchlaufen, wobei die feed
Methode für jedes Objekt aufgerufen wird .
Allerdings wird es schwierig, wenn es um Details geht. Ein Animal
Objekt weiß natürlich, welche Art von Nahrung es isst und wie viel es braucht, um sich satt zu fühlen. Es ist natürlich nicht bekannt, wo das Lebensmittel aufbewahrt wird und wie viel verfügbar ist, so dass ein FoodStore
Objekt zu einer Abhängigkeit von jedem geworden ist Animal
, entweder als Feld des Animal
Objekts oder als Parameter der feed
Methode übergeben. Um die Animal
Kohäsion der Klasse zu erhalten, können Sie auch feed(animal)
zum FoodStore
Objekt wechseln oder einen Gräuel für eine Klasse erstellen, die als eine AnimalFeeder
oder eine solche bezeichnet wird.
In FP gibt es keine Neigung für die Felder von und Animal
, immer gruppiert zu bleiben, was einige interessante Implikationen für die Wiederverwendbarkeit hat. Sagen Sie bitte eine Liste haben Animal
Datensätze, mit Feldern wie name
, species
, location
, food type
, food amount
, etc. Sie haben auch eine Liste von FoodStore
Datensätzen mit Feldern wie location
, food type
und food amount
.
Der erste Schritt beim Füttern könnte darin bestehen, jede dieser Listen von Aufzeichnungen auf Listen von (food amount, food type)
Paaren abzubilden , mit negativen Zahlen für die Tiermengen. Sie können dann Funktionen erstellen, mit denen Sie mit diesen Paaren alle möglichen Aufgaben ausführen können, z. B. die Summe der Mengen der einzelnen Arten von Lebensmitteln. Diese Funktionen gehören weder zu einem Animal
noch zu einem FoodStore
Modul, können aber von beiden in hohem Maße wiederverwendet werden.
Am Ende stehen Ihnen eine Reihe von Funktionen zur Verfügung, die [(Num A, Eq B)]
wiederverwendbar und modular sind. Sie können jedoch nur schwer herausfinden, wo Sie sie platzieren oder wie Sie sie als Gruppe bezeichnen sollen. Der Effekt ist, dass FP-Module schwieriger zu klassifizieren sind, die Klassifizierung jedoch weniger wichtig ist.