Objective-C符号化Tips

13573 ワード

[toc]

一般的な原則


ネーミングの曖昧さを避ける


Not Preferred
`displayName` /// Does it display a name or return the receiver’s title in the user interface?

コンシステンシ


プロジェクト全体のネーミングスタイルは一貫性を保つには、Appleと比較したほうがいい.Inc SDKのコードは統一されている.
Not Preferred
@interface MNMMovieCommentList : MTBModel

@property (nonatomic, strong) NSMutableArray *commentsList;
@property (nonatomic, strong) NSNumber *totalCount; // ( ), 

- (NSUInteger)dataCount;

@end

定数、変数、データ型


基本タイプ

  • 数値と通貨を組み合わせたmoneyクラス
  • は、1つの開始値と1つの終了値からなるrangeクラス
  • である.
    Not Preferred
    @property (nonatomic, assign) CGFloat totalRate;
    @property (nonatomic, assign) CGFloat musicRate;
    @property (nonatomic, assign) CGFloat pictureRate;
    @property (nonatomic, assign) CGFloat directorRate;
    @property (nonatomic, assign) CGFloat storyRate;
    @property (nonatomic, assign) CGFloat playRate;
    @property (nonatomic, assign) CGFloat impressionRate;
    
    NSDictionary *infoDic = @{
                    @"video" : @{
                        @"count" : self.movieDetailData.video.count ?  : @(0),
                        @"url" : self.movieDetailData.video.img ?  : @""
                    },
                    @"photo" : @{
                        @"count" : self.movieDetailData.stageImg.count ?  : @(0),
                        @"url" : ((MovieImageEntity *) [self.movieDetailData.stageImg.list mt_objectAtIndex:0]).imageUrl ?  : @""
                    }
                };
    

    定数

  • 定数は、#defineではなくstaticで静的定数として宣言する必要があります.実際には、変数がstaticとして宣言され、constとして宣言されると、コンパイラはシンボルを作成するのではなく、define前処理命令のように置き換えられます.
  • 定数があるコンパイルユニット、すなわち実装ファイル内に限られる場合、前にアルファベットkを加える.定数がクラス外で表示される場合、通常はクラス名を接頭辞とします.

  • Preferred
    static const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration = 0.4
    

    Not Preferred
    - (MNEMemberProgress)p_memberProgress:(CGFloat)floatEmpirical
    {
        floatEmpirical = floatEmpirical > 0 ? floatEmpirical : 0;
    
        if (floatEmpirical >= 8000)
        {
            return MNEMemberProgress_Diamond;
        }
        else if (floatEmpirical >= 3000)
        {
            return MNEMemberProgress_Platinum;
        }
        else if (floatEmpirical >= 1000)
        {
            return MNEMemberProgress_Gloden;
        }
        else if (floatEmpirical >= 200)
        {
            return MNEMemberProgress_Silver;
        }
        else
        {
            return MNEMemberProgress_Normol;
        }
    }
    

    ブール値

  • Objective-CはYESとNOを使用します.
  • trueとfalseはCoreFoundation、CまたはC++コードで使用されます.
  • BOOLはObjective-Cでsigned charと定義され、8ビットに設定できる.ただしYESは1と定義されている.

  • Not Preferred
    self.baseTableView.showsHorizontalScrollIndicator = FALSE;
    
    if (self.arraySectionBtns == nil)
    {
        self.arraySectionBtns = [NSMutableArray array];
    }
    
    if (self.isSubscribe == YES)
    {
        return;
    }
    

    こうぶん糖


    より可読性の高い構文糖を用いてNSArray,NSDictionaryなどのデータ構造を構築し,冗長なalloc,init法の使用を避けるべきである.

    演算子、式


    さんこうえんざんし


    1つの条件文のすべての変数はすでに評価されているはずです.そうでない場合、複数の条件付き句を計算すると、文がより理解しにくくなります.
    三元演算子の2番目のパラメータが条件文でチェックしたオブジェクトと同じオブジェクトを返す場合は省略できます.
    Preferred
    result = object ? : [self createObject];
    

    ifネスト


    if文をネストしないでください.複数のreturnを使用すると、ループの複雑さを回避し、コードの可読性を向上させることができます.メソッドの重要な部分がブランチにネストされていないため,関連するコードを明確に見つけることができる.
    Not Preferred
    - (BOOL)handleSchemeOpenURL:(NSURL *)aUrl
    {
        NSString *stringScheme = aUrl.scheme;
        NSString *stringHost = aUrl.host;
    
        ///  Scheme Host 
        if ([stringScheme mt_compareCaseInsensitive:mnkScheme_mtime])
        {
            if ([stringHost mt_compareCaseInsensitive:mnkScheme_host])
            {
                return [self handleAppLinkUrl:aUrl animation:NO];
            }
        }
        return NO;
    }
    

    かっこ計算の優先順位の指定


    Not Preferred
    if(*p++)
    

    複雑な条件式

  • 複雑なif句がある場合は、それらを抽出してBOOL変数に割り当てるべきであり、論理をより明確にし、各句の意味を体現することができる.
  • は、一時変数の代わりにクエリーを使用するのに適しています.結局、一時変数は、その関数にのみ意味があり、限界が大きく、関数はオブジェクトの生命全体にわたって有用であり、他のオブジェクトによって使用することができます.

  • Not Preferred
    if (!badgeValue || [badgeValue isEqualToString:@""] || ([badgeValue isEqualToString:@"0"] && self.shouldHideBadgeAtZero))
        {
            //        [self removeBadge];
            self.badge.hidden = YES;
        }
    

    せいぎょぶん


    Switch


    オブジェクト向けのマルチステート概念を用いてSwitch文を避けることができる.
    Preferred
    [MNCTempletTableViewCell templetTableViewCellWithTableView:tableView indexPath:indexPath Type:model.templetType BeUsedIn:MNETempletBeUsedIn_IndexSelected]
    
    [(MNCTempletTableViewCell *) cell mt_setObject:model]
    

    関数#カンスウ#


    長すぎる関数


    注釈で何かを説明する必要があると感じるたびに、説明する必要があるものを独立した関数に書き、その用途で名前を付けます.各関数の粒度が小さいと、関数が多重化される機会が大きくなり、関数の上書きも容易になります.粒度の小さい関数は、上層関数を一連の注釈のように読むことができます.

    長すぎるパラメータ列


    パラメータオブジェクトを使用して問題を解決します.
    Preferred
    - (void)updateContent:(MNMTempletBottomView *)modleTempletBottomView
    

    プライベートメソッド


    プライベートメソッドでは、接頭辞を使用して表示されます.
    Preferred
    - (void)p_privateFunction{}
    

    クエリー関数と修正関数を分離


    ある関数は、オブジェクトのステータス値を返し、オブジェクトのステータスを変更します.クエリー関数と修正関数を分離する必要があります.戻り値のある関数は、見える副作用を持つべきではありません.

    繰り返しコード

  • 同じクラスの2つの関数は、同じ式
  • を含む.
  • 兄弟の2つのサブクラスには、同じ式
  • が含まれています.
  • 無関係なクラスには同じ式が現れる
  • パッケージのダウンシフト


    関数が返すオブジェクトは、関数呼び出し者によってダウンシフトされる必要があります.この場合、ユーザーに下への転換の責任を負わせるべきではなく、できるだけ正確なタイプを提供するべきです.
    Not Preferred
    - (NSNumber *)obtainPayEndTime
    {
        return _modelOrderDetail.payEndTime;
    }
        self.requestReSendSMS.stringSubOrderID = [[self obtainSubOrderId] stringValue];
    

    クラス#クラス#


    大きすぎるクラス


    Objective-C


    列挙タイプ


    NS_の使用ENUMは、強力なタイプのチェックを取得します.
    Not Preferred
    typedef enum : NSUInteger {
        ///  
        MNE_Member_PopType_Level = 1,
        ///  
        MNE_Member_PopType_Birthday = 2
    } MNE_Member_PopType;
    

    Preferred
    typedef NS_OPTIONS(NSUInteger, NSWindowMask) {
        NSBorderlessWindowMask      = 0,
        NSTitledWindowMask          = 1 << 0,
        NSClosableWindowMask        = 1 << 1,
        NSMiniaturizableWindowMask  = 1 << 2,
        NSResizableWindowMask       = 1 << 3
    };
    

    ツールバーの

  • BOOL属性を記述する語が形容詞である場合、setterはis接頭辞を持つべきではないが、対応するgetterアクセサはこの接頭辞を持つべきである.
  • は、常にポイント構文を使用して属性にアクセスおよび変更する必要があります.

  • Preferred
    @property(nonatomic,getter=isOn) BOOL on;
    

    Not Preferred
    if ([objet isKindOfClass:[NSArray class]])
    {
        return [(NSArray *) objet count];
    }
    ///  
    return self.arrayDataSourceItems.count;
    

    new()

  • NSObjectクラスのnew()メソッドを呼び出したり、そのサブクラスにこのメソッドを書き換えたりしないでください.
  • allocは、オブジェクトを保存するのに十分なメモリを割り当てること、isaポインタを書き込むこと、参照カウントを初期化すること、およびすべてのインスタンス変数をリセットすることを含むオブジェクトの作成を担当します.
  • initは、オブジェクトの初期化を担当します.これは、オブジェクトを使用可能な状態にすることを意味します.これは、通常、オブジェクトのインスタンス変数に合理的で有用な値を与えることを意味します.

  • instancetype


    instancetypeを使用して、コンパイラが結果タイプを正確に推定していることを確認します.
    Preferred
    + (instancetype)personWithName:(NSString *)name;
    

    Lazy Loading


    Preferred
    - (NSDateFormatter *)dateFormatter {
      if (!_dateFormatter) {
        _dateFormatter = [[NSDateFormatter alloc] init];
            NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
            [_dateFormatter setLocale:enUSPOSIXLocale];
            [_dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS"];
      }
      return _dateFormatter;
    }
    

    エラー処理


    Important: Success or failure is indicated by the return value of the method. Although Cocoa methods that indirectly return error objects in the Cocoa error domain are guaranteed to return such objects if the method indicates failure by directly returning nil or NO, you should always check that the return value is nil or NO before attempting to do anything with the NSError object.
    メソッドが参照によってエラーパラメータを返す場合は、エラーパラメータの状態ではなく、戻り値の状態を検出する必要があります.
    Preferred
     NSError *anyError;
        BOOL success = [receivedData writeToURL:someLocalFileURL
                                        options:0
                                          error:&anyError];
        if (!success) {
            NSLog(@"Write failed with error: %@", anyError);
            // present error to user
        }
    

    Not Preferred
        NSError *error = nil;
        BOOL isSucess = [[NSFileManager defaultManager] removeItemAtPath:self.stringFilePathCaches
                                                                   error:&error];
        if (error)
        {
            if (mtkString_Is_Valid(error.localizedDescription))
            {
                //  , 
                NSString *stringErrorLog = [NSString stringWithFormat:@" “MIT_Caches”   ,
    :%@", error.localizedDescription]; stringErrorLog = stringErrorLog; LOG_Foundation_Info_(@"%@", stringErrorLog); } } return isSucess;

    ARC下の関数の名前付け


    ARCは、ネーミング規則によりメモリ管理規則を標準化する.メソッド名が次の語で始まると、返されるオブジェクトは呼び出し元の所有になります.メソッド名が上記の4つの語で始まると、返されたオブジェクトが呼び出し者の所有ではないことを示す場合、返されたオブジェクトは自動的に解放されます.
  • alloc
  • new
  • copy
  • mutableCopy

  • Not Preferred
    - (void)newShareContent:(ShareViewContent *)aModelContent
           statisticsParams:(NSDictionary *)aDicStatistics;
    

    CGRect


    Your application can standardize a rectangle—that is, ensure that the height and width are stored as positive values—by calling the CGRectStandardize function. All functions described in this reference that take CGRect data structures as inputs implicitly standardize those rectangles before calculating their results. For this reason, your applications should avoid directly reading and writing the data stored in the CGRect data structure. Instead, use the functions described here to manipulate rectangles and to retrieve their characteristics.
    CGGeometry
    Preferred
    CGRect frame = self.view.frame;
    
    CGFloat x = CGRectGetMinX(frame);
    CGFloat y = CGRectGetMinY(frame);
    CGFloat width = CGRectGetWidth(frame);
    CGFloat height = CGRectGetHeight(frame);
    

    NS_DESIGNATED_INITIALIZER

  • クラスインスタンスを作成する方法が1つ以上ある場合、このクラスには複数の初期化方法がありますが、そのうちの1つを全能初期化方法として選択し、他の初期化方法を呼び出します.これにより、下位データストレージメカニズムが変更されると、このメソッドのコードを変更するだけでよく、他の初期化メソッドを変更する必要はありません.サブクラスの全能初期化メソッドがスーパークラスメソッドの名前と異なる場合は、必要に応じて例外を放出するスーパークラスの全能初期化メソッドを上書きする必要があります.
  • 各サブクラスの全能初期化方法は、そのスーパークラスの対応する方法を呼び出し、階層ごとに上に進むべきである.
  • は、NS_DESIGNATED_INITIALIZERを使用して、全能初期化方法を示す.

  • isEqual:

  • 等化が実現されるとき、isEqualとhashメソッドを同時に実現する必要があるという約束を覚えておく.2つのオブジェクトがisEqualで等しいと判断された場合、hashメソッドは同じ値を返す必要があります.しかしhashが同じ値を返すと,それらが等しいことは保証されない.
  • hashメソッドは定数を返すことができないことに注意してください.これは典型的なエラーであり、実際にはhashメソッドの戻り値がhashハッシュリスト内のオブジェクトのkeyとして機能し、hashテーブルの100%の衝突をもたらすため、深刻な問題を引き起こす可能性があります.

  • Not Preferred
    - (NSUInteger)hash
    {
        return 1;
    }
    

    Notification


    [トリガ通知のクラス名]+[Did|Will]+[アクション]+Notification
    Preferred
    NSApplicationDidBecomeActiveNotification
    NSWindowDidMiniaturizeNotification
    NSTextViewDidChangeSelectionNotification
    NSColorPanelColorDidChangeNotification
    

    Clang


    変数を使用しないコンパイル警告を無視


    Preferred
    - (NSInteger)giveMeFive
    {
        NSString *foo;
        #pragma unused (foo)
        return 5;
    }
    

    寸法、警告、エラー


    Preferred
    /// MARK:a
    /// TODO:b
    /// FIXME:c
    /// !!!: d
    /// ???:e
    
    #error Whoa, buddy, you need to check for zero here!
    
    #warning Dude, don't compare floating point numbers like this!
    
    

    アサーションの導入


    コメント


    self-documenting


    その他


    パッケージングセット


    クラスでは、インスタンスのセットを保存するためにコレクションを使用することがよくあります.集合の処理方式は他の種類のデータと異なるべきである.値取り関数は、集合自体を返すべきではありません.これは、集合の内容を変更するために集合所有者が何も知らないためです.
    Not Preferred
    @interface MNMMovieCommentList : MTBModel
    @property (nonatomic, strong) NSMutableArray *commentsList;
    - (void)replaceByNewMovieCommentListEntity:(MNMMovieCommentList *)newMovieCommentListEntity;
    - (void)addObjectsFromNewMovieCommentListEntity:(MNMMovieCommentList *)newMovieCommentListEntity;
    @end
    

    Preferred
    - (void)addElement:(elementType)anObj;
    - (void)removeElement:(elementType)anObj;
    - (NSArray *)elements;
    

    略語


    略語

    参考資料

  • https://baike.baidu.com/item/再構築:既存のコードの設計を改善/9277420
  • https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html#//apple_ref/doc/uid/10000146-SW1
  • https://github.com/github/objective-c-style-guide
  • https://github.com/raywenderlich/objective-c-style-guide
  • https://github.com/NYTimes/objective-c-style-guide
  • http://www.jianshu.com/p/25938c097e25