小酌重構系列[22]——盡快返回


概述

閱讀文章時,如果某個段落已經傳達了關鍵信息,我們可能就不會逐字逐句地將文章讀完,因為我們已經知道了這篇文章的核心內容。
與此類似,如果方法中某些條件判斷可以得到結果,我們應該盡快返回該結果。

盡快返回可以帶來三個好處

  • 節省閱讀代碼的時間——如果方法能夠盡快返回,后面的代碼邏輯可以不必閱讀。
    見下圖,如果①已經返回了,就不必閱讀②部分的代碼
  • 避免執行無效的邏輯——如果方法能夠盡快返回,后面的代碼邏輯就不會被執行。
    見下圖,如果①已經返回了,②部分的邏輯不會被執行
  • 增強代碼的可讀性

 

image

分解大括號這篇文章中,我們已經用到了“盡快返回”這個重構策略。
在實現復雜的業務邏輯時,可能會形成多層的代碼嵌套,如果某些條件判斷可以得到結果,我們應該盡快返回這個結果,這也能夠減少嵌套層數,從而增強代碼的可讀性。

示例

下面沿用了分解大括號這篇文章中的實例,但我會從“盡快返回”的角度去講解這個示例。

重構前

Security類的HasAccess方法為了判斷用戶是否有權限訪問,直到方法的最后一行才返回結果。
這個方法有4層嵌套,它的可讀性本身是較差的,這意味着我們需要理解所有的嵌套邏輯,才能知道返回結果。

public class Security
{
    public ISecurityChecker SecurityChecker { get; set; }

    public Security(ISecurityChecker securityChecker)
    {
        SecurityChecker = securityChecker;
    }

    public bool HasAccess(User user, Permission permission, IEnumerable<Permission> exemptions)
    {
        bool hasPermission = false;

        if (user != null)
        {
            if (permission != null)
            {
                if (exemptions.Count() == 0)
                {
                    if (SecurityChecker.CheckPermission(user, permission) || exemptions.Contains(permission))
                    {
                        hasPermission = true;
                    }
                }
            }
        }

        return hasPermission;
    } 
}

public interface ISecurityChecker
{
    bool CheckPermission(User user, Permission permission);
}

HasAccess方法的邏輯可以分解為3個步驟:

  1. 當user或permission為null時,返回false
  2. 當參數permission是參數exemptions的一個元素時,返回true
  3. 返回SecurityChecker.CheckPermission(user, permission)的調用結果

下圖標示了這3個步驟。

image

這3個步驟都能決定方法的返回結果,它們之間沒有相互依賴性。
我們可以將這3個步驟分離開來,然后指定這3個步驟的執行順序,並盡快返回結果。

重構后

重構后,HasAccess方法的邏輯一目了然,它的3步邏輯都用到了return,易於閱讀和理解。

public class Security
{
    public ISecurityChecker SecurityChecker { get; set; }

    public Security(ISecurityChecker securityChecker)
    {
        SecurityChecker = securityChecker;
    }

    public bool HasAccess(User user, Permission permission, IEnumerable<Permission> exemptions)
    {
        if (user == null || permission == null)
            return false;

        if (exemptions.Contains(permission))
        {
            return true;
        }

        return SecurityChecker.CheckPermission(user, permission);
    } 
}

public interface ISecurityChecker
{
    bool CheckPermission(User user, Permission permission);
}

小結

如果能夠盡快得到結果,何必等到最后一刻?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM