Существуют ли причины, по которым вы не будете использовать кодовые контракты для обеспечения соблюдения бизнес-правил?
Представьте, что у вас есть класс User
, представляющий одного пользователя системы и определяющий действия, которые можно выполнять сдругие пользователи.Вы можете написать ChangePassword
метод, подобный этому ...
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.
...
}
Или вы можете реализовать проверку безопасности в качестве предварительного условия с 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.
...
}
Что такоепреимущества и недостатки этих двух методов?