Следует ли использовать контракты кода для обеспечения безопасности?

Есть ли какие-либо причины, по которым вы не используете кодовые контракты для обеспечения соблюдения бизнес-правил?

Представьте, что у вас есть класс 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.
    ...
}

Каковы преимущества и недостатки этих двух методов?

6
задан Richard Poole 13 January 2011 в 23:21
поделиться