Определение комплексной безопасности и разрешений - PullRequest
1 голос
/ 29 июля 2011

Меня поместили в проект, в котором есть беспорядочный класс, который пишет кнопки на странице. Приложение представляет собой менеджер документов и имеет всплывающий список кнопок, таких как загрузка, электронная почта и печать. В зависимости от роли пользователя и состояния документа отображаются разные кнопки.

Среди других WTF есть что-то вроде этого:

bool showEditButton = document.docTypeId == documentEnum.docType.text && 
( document.statusId == documentEnum.docStatus.Editable || (user.UserStatus == userEnum.Status.SuperUser) || ( user.UserID == document.CreatedByUserId ) )

И так далее, и тому подобное, пока я не смогу понять, что происходит.

Я не знаю, является ли это просто побочным эффектом более глубокого архитектурного недостатка, или есть хороший метод для проверки комбинации разрешений и значений состояния. Должен ли я просто поместить все эти безумные условия в метод и просто забыть об этом? Впрочем, следующему программисту не выгодно наследовать проект.

Ответы [ 4 ]

2 голосов
/ 29 июля 2011

Это просто набор логической логики в вашем примере, но читаемость может быть очищена с помощью рефакторинга Compose Method. Если у вас есть класс, который принимает документ, и текущий пользователь, то у вас может быть что-то вроде:

public class DocumentPermissions
{
    private Document document;
    private User user;

    public DocumentPermissions(Document doc, User currentUser)
    {
        document = doc;
        user = currentUser;
    }

    public bool ShouldShowEditButton()
    {
        if(!IsTextDocument())
        {
            return false;
        }
        return IsSuperUser() || IsDocumentOwner() ||  DocumentIsEditable();
    }

    private bool IsTextDocument()
    {
        return document.docTypeId == documentEnum.docType.text;
    }

    private bool IsSuperUser()
    {
        return user.UserStatus == userEnum.Status.SuperUser;
    }

    private bool IsDocumentOwner()
    {
        return user.UserID == document.CreatedByUserId ;
    }

    private bool DocumentIsEditable()
    {
        return document.statusId == documentEnum.docStatus.Editable ;
    }
}

Очевидно, что это много кода, поэтому я надеюсь, что вы сможете повторно использовать многие частные методы.

1 голос
/ 29 июля 2011

В качестве альтернативы вы можете использовать:

bool showEditButton = (document.statusId == documentEnum.docStatus.Editable); //show if Editable..
showEditButton |= (user.UserStatus == userEnum.Status.SuperUser); //or a superuser or
showEditButton |= (user.UserID == document.CreatedByUserId); //the Creator
showEditButton &= (document.docTypeId == documentEnum.docType.text); //and a text Doc

Хотя я предпочитаю ответ Райана, я выброшу его для другого способа, который, по крайней мере, немного более читабелен и даст лучшее место для некоторых комментариев.

0 голосов
/ 29 июля 2011

Если честно, пример кода выглядит не так уж плохо. Я, конечно, видел намного хуже.

Он довольно читабелен и не имеет "магических строк" или "магических чисел". Я уверен, что вы можете найти более неотложные возможности для очистки.

0 голосов
/ 29 июля 2011

Вы владеете им на данный момент; если вам было поручено провести рефакторинг, рефакторинг. Если у вас есть другие более насущные проблемы, решайте их, но вам следует уделить свое свободное время, чтобы реорганизовать их, если вы можете (не делайте СЛИШКОМ хорошую работу, они могут сделать вас постоянным владельцем). Что касается других ваших вопросов, безопасности и т. Д., Недостаточно информации.

http://en.wikipedia.org/wiki/Refactoring

...