2014-03-13 122 views
0

爲了清理我的代碼,在代碼中使用#define是不是很好?大多數例子是幾行,定義尺寸等。
在我的例子中,我爲下面的一段代碼有單獨的頭文件。以這種方式使用#define是否是好習慣?使用#define,良好的做法?

#define KCHECKREFERENCE if([self.partClasses containsObject:@"Part1"]||[self.partClasses containsObject:@"Part2"]||[self.partClasses containsObject:@"Part3"]||[self.partClasses containsObject:@"Part4"]||[self.partClasses containsObject:@"Part5"]||[self.partClasses containsObject:@"Part6"]||[self.partClasses containsObject:@"ICDomesticEICPart7"]||[self.partClasses containsObject:@"ICDomesticEICPart8"]){\ 
[self.currentPartView save];\ 
self.previousPartView = self.currentPartView;\ 
int nextPartNumber = 1;\ 
ICCertificateComponent *part = [self loadPart:nextPartNumber];\ 
self.currentPartView = part;\ 
CGRect nextPartViewFrame = self.currentPartView.view.frame;\ 
nextPartViewFrame.origin.x = 320.0f;\ 
self.currentPartView.view.frame = nextPartViewFrame;\ 
CGRect previousPartViewFrame = self.previousPartView.view.frame;\ 
previousPartViewFrame.origin.x = -320.0f;\ 
nextPartViewFrame.origin.x = 0;\ 
[self.view insertSubview:self.currentPartView.view belowSubview:self.navBarView];\ 
NSTimeInterval duration = 0.1;\ 
[UIView animateWithDuration:duration\ 
       animations:^{\ 
        self.previousPartView.view.frame = previousPartViewFrame;\ 
        self.currentPartView.view.frame = nextPartViewFrame;\ 
       }\ 
       completion:^(BOOL finished) {\ 
        self.currentPartNumber = 1;\ 
        self.navBarView.prevButton.enabled = NO;\ 
        self.navBarView.nextButton.enabled = YES;\ 
        [self.previousPartView.view removeFromSuperview];\ 
        self.previousPartView = nil;\ 
        if (self.currentPartView.showsShareOptions == YES) {\ 
         self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Share" style:UIBarButtonItemStyleBordered target:self action:@selector(shareButtonPressed:)];\ 
        }\ 
       }\ 
];\ 
+0

在CodeReview中,要求清理代碼的最佳位置將結束。 http://codereview.stackexchange.com/questions – nhgrif

回答

5

不,特別是對於某些特別的東西。

而不是#define,把這個代碼放在一個方法中。

+0

如果此代碼較小,並且您需要將它內聯以快速運行,則可能不希望將其放入方法中。考慮到調用方法的開銷很小, – AnthonyLambert

+0

這可能是事實,但在這裏肯定不是這種情況。而且,這是一個代碼清理問題,而不是一個優化問題。 – nhgrif

+1

@AnthonyLambert作爲@ nhgrif1寫道,情況並非如此。也不要試圖變得如此聰明,LLVM可以在優化你的東西時變得更聰明。另外可讀性也很糟糕,調試也是如此......這是一團糟......如果你需要內聯,爲什麼不使用'inline' C函數,它可以從你的ObjC方法中調用。 – robertvojta

2

我知道幾個情況下,定義是良好的做法。例如_countof宏觀

#if !defined(_countof) 
#if !defined(__cplusplus) 
#define _countof(_Array) (sizeof(_Array)/sizeof(0[_Array])) 
#else 
template <typename _CountofType, size_t _SizeOfArray> 
char (*__countof_helper(_CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray]; 
#define _countof(_Array) sizeof(*__countof_helper(_Array)) 
#endif 
#endif 

但你KCHECKREFERENCE是邪惡的。您應該使用inline funcions。爲什麼?至少因爲你不能在你的宏裏面設置斷點。

+1

不能斷點 - 好點.... – AnthonyLambert