¿Cuándo deben usarse los objetos en OCaml?


Normalmente, un programa OCaml puede ser escrito con o sin objetos. ¿Cuándo es más beneficioso usar objetos y cuándo deben evitarse?

Author: Matthew Piziak, 2012-05-28

1 answers

Como regla general, no utilice objetos. La complejidad adicional que aportan no suele valer la pena. Creo que esa es una regla que se aplica también a otros idiomas, pero esa es otra historia. Al menos con OCaml uno puede objetivamente (sin juego de palabras) decir que la práctica común es no usar objetos excepto en casos raros.

Objeto proporcionar un paquete de:

  1. Un estilo "estándar" para llevar y usar registros de funciones, con posiblemente polimórficos tipos
  2. Facilidades para la recursión abierta a través de self (herencia de implementación)
  3. Un tipo de producto estructural y extensible con polimorfismo de filas (para tipos de objetos abiertos) y subtipos (para tipos de objetos cerrados)

Puede usar cualquiera de ellos juntos o por separado.

En mi experiencia, el punto (1) por sí solo no vale la pena usar objetos: solo puede usar registros de funciones y es igual de claro.

Utiliza Casos de Recursivo Abierto / Herencia

Point (2) por el contrario, es una buena justificación para usar un estilo orientado a objetos; Camlp4 lo usa de esta manera, por ejemplo: Camlp4 define clases que se pliegan sobre un AST sin hacer nada, y puede heredar este objeto transversal para implementar el comportamiento que desee solo en las construcciones sintácticas que desee (y diferir la aburrida plomería transversal a su clase madre).

Por ejemplo, se puede extender el Camlp4Ast.map objeto, que define un función de mapa simple en la representación Camlp4 de los Árboles de Sintaxis Abstractas OCaml, simplemente mapeando cada construcción a sí misma, recursivamente. Si desea, por ejemplo, asignar todas las expresiones (fun x -> e1) e2 a let x = e2 in e1, heredará de este objeto y anulará el método expr, manejando solo el caso que desee (el lado izquierdo es una función), delegando el otro al comportamiento heredado. Esto le dará un objeto que sabe cómo aplicar esta transformación sobre un programa completo, recursivamente, sin tener que escriba cualquier código repetitivo; y puede extender aún más esta transformación con un comportamiento adicional si así lo desea.

Diversión con tipos de objetos

El punto (3) también es una justificación para usar objetos como "registros extensibles", o como "matrices de nivel de tipo"; algunas bibliotecas usan object types, pero no object en tiempo de ejecución: usan tipos de objeto como tipos phantom para llevar información, beneficiándose de las operaciones de nivel de tipo más ricas que puede tener en objetos. Aparte, la tipificación estructural permite que diferentes autores tengan tipos compatibles sin fuertes dependencias a un componente común que defina los tipos (nominales) que comparten; los objetos se han utilizado para la estandarización de componentes de entrada/salida, por ejemplo.

Un caso de uso no raro y muy simple de esto es una forma idiomática de representar tipos que tienen muchos parámetros. En lugar de escribir:

type ('name, 'addr, 'job, 'id) person = ....
val me : (string, string, Job.t, Big_int.big_int) person

Puede usar tipos de objetos como "registros de nivel de tipo" estructurales para escribir lugar:

type 'a person = .... constraint 'a = < name:'n; addr:'a; job:'j; id:'i >
val me : < name:string; addr:string; job:Job.t; id:Big_int.big_int > person

Para el uso más avanzado de tipos de objeto como tipos fantasma, puede echar un vistazo a la ShCaml (doc) library (donde se usa para representar con qué comandos de shell es compatible una entrada de cadena) de Alec Heller y Jesse Tov, o my own Macaque library (doc y api doc), que usa tipos de objetos para representar valores SQL (incluida la información de nullability) y tipos de filas de tabla.
Variantes polimórficas (otro característica avanzada del sistema de tipos OCaml; en una oración, la relación entre objetos y registros es la misma que la relación entre variantes polimórficas y tipos de suma algebraica).también se han utilizado como tipos phantom, por ejemplo en este simple ejemplo por Richard Jones, o para verificar la validez de documentos HTML en el marco Ocsigen.

Tenga cuidado, sin embargo, de que esos hackers de tipo avanzado tienen un costo de complejidad significativo; antes de usarlos, debe tener cuidado equilíbralo con la expresividad adicional y la seguridad estática que aportan.

Resumiendo

  • Como una suposición básica, estás seguro de no usar objetos en absoluto; solo debes introducirlos en tu diseño si sientes que te falta algo, no por defecto

  • Los objetos son convenientes para la recursión / herencia abierta: refinar un comportamiento que ya está definido en los casos predeterminados/aburridos

  • La tipificación estructural es ocasionalmente útil cuando se quiere razonar en valores independientemente proporcionando un conjunto de características/capacidades

 70
Author: gasche,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-13 10:13:14