2011-06-03 39 views
1

最近我碰到這個Objective-C的編碼風格:這種編碼風格有什麼好處?

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    NSFetchRequest  *fetchRequest; 
    NSEntityDescription *entity; 
    NSSortDescriptor *sortDescriptor; 
    NSArray    *sortDescriptors; 
    NSError    *error; 

    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 

    entity = [NSEntityDescription entityForName:@"Deck" inManagedObjectContext:self.managedObjectContext]; 

    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]; 
    sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 

    fetchRequest = [[NSFetchRequest alloc] init]; 

    [fetchRequest setEntity:entity]; 
    [fetchRequest setFetchBatchSize:20]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
    _fetchedResultsController.delegate = self; 

    error = nil; 

    if (![self.fetchedResultsController performFetch:&error]) { 
     DLog(@"Failed fetching decks: %@, %@", [error localizedDescription], [error userInfo]); 
    } 

    // etc... 

我說的事情是在方法的頂部聲明。那個有什麼用途?這是不錯的做法嗎?它似乎增加了代碼的一些清晰度,因爲您可以即時查看該方法將使用哪些變量,對嗎?

+0

解析器不再強制使用此語法,但_i_喜歡它,它很好地閱讀 – bshirley 2011-06-03 15:19:11

回答

8

一方面,它增加了清晰度,當你立即看到該方法將使用什麼變量。這是C語言的遺留問題,因爲你不得不在塊的中間允許聲明,所以你必須聲明括號塊頂部的所有變量。

另一方面,有人可能會爭辯說變量聲明有時遠離它們第一次被使用的地方,所以它無助於理解變量的用途。我認爲這只是一個品味問題。

+1

它不是真正關於「立即查看該方法將使用哪些變量」。這樣做的目的是讓您快速找到變量的定義(特別是類型),只需查找當前塊的頂部,由於縮進通常很容易定位。 – alastair 2011-06-03 14:40:31

3

我無法想象「立即看到該方法將使用哪些變量」的好處,但我發現在聲明使用它們的變量方面有很大的好處,並將它們初始化爲與聲明相同的行。

0

這種風格已不再需要,並已失去使用。然而,如果方法頂部的這組聲明後面跟着一組相應的版本,我可以看到一些好處,但正如其他人指出的那樣,這是以可讀性爲代價的。