2012-02-16 58 views
1

我使用的對象符合obj c協議來表示計算。有常量[1],變量[x]和操作[a + b]。所有這些對象都是不可變的(變量包含一個鍵(對於字典)和一個默認值(如果字典不包含該鍵的值,則使用該值))。從init返回另一個對象

由於對象是不可變的,所以我想在初始化對象時儘可能簡化計算。 (注意:變量字典允許不斷變化,所以我永遠不能根據變量的值來簡化,只有常量)。

例如,一個非常常見的用法是將變量加1:[[x] +1]。當這些嵌套時,我想從init中返回[[x] +2]而不是[[[x] +1] +1],以便這部分計算只需要執行一次。到現在爲止還挺好。

當兩個參數都是常量(例如[2 + 2])時,返回[4]是有意義的。但ARC對此抱怨,因爲[4]是遵循相同協議的不同類。

它讓我想到了我想要做的是不錯的形式。我通常會讓它們都從一個類(類集羣)繼承,但是我想爲常量使用NSNumber(通過擴展類)。

我可以將簡化邏輯移動到另一個方法,但這意味着必須經常分配額外的對象,並且我必須記得總是調用它:[[[[MyClass alloc] init] simplifiedCalc]。

我的選擇是:

  1. 只是沉默的編譯器(和 文檔中編寫一個徹底的註釋)
  2. 創建並調用單獨的「簡化」的方法,它 返回另一個對象(創建額外的對象)
  3. 執行其返回相同的對象 在初始化(例如[[[X] 1] 1]的優化 - > [[X] 2]),但需要爲[2 「簡化」 方法+2] = [4]的情況。
  4. ???

任何想法或建議表示讚賞。

+1

而不是做在初始化這個工作,也許你應該有一個建立在聯合國簡化表達一個方便的方法,然後經過並簡化其並返回簡化的。 – 2012-02-16 19:55:52

+0

這可能是解決方案。看起來我仍然需要創建一個額外的對象,但我想我可以在alloc/initing對象之前進行計算以避免這種情況。 – 2012-02-16 20:04:14

+0

@凱文:想過之後,我認爲這是最好的解決方案。如果你把它寫成答案,我會將其標記爲正確的。 – 2012-02-16 20:07:27

回答

2

不是在init中做這個工作,也許你應該有一個方便的方法來設置非簡化的表達式,然後通過並簡化它並返回簡化的表達式。或者你可以把它作爲對象本身的一種方法,例如

@protocol Calculation 
- (id<Calculation>)simplifiedExpression; 
@end 

這可能返回self如果它已經簡化,或構建一個新的簡化版本,如果不是。這樣,您仍然可以像現在這樣分配/初始化對象,然後再簡化它們。你甚至可以做一個有用的構造方法,在一次做兩件事:

+ (id<Calculation>)simplifiedCalculationWithInput:(id)input; 
+0

我做了一些與此非常相似的事情。我檢查了在便捷構造函數的alloc/initing之前是否可以簡化它,從而避免了在這種情況下的額外對象分配。 – 2012-02-17 10:07:33