Czy są jakieś powody, dla których nie używałbyś umów Code Contracts w celu egzekwowania reguł biznesowych?Czy umowy kodowe należy stosować w celu zapewnienia bezpieczeństwa?
Wyobraź sobie, że masz klasę User
, która reprezentuje pojedynczego użytkownika systemu i definiuje akcje, które można wykonać względem innych użytkowników. Można napisać ChangePassword
metody takie jak to ...
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.
...
}
Albo można wdrożyć kontroli bezpieczeństwa jako warunek z 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.
...
}
Jakie są zalety i wady tych dwóch metod ?
Można również wysunąć argument, że w niektórych przypadkach podany przykład * jest * poważnym błędem w kodzie. Na przykład, jeśli metoda, którą piszesz, jest pochowana kilka warstw w dół i cała weryfikacja ma się odbyć na zewnętrznej warstwie aplikacji, może to zostać uznane za część umowy tej metody. Wszystko zależy :) – porges
Dobra odpowiedź! Nie zdawałem sobie sprawy z niemożliwej do wyłapania natury 'ContractException', ale twoja odpowiedź wskazała mi właściwy kierunek: http://www.infoq.com/articles/code-contracts-csharp - thanks! :) –