A truly happy person is one who can enjoy the scenery while on a detour.真正快樂(lè)的人在走彎路時(shí)也不忘享受風(fēng)景。 ????

內(nèi)容來(lái)自有道詞典
1、Review模塊:留言模塊
2、代碼位置:KSStory -> Moudles -> Story -> Other -> Comment 。
3、代碼結(jié)構(gòu)示意圖

4、目錄說(shuō)明:
【Cell】 UITableView相關(guān)UIView。
【Model】留言相關(guān)的數(shù)據(jù)模型。
【Category】 按功能對(duì)模塊進(jìn)行分解,eg:分享,通知處理,網(wǎng)絡(luò)請(qǐng)求,tableView代理回調(diào)。
【Manager】 工具類(lèi),用于語(yǔ)音等的處理。
【View】 留言模塊自定義的View。
【ViewController】 留言模塊的ViewController
5、代碼中出現(xiàn)的問(wèn)題或不合理的地方

1、這里的頭文件暫時(shí)比較少,如果特別多,堆放在一起,如果想刪除或查找某個(gè).h文件,就會(huì)變的非常麻煩。
2、還有在.h中盡可能減少頭文件的導(dǎo)入,必要時(shí)可以使用@class前向聲明
3、不只有.h,所有的文件,導(dǎo)入頭文件都應(yīng)該劃分模塊
建議修改如下:

這樣做的好處就是查找,增加或者刪除某個(gè)頭文件時(shí),可以快速方便的定位。
typedef void (^CommentNumberBlock)(NSString *str);
在這里聲明了一個(gè)block,但是項(xiàng)目中沒(méi)有使用,這代碼應(yīng)該是以前使用過(guò),后期改版,忘記了刪除,在做模塊改版,或者代碼優(yōu)化時(shí),應(yīng)該及時(shí)的刪除。

1、屬性沒(méi)有按功能分塊。
2、在.h中聲明的屬性,如果在被的地方?jīng)]有賦值操作,建議在.h中將其讀寫(xiě)操作聲明為readonly。
3、命名全部統(tǒng)一采用駝峰命名法。
4、如果這個(gè)屬性只在本模塊內(nèi)使用,建議將其放到extension中。不要暴露在.h,保證其封裝性。
5、命名要有意義,沒(méi)有意義的,需要加注釋說(shuō)明。
6、每個(gè)屬性,書(shū)寫(xiě)請(qǐng)留空行,不要一個(gè)接一個(gè)。eg:@interface 之后需要留空行,每個(gè)property之后也留空行。
@interface KSStoryCommentViewController () {
BOOL _wasKeyboardManagerEnabled;
}
減少成員變量的聲明和使用,能用屬性,統(tǒng)一用屬性。
這種完全可以用屬性代替。

1、 圖中箭頭所示的地方,都應(yīng)該留換行。
2、dealloc中的移除kvo的方法應(yīng)該統(tǒng)一封裝到一個(gè)方法中,而不應(yīng)該在堆在一起,eg:viewWillAppear中的方法
3、多余的注釋不要添加,像【NOTICFICATIONCENTER_REMOVEOBSERVER】這種宏定義,大家都看得懂。

見(jiàn)解在圖上。

代碼需要封裝。

網(wǎng)絡(luò)請(qǐng)求不應(yīng)該出來(lái)在主類(lèi)中。應(yīng)該放到對(duì)應(yīng)的模塊的request的category中去。

UI的操作,要放到主線程。

1、tableview等屬于vc.view的子view,所以,方法名參考其他頁(yè)面,configSubviews。
2、 不同的view的配置需要換行。
3、對(duì)table的處理可以單獨(dú)封裝一個(gè)方法。

1、無(wú)用的注釋請(qǐng)刪除。
2、下面兩個(gè)方法的注釋也可以去掉。從方法名就能看懂。

pragma mark - config 這種要放在合適的地方。

這種奇怪的魔法數(shù)字,和代碼邏輯,需要加注釋?zhuān)瑸槭裁催@么寫(xiě)。

1、isExistInTable 的查詢(xún)判斷直接封裝到clearTable這個(gè)方法中。防止忘記判斷而造成錯(cuò)誤。
2、weak和strong請(qǐng)使用項(xiàng)目中同一的宏定義。

1、數(shù)據(jù)源的初始化,直接放在viewdidload中去 一行代碼實(shí)現(xiàn),self.dataArr = @[].mutableCopy;并且容器類(lèi)的屬性,建議用字面量語(yǔ)法, 原因自己去查。
2、setter方法,需要和getter分開(kāi)。

1、 這種工具類(lèi),如果不是一個(gè)單例,建議命名為XxxTool。
2、有clear,應(yīng)該有對(duì)應(yīng)的save。
3、或者這種建議直接寫(xiě)到對(duì)應(yīng)的category中去。

1、iden3 是什么情況。而且這種Cell的Identifier 應(yīng)該用常量字符串,聲明在最前面。在多處使用時(shí),可以復(fù)用,防止手動(dòng)拼寫(xiě)的錯(cuò)誤。

UI空間在這里創(chuàng)建完,buttonIndex的點(diǎn)擊事件,請(qǐng)分離出去,封裝一個(gè)方法。不要將網(wǎng)絡(luò)請(qǐng)求直接,丟里面。

關(guān)于config view,單獨(dú)放到,vc+config這樣的category中。

字符串判空,用對(duì)應(yīng)的全局的宏

字典的添加數(shù)據(jù)時(shí),最好做個(gè)判空處理。

對(duì)留言的cell的刪除,點(diǎn)贊等操作,拆分到category中,不要都放在table的delegate的category中。

關(guān)于toast,不要把不想關(guān)的toast展示給用戶(hù),使用jy_show_toast_error(error.code);即可。

不要使用blockkit三方框架。

這種對(duì)URL的處理,使用統(tǒng)一的工具類(lèi)進(jìn)行處理。

share模塊不應(yīng)該出現(xiàn)網(wǎng)絡(luò)請(qǐng)求,應(yīng)該拆分到對(duì)的request模塊。

參數(shù)處理,如果參數(shù)較多,可以放到一個(gè)方法處理??梢苑旁诰W(wǎng)絡(luò)請(qǐng)求方法的后面。

1、 block 的回調(diào)請(qǐng)做判斷。
2、可變數(shù)組,添加完數(shù)據(jù)后,最好copy后再傳給block。
3、網(wǎng)絡(luò)請(qǐng)求error回調(diào),如果不需要做特殊的處理,不用回調(diào),直接在網(wǎng)絡(luò)請(qǐng)求中做error的toast即可。

這種類(lèi)的拓展,如果公共的拓展沒(méi)有,需要放到公共的地方。不要放在這里。

1、添加subviews封裝一個(gè)方法。
2、layoutsubviews,也封裝一個(gè)方法。

1、方法名有點(diǎn)歧義。

這種類(lèi)型強(qiáng)制轉(zhuǎn)換的,做個(gè)判斷,防止在調(diào)用后面的方法,造成crash

重復(fù)的事干一次。
6、一些建議
1、請(qǐng)合理的利用extension和category,做到對(duì)代碼的完美拆分。
2、減少對(duì)單例的使用。
3、有遺漏的地方歡迎補(bǔ)充。
Done.