Определение комплексной безопасности и разрешений
Я был помещен в проект, который имеет грязный класс, который пишет кнопки на странице. Приложение представляет собой менеджер документов и имеет всплывающий список кнопок, таких как загрузка, электронная почта и печать. В зависимости от роли пользователя и состояния документа отображаются разные кнопки.
Среди других WTF есть что-то вроде этого:
bool showEditButton = document.docTypeId == documentEnum.docType.text &&
( document.statusId == documentEnum.docStatus.Editable || (user.UserStatus == userEnum.Status.SuperUser) || ( user.UserID == document.CreatedByUserId ) )
И так далее и тому подобное, пока я не могу понять, что происходит.
Я не знаю, является ли это просто побочным эффектом более глубокого архитектурного недостатка, или есть хороший метод для проверки комбинации разрешений и значений состояния. Должен ли я просто поместить все эти безумные условия в метод и просто забыть об этом? Это не пойдет на пользу следующему программисту, который унаследует проект.
4 ответа
Это просто набор логической логики в вашем примере, но читаемость может быть очищена с помощью рефакторинга 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 ;
}
}
Очевидно, что это много кода, поэтому я надеюсь, что вы сможете повторно использовать многие частные методы.
В качестве альтернативы вы можете использовать:
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
Хотя я предпочитаю ответ Райана, я выброшу его для другого способа, который, по крайней мере, немного более читабелен и даст лучшее место для некоторых комментариев.
Если честно, пример кода выглядит не так уж плохо. Я конечно видел намного хуже.
Это вполне читабельно и не имеет "магических строк" или "магических чисел". Я уверен, что вы можете найти более неотложные возможности для очистки.
Вы владеете им в настоящее время; если вам было поручено провести рефакторинг, рефакторинг. Если у вас есть другие более насущные проблемы, решайте их, но вам следует уделить свое свободное время, чтобы реорганизовать их, если вы можете (не делайте ОЧЕНЬ хорошей работы, они могут сделать вас постоянным владельцем). Что касается других ваших вопросов, безопасности и т. Д., Недостаточно информации.