IOS 封裝功能和邏輯思想


在ios開發中,難免會用到helper的思想。這篇就簡單講解下關於helper的簡單實用方法。

假設我們要做一個這樣的界面:

會議分為四種情況:

  • 未召開
  • 正在召開
  • 已結束
  • 已取消

再看看邏輯關系:

編程聯想:
當我們要開發某一種功能的時候,有的同學可能一上來就寫代碼,由於有一定的經驗,可能很快就實現了功能,但遇到業務復雜的功能,這么做就很容易寫出雜亂的代碼。我的習慣是,不妨先畫出邏輯圖,如果能夠事先確定一些大概的方法,就更好了,我們的目的就是使用精簡的代碼完成功能。

我們這個界面主要依賴Meeting模型,模型中我們用到幾個關鍵的屬性:

  • status 會議的狀態
  • join 是否加入會議 0:未加入 1:不出席 2:已出席
  • meetingtype 是否是視頻會議

我們為了把邏輯封裝到一個文件中,我們創建了QKYMeetingDetailHelper這個類。

我們需要通過一個方法,參數為Meeting模型,然后轉換成我們想要的結果。

+ (MeetingDetailStatus)parseMeetingStatusWithMeeting:(QKYMeetingContent *)meeting

按照這個功能的設計,最終會有5種不同的界面呈現出來,也就是說會有5種結果。按照結果,我們設計了一個枚舉MeetingDetailStatus

/*!
 @discussion 按照業務的要求,會議詳情目前會有5種不同的顯示結果
     *  1. 什么都不顯示:會議已取消 || 已結束 || 正在召開或未召開的前提下是主持人且會議不是視頻會議
     *  2. 顯示加入會議:未召開或正在召開 且不是主持人 join == 2
     *  3. 顯示發起會議:未召開或正在召開 且是是視頻會議
     *  4. 顯示確認出席和不能出席:未召開或正在召開,且不是主持人 join == 0
     *  5. 顯示不出席:未召開或正在召開,且不是主持人 join == 1
 */
typedef NS_ENUM(NSUInteger, MeetingDetailStatus) {
    MeetingDetailStatusNone,
    MeetingDetailStatusJoin,
    MeetingDetailStatusHold,       //發起
    MeetingDetailStatusIsJoin,     //是否參加
    MeetingDetailStatusRefuse,     //不出席
};

ps:在編程中,當我們遇到一個事物可能有幾種不同的情況的時候,我們就應考慮使用枚舉了,在swift中枚舉更加強大。

@interface QKYMeetingDetailHelper : NSObject

/**
 *  根據會議模型解析出我們需要現在的轉態
 *
 *  @param meeting 會議模型
 *
 *  @return 會議詳情的狀態
 */
+ (MeetingDetailStatus)parseMeetingStatusWithMeeting:(QKYMeetingContent * _Nonnull)meeting;

@end

在來看看實現方法:

+ (MeetingDetailStatus)parseMeetingStatusWithMeeting:(QKYMeetingContent *)meeting {
    
    NSParameterAssert(meeting);
    
    //根據Meeting模型中的status判斷會議狀態
    // 0:未召開, 1:正在召開, 2:已結束, 3:已取消
    
    // 已結束或者已取消
    if (meeting.status.integerValue == 2 || meeting.status.integerValue == 3) {
        return MeetingDetailStatusNone;
    }else {
        
        // 是否是主持人
        BOOL isHost = meeting.host.sysid.integerValue == appDelegate.account.ids.integerValue;
        // 是否是是視頻會議
        BOOL isVideo = meeting.meetingRoom.meetingtype.integerValue > 0;
        
        // 是主持人但不是視頻會議
        if (isHost && !isVideo) return MeetingDetailStatusNone;
        
        // 是主持人且是視頻會議
        if (isHost && isVideo) return MeetingDetailStatusHold;
        
        // 不是主持人且未選擇是否出席
        if (!isHost && meeting.join.integerValue == 0) return MeetingDetailStatusIsJoin;
        
        // 不是主持人且已選擇不出席
        if (!isHost && meeting.join.integerValue == 1) return MeetingDetailStatusRefuse;
        
        // 不是主持人且已選擇出席
        if (!isHost && meeting.join.integerValue == 2) return MeetingDetailStatusJoin;
    }
    
    
    return MeetingDetailStatusNone;
}

其實,這個邏輯算是比較簡單的了,遇到復雜點的,或者方法重復調用的時候,我們可以這樣寫:

 static BOOL getIsHost(QKYMeetingContent *meeting) {
	    
 return meeting.host.sysid.integerValue == appDelegate.account.ids.integerValue;
	}

我們不建議寫成這樣:

- (BOOL)getIsHost:(QKYMeetingContent *)meeting {
    
    return  meeting.host.sysid.integerValue == appDelegate.account.ids.integerValue;
}

前邊的寫法更加像是c的寫法。不但限制了訪問的權限,而且表示這是一個私有方法,和其他的點擊事件的方法區別開來。如果方法的調用頻率很大,那么可以考慮使用內聯函數來提高性能。

好了,使用方法就不介紹了,其實,怎么實現功能不重要,重要的是如何維護功能。helper就像一個管理者一樣,負責他自己的那部分工作,如果功能需要改變,我們改變helper就可以了。


免責聲明!

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



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