¿Hay alguna razón por la cual no usaría Contratos de código para hacer cumplir las reglas comerciales?¿Se deberían usar contratos de código para la seguridad?
Imagine que tiene una clase User
que representa un usuario único de un sistema y define las acciones que se pueden realizar contra otros usuarios. Se podría escribir un método ChangePassword
así ...
public void ChangePassword(User requestingUser, string newPassword)
{
Contract.Requires<ArgumentNullException>(requestingUser);
Contract.Requires<ArgumentNullException>(newPassword);
// Users can always change their own password, but they must be an
// administrator to change someone else's.
if (requestingUser.UserId != this.UserId &&
!requestingUser.IsInRole("Administrator"))
throw new SecurityException("You don't have permission to do that.");
// Change the password.
...
}
O usted podría implementar el control de seguridad como condición previa con Contract.Requires
...
public void ChangePassword(User requestingUser, string newPassword)
{
Contract.Requires<ArgumentNullException>(requestingUser != null);
Contract.Requires<ArgumentNullException>(newPassword != null);
// Users can always change their own password, but they must be an
// administrator to change someone else's.
Contract.Requires<SecurityException>(
requestingUser.UserId == this.UserId ||
!requestingUser.IsInRole("Administrator"),
"You don't have permission to do that.");
// Change the password.
...
}
¿Cuáles son las ventajas y desventajas de estos dos métodos ?
También se podría argumentar que, en algunos casos, el ejemplo que usted ha dado * es * un error grave en el código. Por ejemplo, si el método que está escribiendo está enterrado varias capas hacia abajo y toda la verificación debe realizarse en la capa externa de su aplicación, esto podría considerarse parte del contrato del método. Todo depende :) – porges
¡Buena respuesta! No me había dado cuenta de la naturaleza inalcanzable de 'ContractException', pero su respuesta me indicó la dirección correcta: http://www.infoq.com/articles/code-contracts-csharp ¡gracias! :) –