Есть ли какие-либо причины, по которым вы не используете кодовые контракты для обеспечения соблюдения бизнес-правил?
Представьте, что у вас есть класс 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.
...
}
Каковы преимущества и недостатки этих двух методов?