【问题标题】:Clean Code: How to avoid all those nested if/success blocks?清洁代码:如何避免所有嵌套的 if/success 块?
【发布时间】:2014-01-28 07:01:30
【问题描述】:

我想知道如何避免所有嵌套的 if/success 块?所以我很高兴有任何关于如何改进/封装这个架构的建议

- (void)findLocation {

    // Show loader.png
   [self.searchButton setImage:[UIImage imageNamed:@"loader"] forState:UIControlStateNormal];

    // Request url
    NSString *url = [NSString stringWithFormat:@"http://api.domain.com/someendpoint/"];

    // Send http request
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager GET:url parameters:nil
         success:^(AFHTTPRequestOperation *operation, id responseObject) {


             // If API returned error
             if([responseObject objectForKey:@"error"]) {

                // Show an error

                // Hide loader
                [self.searchButton setImage:[UIImage imageNamed:@"some_button"] forState:UIControlStateNormal];

                // Skip everything else
                return;
            }


             // If API returned data    

             // Init location object
             Location * location = [[Location alloc] init];
             location.name = [responseObject objectForKey:@"name"];
             location.image_url = [responseObject objectForKey:@"image_url"];
             location.url = [responseObject objectForKey:@"url"];
             location.address = [responseObject objectForKey:@"address"];

             // Calculate long/lat from address (API does not provide this information
             CLGeocoder *geocoder = [[CLGeocoder alloc] init];
             [geocoder geocodeAddressString:location.address completionHandler:^(NSArray *placemarks, NSError *error) {
                 if (error) {
                     // Show error
                 } else {
                     // Save geo-location to location object 
                     CLPlacemark *place = [placemarks lastObject];
                     location.location = CLLocationCoordinate2DMake(place.location.coordinate.latitude, place.location.coordinate.longitude);

                     // Present ResultViewController
                     ResultViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"ResultView"];
                     controller.location = location;
                     controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
                     [self presentViewController:controller animated:YES completion:nil];

                     // Initialize region to monitor
                     CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:location.location radius:150.0 identifier:[[NSUUID UUID] UUIDString]];

                     // Start monitoring new region
                     [self.locationManager startMonitoringForRegion:region];

                     // Stop UpdatingLocation
                     [self.locationManager stopUpdatingLocation];

                     // Hide loader
                     [self.searchButton setImage:[UIImage imageNamed:@"some_button"] forState:UIControlStateNormal];
                 }];

             }


         }
         failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            // Show error

            // Hide loader
            [self.searchButton setImage:[UIImage imageNamed:@"some_button"] forState:UIControlStateNormal];

         }
     ];
}

【问题讨论】:

    标签: objective-c ios7 coding-style


    【解决方案1】:

    在您的Show error 部分之后,从函数返回。这样您就可以将其余代码放在else 子句之外。

    【讨论】:

      【解决方案2】:

      正如 S. McConnel 所建议的,首先使用 if 来处理成功的场景 - 这使得代码阅读更容易。

      然后,正如 zmbq 建议的那样,将其包装成一个函数。

      obj c 中的块并不是真正的“前 10”,因为它们的美感,只是习惯它们吧:)

      来自 Google 的 Objective C 代码风格的一些提示:

      http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml#Blocks

      作为函数的变体:

      - (void)findLocation {
      
      // Show loader.png
      [self.searchButton setImage:[UIImage imageNamed:@"loader"] forState:UIControlStateNormal];
      
      // Request url
      NSString *url = [NSString stringWithFormat:@"http://api.domain.com/someendpoint/"];
      
      // Send http request
      AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
      [manager GET:url parameters:nil
           success:^(AFHTTPRequestOperation *operation, id responseObject) {
      
               // If API returned data
               if([[responseObject objectForKey:@"ErrorCode"] intValue] == 0) {
      
                  [self setupLocation:responseObject];
      
               // If API returned error    
               } 
              else { // Show an error
      
                    // Hide loader
                   [self.searchButton setImage:[UIImage imageNamed:@"surpriseme_button"] forState:UIControlStateNormal];
                    }
                 }];
              }
           }
           failure:^(AFHTTPRequestOperation *operation, NSError *error) {
      
              // Hide loader
              [self.searchButton setImage:[UIImage imageNamed:@"surpriseme_button"] forState:UIControlStateNormal];
      
           }
       ];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-30
        • 1970-01-01
        相关资源
        最近更新 更多