Además de la respuesta aceptada anterior, me gustaría añadir algunas ideas útiles que vienen de una experiencia de una semana con la aleación en el enum
s, en particular sobre las principales diferencias con sig
estándar.
Si usa abstract sig + extend
, obtendrá un modelo en el que hay muchos conjuntos que corresponden al mismo concepto. Tal vez un ejemplo podría aclararlo mejor. somthing supongo que como
sig Car {
dameges: set Damage
}
Usted tiene la opción de usar
abstract sig Damage {}
sig MajorDamage, MinorDamage extends Damage {}
vs
enum Damage {
MajorDamage, MinorDamage
}
En el primer caso podemos llegar wiht un modelo con diferentes átomos MinorDamage (MinorDamage0, MinorDamage1, ...) se asocian a Cars, mientras que en el segundo caso siempre tienes un MinorDamage al que pueden referirse diferentes Cars.
Podría tener sentido en este caso usar un formulario abstract sig + extend
(porque puede decidir rastrear diferentes elementos de MinorDamage o MajorDamage).
Por otro lado, si usted quiere tener un currentState: set State
, podría ser mejor usar un
enum State {Damaged, Parked, Driven}
para mapear el concepto, con el fin de tener exactamente tres State
en que cada Car
puede referirse a . De esta forma, en el Visualizer
, puede decidir proyectar su modelo en exactamente uno de los estados y resaltará todos los Car
asociados a este estado. No se puede hacer eso con la construcción abstract + extend
, por supuesto, porque al proyectar sobre MajorDamage0
se resaltará solo el Car
asociado a ese Damage
y nada más.
Por lo tanto, en conclusión, realmente depende de lo que tiene que hacer.
Además, tenga en cuenta que si usted tiene una enumeración compuesta por elementos X y ejecutar
run some_predicate for Y
donde Y < X, aleación produce ningún caso en absoluto. Por lo tanto, en nuestro último ejemplo, no podemos tener un Y < 3.
Como última nota, las enumeraciones no siempre aparecen en el Visualizador si utiliza el botón Diseño Mágico, pero como dije anteriormente usted puede "proyectar" su modelo sobre la enumeración y cambiar entre los diferentes elementos de la enumeración.
Gracias; esto es útil Supongo que se deduce que usar el mismo nombre tanto en una enumeración como en el nombre de otra enumeración sería un error. (Bueno, eso es fácilmente comprobable, ¿por qué estoy preguntando cuándo puedo averiguarlo? Sí, Alloy 4.2RC lo señala como un error. Bien, gracias de nuevo.) –
Veo también que 'privado' está documentado en http : //alloy.mit.edu/alloy/documentation/quickguide/private.html –