代碼槽點

原代碼

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)會更好。
  • 初始化方法的槽點也挺多:
    • 方法名中的 Model 和之前提到的問題一致;
    • 方法有返回值,所以方法名的開頭應(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評論 19 139
  • 晚上在健身房正練的虛脫的時候老爸發(fā)來視頻,手機(jī)視頻聲音一響,就知道應(yīng)該是爸媽,健身房信號不好,斷斷續(xù)續(xù),也因為是節(jié)...
    Angelerqi閱讀 377評論 0 0
  • 今天回到家兒子已經(jīng)很積極的把作業(yè)做完了,正在看他喜愛的動畫片。兒子說今天晚上老師和家長們跳廣場舞,孩子媽媽也很想...
    程康媽媽閱讀 273評論 0 0
  • 努力勸慰自己寬心,不想把不開心帶到床上,他們說睡覺是一件開心的事情。 而現(xiàn)在我無法做到,一躺下便情緒泛濫。爬起來,...
    山南南閱讀 266評論 0 1
  • 細(xì)細(xì)密密的雨如煙霧,聽不到雨落的聲音,只看到一朵朵傘花涌進(jìn)校園。剛近教室,馬老師就笑著對我說:孩子們早就盼著你來了...
    chunma閱讀 502評論 0 2

友情鏈接更多精彩內(nèi)容