我已经加入了一个项目,它有一个杂乱的类,可以将按钮写入页面。该应用程序是一个文档管理器,并有一个按钮的弹出列表,如下载,电子邮件和打印。根据用户的角色和文档的状态,将显示不同的按钮。
其他WTF中有这样的事情:
bool showEditButton = document.docTypeId == documentEnum.docType.text &&
( document.statusId == documentEnum.docStatus.Editable || (user.UserStatus == userEnum.Status.SuperUser) || ( user.UserID == document.CreatedByUserId ) )
依此类推,直到我无法弄清楚发生了什么。
我不知道这是否只是一个更深层次的架构缺陷的副作用,或者是否有一个很好的方法来处理检查权限和状态值的混合。我应该把所有这些疯狂的条件放在一个方法中而忘记它吗?这对下一个继承该项目的程序员没有好处。
答案 0 :(得分:2)
在您的示例中,它只是一堆布尔逻辑,但可以使用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 :(得分:1)
或者你可以使用:
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
虽然,我更喜欢Ryan的答案,但我会以另一种方式抛弃它,这种方式至少稍微可读,并为一些评论提供更好的位置。
答案 2 :(得分:0)
你暂时拥有它;如果你被指派重构它,重构它。如果你有其他更紧迫的问题,请处理它们,但如果可以,你应该利用业余时间重构它(不要做好工作,他们可能会让你成为永久所有者)。关于你的其他问题,安全等,没有足够的信息。
答案 3 :(得分:0)
老实说,示例代码看起来并不太糟糕。我当然看到了更糟糕的事情。
它非常易读,没有“神奇的字符串”或“神奇的数字”。我相信你可以找到更紧迫的清理机会。