Guía general interface Inter {m1, m2,... mn} class InterSem extends Inter { //El estado necesario para guardar los valores en el preestado ... Inter obj; //El objeto decorado con contrato semántico int nestingLevel; //Semántica transaccional InterSem(Inter obj) { this.obj = obj; nestingLevel = 0; init(); // Condiciones iniciales }
Guía general ... mi (params) { // El método decorador if (nestingLevel == 0) pre$mi (params) //Evaluar y guardar el preestado del método mi nestingLevel++; obj.mi (params); nestingLevel--; if (nestingLevel == 0) { post$mi (params); inter$inv(params); } Si el método devuelve un valor tendríamos que capturarlo en la llamada al método decorado “obj.mi (params);” y devolverlo al final: mi$output = obj.mi (params);” Si es necesario hacer uso de ese resultado para evaluar la postcondición tendríamos que pasar como parámetro ese valor a la poscondición: post$mi (params, mi$output);
Guía general post$mi(params) { ... pre$mi(params) { //Evaluar la pre del método mi } post$mi(params) { //Evaluar la post del método mi Para cada método de la interfaz
Guía general ... inter$inv() { //el código para implementar la invariante } inter$init() { //el código para implementar las condiciones iniciales