一:設(shè)計模式
1:本項目采用mvvm設(shè)計模式,每個模塊下分為四個文件夾,分別為:ControllerViewViewModelModel
Controller:控制器文件夾 在此文件夾中只存放模塊相關(guān)控制器,控制器中只做UI初始化 刷新UI 響應(yīng)用戶事件 跳轉(zhuǎn)邏輯判斷等和業(yè)務(wù)無關(guān)操作,所有業(yè)務(wù)處理放到ViewModel中處理
View:自定義視圖文件夾 在此文件夾中存放該模塊相關(guān)的視圖,比如自定義的cell,定制的view等.
Model:數(shù)據(jù)模型? 如果一個view需要設(shè)置的屬性比較多,建議創(chuàng)建一個數(shù)據(jù)模型,并通過數(shù)據(jù)模型去給view賦值
ViewModel:業(yè)務(wù)邏輯管理? 這此處理模塊相關(guān)的業(yè)務(wù)邏輯,比如:網(wǎng)絡(luò)請求? 各種代理? 數(shù)據(jù)邏輯判斷(PS:輸入數(shù)據(jù)是否合法)等, 并通過block方式提供處理結(jié)果給Controller使用,這里不建議使用通知方式返回結(jié)果
二:項目框架整體結(jié)構(gòu),如下圖所示
項目結(jié)構(gòu)圖
1:Frameworks文件夾? 存放系統(tǒng)庫的虛擬文件夾,搭建框架的時候需要手動添加一個名稱為Frameworks的虛擬文件夾,這樣在Build Phases 中添加的系統(tǒng)庫會自動歸入此文件夾,不會直接在外部顯示以至于打亂目錄結(jié)構(gòu)
2:AppDlegate文件夾? 這個目錄下放的是AppDelegate.h(.m)文件,是整個應(yīng)用的入口文件,這里需要添加一些入口相關(guān)類以保持一個簡潔的AppDelegate,所以單獨(dú)建立了一個文件夾
3:Class文件夾? 項目業(yè)務(wù)主體,日常大部分開發(fā)代碼均在這里,里面包含項目所有的業(yè)務(wù)邏輯,下圖創(chuàng)建了三個大的分類業(yè)務(wù),每個業(yè)務(wù)下面的小業(yè)務(wù)再次分層次實(shí)現(xiàn)
Class業(yè)務(wù)模塊
4:Gategory文件夾 主要用來存放公共擴(kuò)展類,主要存儲一些對系統(tǒng)庫的擴(kuò)展
5:Libs文件夾 主要存放要用到的第三方類庫和項目中自己實(shí)現(xiàn)的公共類庫,可分文件夾分別存儲. 本項目也用到cocopods管理第三方庫,如果是不需要改動源碼直接使用的建議使用cocopods管理,如果需要改動源碼,強(qiáng)烈建議直接放入Libs文件夾中管理,以免更新pods代碼時把修改的代碼更新掉
6:Global文件夾? 存放全局的配置文件,包括pch文件,一些全局的宏定義文件等
7:Utils文件夾 項目相關(guān)輔助類,存放相關(guān)的數(shù)據(jù)請求,支付相關(guān)類,數(shù)據(jù)庫操作相關(guān)類等
8:General文件夾? 通用類,存儲項目移植過程中不需要更改就能直接使用的類
9:Resource文件夾? 資源文件夾,用來存放和項目有關(guān)的資源,比如圖片資源,文件資源等
10:Base文件夾? 基類,存儲項目中需要用到的基類,比如全局初始化的viewController父類, 彈窗父類, 展示表父類等
三:模塊結(jié)構(gòu)
1:每個大的模塊如果含有較多的小模塊建議多次分級(文件夾),以避免在一個模塊中放入過多的類代碼導(dǎo)致查找麻煩
2:模塊命名可以漢字也可以英文,但要做到見名知意,比如:
模塊層級結(jié)構(gòu)
四: 類結(jié)構(gòu)
1: 命名: 所有的命名都要做到見名知意, 使用英文,并且結(jié)尾要使用能表明該類或者屬性 類型的文字(PS: viewController label button array model? viewModel等)
1.1 采用大駝峰命名法,PS:PayHistoryViewController(表明是 支付歷史 并且是個 控制器)
1.2: 屬性命名: 采用小駝峰命名, 屬性和屬性之間換行已做區(qū)分, 實(shí)例變量命名要用_xxx方式
{// 數(shù)據(jù)源NSArray*_dataArray;// 存放選中cell的字典 NSDictionary*_selectedCellDic;}
如果是全局屬性并且在.h文件中,使用文檔注釋表明屬性的作用,(要注意空格 比如@property(nonatomic, strong)UILabel后面都有空格)如:
/**
* 剩余簽章次數(shù)
*/@property(nonatomic,strong)UILabel*timesTextLabel;/**
* 勾選
*/@property(nonatomic,strong)UIButton*checkBtn;/**
* 我已閱讀并同意
*/@property(nonatomic,strong)UILabel*readLabel;
如果在.m文件中,使用//注釋說明 表明屬性的作用,如:
// 剩余簽章次數(shù)@property(nonatomic,strong)UILabel*timesTextLabel;`// 勾選@property(nonatomic,strong)UIButton*checkBtn;`// 我已閱讀并同意@property(nonatomic,strong)UILabel*readLabel;
如果是局部變量,根據(jù)情況判斷是否要加注釋(只需要加//注釋);
1.3 方法命名 同樣的采用小駝峰命名,? 注釋方式和屬性相同,如有必要可以添加#pragma mark注釋, 如果有參數(shù),并采用多行注釋如有必要要在注釋中 表明 參數(shù)的含義. 當(dāng)參數(shù)較多時要換行以方便查看.如:
/**
*? 在window上展示
*? model? ? ? ? ? ? ? ? :數(shù)據(jù)模型
*? signUnitPrice? ? ? ? :單價
*? payTapBlock? ? ? ? ? :支付點(diǎn)擊事件
*? cancelTapBlock? ? ? ? :取消支付點(diǎn)擊事件
- (void)showWithProduct:(PayProductModel *)model
? ? ? ? ? signUnitPrice:(NSInteger)signUnitPrice
? ? ? ? ? ? payTapBlock:(void(^)(void))payTapBlock
? ? ? ? cancelTapBlock:(void(^)(void))cancelTapBlock;
方法聲命和實(shí)現(xiàn)時要注意空格,-(或者+)后面要有空格,{前面有空格,后面換行,方法和方法之間要換行,
2: 結(jié)構(gòu):
2.1 首先是 頭文件導(dǎo)入
2.2 全局屬性定義 相關(guān)宏定義 常量定義
2.3 聲命周期函數(shù)
2.4 用戶交互事件操作(各種點(diǎn)擊事件,刷新事件,界面跳轉(zhuǎn)事件)
2.5 子視圖初始化
五: 補(bǔ)充
5.1 簡寫補(bǔ)充 在定義屬性和方法時, 可以使用眾所周知的簡寫代替
5.2 事件補(bǔ)充 點(diǎn)擊事件使用xxxTapAction長按事件使用xxxLongPressAction
5.3 block補(bǔ)充? block聲命時 要使用copy, 命名時要使用大駝峰命名法,如:@property (nonatomic, copy) void (^PayTapAction)(void);
5.4 空格位置補(bǔ)充? 所有的操作符前后要加空格如:+-*/&&||<>=等
// 這里要主要空格for(inti=0;i<3;i++){}if(1){}else{// 這里else不要換行}while(1){}//? 這里break和 default不能忘記 switch(1){case1:break;default:break;}