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 sortFunktion beispielsweise für jeden Typ mit einer OrdInstanz verwenden. Instanzen können einfach erstellt werden, wenn sie noch nicht vorhanden sind.
Nehmen Sie Ihr AnimalBeispiel und überlegen Sie, eine Fütterungsfunktion zu implementieren. Die einfache OOP-Implementierung besteht darin, eine Sammlung von AnimalObjekten zu verwalten und alle zu durchlaufen, wobei die feedMethode für jedes Objekt aufgerufen wird .
Allerdings wird es schwierig, wenn es um Details geht. Ein AnimalObjekt 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 FoodStoreObjekt zu einer Abhängigkeit von jedem geworden ist Animal, entweder als Feld des AnimalObjekts oder als Parameter der feedMethode übergeben. Um die AnimalKohäsion der Klasse zu erhalten, können Sie auch feed(animal)zum FoodStoreObjekt wechseln oder einen Gräuel für eine Klasse erstellen, die als eine AnimalFeederoder 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 AnimalDatensätze, mit Feldern wie name, species, location, food type, food amount, etc. Sie haben auch eine Liste von FoodStoreDatensätzen mit Feldern wie location, food typeund 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 Animalnoch zu einem FoodStoreModul, 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.