¿Cómo encontrar métodos "esenciales" para proporcionar una interfaz de mezclas de Ruby?
oop inheritance (2)
Pienso en la palabra "contrato" . El contrato de Enumerable, por ejemplo, es "dame #each
y te daré estos métodos elegantes".
Lo horrible del título de la pregunta es lo que intento resolver. Ejemplo:
en Ruby, Enumerable es una interfaz en el sentido de que puedo implementar algo y documentarlo como:
def myfancymethod(please_pass_me_an_Enumerable_here)
pero, por otro lado, Enumerable es una especie de amplificación de la interfaz que tiene # cada uno como uno de sus métodos. Si tengo una clase
class Foo
def each
:bar
end
end
Para aquellos que no están familiarizados con Ruby, si mezclas el módulo Enumerable en una clase, obtienes docenas de métodos que solo se basan en #each
método para proporcionar cosas como #map
, #select
, etc.
Podría decir que mi clase Foo
es compatible con Enumerable o Enumerable o qué? ¿Qué términos describen una respuesta a "¿Qué se necesita para ser un Enumerable?", "Bueno, tienes que tener #each"
Del mismo modo, en Ruby
(Array.new.methods - Object.new.methods).size # 111
¿Eso significa que para falsificar una interfaz de Array, tengo que implementar 111 métodos? De ninguna manera, pero cómo averiguar qué métodos son la "esencia" de Array. ¿es solo #[]
, #[]=
y #size
? ¿Cómo darle sentido?
Es posible que le interese esta solicitud de función , que sugiere algunas mejoras en la arquitectura de la clase Hash
ampliamente utilizada.
La triste verdad es olvidarse de eso . En este punto, Ruby no tiene nada como esto. Enumerable
y Comparable
son lo más parecido posible y su "contrato" es simplemente una cuestión de documentación.
Por cierto, creo que #size
es el otro método que puede usar Enumerable
, aunque es opcional.