原代碼
typedef enum{
UserSex_Man,
UserSex_Woman
}UserSex;
@interface UserModel :NSObject
@property(nonatomic, strong) NSString *name;
@property (assign, nonatomic) int age;
@property (nonatomic, assign) UserSex sex;
- (id)initUserModelWithUserName:(NSString *)name withAge:(NSUInteger)age;
-(void)doLogIn;
@end
枚舉處有如下幾個槽點
- 不應(yīng)該用 typedef enum 這種 C 形式定義枚舉;既然做 iOS,就用 Apple 提供的東西。
- 性別規(guī)范書面的命名是 Gender/Male/Female,而非 Sex/Man/Woman/Boy/Girl 之類。
- 這一點可能是我多慮了:Male 和 Female 應(yīng)該是互斥的,結(jié)構(gòu)上用 Union 比較合適。但仍使用 enum 的原因兩個:一是常用且易讀;二是現(xiàn)實世界情況復(fù)雜,不排除極端情況。
- 要有前綴,且前綴以三個字母為宜。前綴個數(shù)其實是有爭議的,目前絕大多數(shù)的代碼,包括流行的開源庫都是兩個字母前綴,究其原因可能是兩個字母更好記,而且蘋果也不會剛剛好使用到和我們代碼相同兩個字母,so……實際情況和要求還是出入的。
類的地方有如下幾個槽點
- UserModel 的命名方式不太好。Model 是設(shè)計模型中的概念,不應(yīng)該將其命名到具體的代碼對象中,而且類型必須要有前綴,防止命名沖突,此處命名前綴取 BDK(Bai Du Knows)。
-
: 和 NSObject 之間要有空格。
- 屬性定義的地方 property / 括號 / 類型 / *變量名 之間應(yīng)該要有空格,此外符號
* 是和變量名緊貼。如 @property (nonatomic, copy) NSString* name; 就是一個不太好的命名習(xí)慣。
- 括號內(nèi)的修飾詞按需按一定順序排列,兩個修飾詞間的逗號后面應(yīng)當(dāng)有空格。具體的順序沒有硬性規(guī)定,我的習(xí)慣是 nonatomic 放前面,因為多數(shù)的屬性修飾詞都是 nonatomic,而其他修飾詞卻不一定一樣,把 nonatomic 放前面看起來比較整齊。
- NSString 類型變量用 copy 修飾比較安全。
- 屬性的類最好對齊。這點不知道算不算槽點,但對齊更好看(看下面的代碼 NSString *userName; 和下面兩行對齊)。
- 屬性 age 是非負(fù)整數(shù),所以使用 int 不太好,而且最好不要使用 C 的類型,應(yīng)該用 NSUInteger。
- 方法本身的間隔類似的,參照下系統(tǒng)方法的命名,具體就不多說了,看我最終的代碼間隔即可。
- doLogIn 槽點太多:
- login 本身就是一個動詞,如果非要拆開,應(yīng)該是 logOn/logOff,而非 logIn;
- 登錄接口竟然沒有參數(shù)。我使用了 NSDictionary 可以將所有登錄需要的信息全放在里面,便于擴(kuò)展和修改。
- 登錄方法沒有返回值,無法了解登錄情況,所以如果有個回調(diào)會更好。
- 初始化方法的槽點也挺多:
- 方法有返回值,所以方法名的開頭應(yīng)當(dāng)是返回內(nèi)容的名詞形式,而非動詞;
- 根據(jù)方法名的意思推測,返回值應(yīng)該是用戶信息。既如此,應(yīng)該直接用 BDKUserInfo 作為返回值類型。但也有可能這么做有其他用意,所以為了尊重原代碼的意思,我還是將返回值設(shè)為 instancetype,返回一個關(guān)聯(lián)類型。
更正過的代碼
- 前綴 BDK 取 Bai Du Knows
- 為什么類的屬性和方法不加前綴?因為它們編譯后不在頂級符號表。而且主流開源庫的屬性和方法命名時,也沒有對類的屬性和方法加前綴,已經(jīng)約定俗成。從可讀性的角度來說,加前綴是一種無奈之舉,降低了代碼的可讀性。
typedef NS_ENUM(NSInteger, BDKGender)
{
BDKMale,
BDKFemale
};
@interface BDKUserInfo : NSObject
@property (nonatomic, copy) NSString *userName;
@property (nonatomic, assign) NSUInteger userAge;
@property (nonatomic, assign) Gender userGender;
/**
* 登錄百度知道
*
* @param info 登錄所需信息
* @param successBlock 登錄成功 block
* @param failedBlock 登錄失敗 block
*/
- (void)loginWithInfo:(NSDictionary *)info
successBlock:(void(^)(NSDictionary *resultInfo))successBlock
failed:(void(^)(NSError *error))failedBlock;
/**
* 初始化用戶信息
*
* @param userName 用戶名
* @param userAge 用戶年齡
*
* @return 用戶信息
*/
- (instancetype)userInfoInitialedByUserName:(NSString *)userName
userAge:(NSUInteger)userAge;
@end
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。