D - Programación de contratos

La programación por contrato en la programación D se centra en proporcionar un medio simple y comprensible de manejo de errores. La programación por contrato en D se implementa mediante tres tipos de bloques de código:

  • bloque de cuerpo
  • en bloque
  • fuera de bloque

Bloque de cuerpo en D

El bloque de cuerpo contiene el código de ejecución de la funcionalidad real. Los bloques de entrada y salida son opcionales, mientras que el bloque de cuerpo es obligatorio. A continuación se muestra una sintaxis simple.

return_type function_name(function_params) 
in { 
   // in block 
} 

out (result) { 
   // in block 
}
 
body { 
   // actual function block 
}

En bloque para condiciones previas en D

En bloque es para condiciones previas simples que verifican si los parámetros de entrada son aceptables y están dentro del rango que puede manejar el código. Una ventaja de un bloque in es que todas las condiciones de entrada se pueden mantener juntas y separadas del cuerpo real de la función. A continuación se muestra una condición previa simple para validar la contraseña para su longitud mínima.

import std.stdio; 
import std.string;
  
bool isValid(string password) 
in { 
   assert(password.length>=5); 
}
 
body { 
   // other conditions 
   return true; 
}
  
void main() { 
   writeln(isValid("password")); 
}

Cuando se compila y ejecuta el código anterior, lee el archivo creado en la sección anterior y produce el siguiente resultado:

true

Bloques de salida para condiciones posteriores en D

El bloque de salida se encarga de los valores de retorno de la función. Valida que el valor de retorno está en el rango esperado. A continuación, se muestra un ejemplo simple que contiene tanto la entrada como la salida que convierte meses, año en una forma de edad decimal combinada.

import std.stdio;
import std.string;

double getAge(double months,double years) 
in { 
   assert(months >= 0); 
   assert(months <= 12); 
}
 
out (result) { 
   assert(result>=years); 
} 

body { 
   return years + months/12; 
} 
 
void main () { 
   writeln(getAge(10,12)); 
}

Cuando se compila y ejecuta el código anterior, lee el archivo creado en la sección anterior y produce el siguiente resultado:

12.8333