1

我被安排在一个项目中,该项目有一个将按钮写入页面的凌乱类。该应用程序是一个文档管理器,并具有一个弹出式按钮列表,例如下载、电子邮件和打印。根据用户的角色和文档的状态,会显示不同的按钮。

在其他 WTF 中是这样的:

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

以此类推,直到我无法弄清楚发生了什么。

我不知道这是否只是更深层次的架构缺陷的副作用,或者是否有一种很好的方法来处理检查权限和状态值的混合。我应该把所有这些疯狂的条件放在一个方法中然后忘记它吗?不过,这对下一个继承项目的程序员没有好处。

4

4 回答 4

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 ;
    }
}

显然这是很多代码,所以我希望您可以重用许多私有方法。

于 2011-07-29T17:57:50.217 回答
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 的回答,但我会以另一种方式抛弃它,这种方式至少更具可读性,并为一些评论提供更好的位置。

于 2011-07-29T18:14:44.227 回答
0

你暂时拥有它;如果您已被分配重构它,请重构它。如果您还有其他更紧迫的问题,请处理它们,但如果可以的话,您应该利用空闲时间对其进行重构(不要做得太好,它们可能会让您成为永久所有者)。关于您的其他问题,安全性等,没有足够的信息。

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

于 2011-07-29T17:57:26.370 回答
0

老实说,示例代码看起来还不错。我当然见过更糟糕的情况。

它非常易读,没有“魔术字符串”或“魔术数字”。我相信你可以找到更紧迫的清理机会。

于 2011-07-29T17:58:20.367 回答