2012-02-16 6 views
1

私は計算を表すためにオブジェクトプロトコルに準拠したオブジェクトを使用しています。定数[1]、変数[x]、および演算[a + b]があります。これらのオブジェクトはすべて不変です(変数にはキー(辞書に)、デフォルト値(辞書にキーの値が含まれていない場合に使用されます))。initから別のオブジェクトを返す

オブジェクトは不変なので、オブジェクトを初期化するときは可能な限り計算を簡略化したいと思います。 (注:変数辞書は連続的に変更することができますので、変数の値に基づいて単純化することはできません。定数のみ)。

たとえば、非常に一般的な使用方法は、[[x] +1]変数を1つ増やすことです。これらがネストされていると、[[[x] +1] +1]の代わりに[[x] +2]をinitから戻して、計算のその部分を一度だけ実行する必要があります。ここまでは順調ですね。

両方の引数が定数(たとえば[2 + 2])である場合、[4]を返すだけです。しかし、[4]は同じプロトコルに従う別のクラスであるため、ARCはこれについて不平を言っています。

私のやりたいことが良いかどうかは私には分かりました。私は通常、それらをすべて1つのクラス(クラスクラスタ)から継承させますが、定数にはNSNumber(カテゴリで拡張)を使います。

私は単純化ロジックを別のメソッドに移すことができますが、これは余分なオブジェクトをかなり頻繁に割り当てる必要があることを意味し、常に[[[MyClass alloc] init] simplifiedCalc]と呼ぶことを忘れないでください。

私のオプションは次のとおりです。

  1. だけでコンパイラを黙ら(および ドキュメントに徹底的ノートを書く)
  2. は(余分なオブジェクトを作成する別のオブジェクトを返す別の「簡体字」の方法を作成して呼び出します)
  3. 初期化で同じオブジェクト を返す最適化を行いますが[[[x] +1] +1]→[[x] +2])、[2 +2] = [4]の場合
  4. ???

いずれかの考えやアドバイスをいただければ幸いです。

+1

initでこの作業を行うのではなく、簡略化されていない式を設定してから簡略化する便利なメソッドを用意してください単純化されたものを返します。 –

+0

それは解決策かもしれません。私はまだ余分なオブジェクトを作成する必要があるようですが、私はそれを避けるためにオブジェクトを割り当てる/初期化する前に計算を行うことができたと思います。 –

+0

@ケビン:それについて考えた後、それが最良の解決策だと思う。あなたがそれを答えとして書くならば、それを正しいものとしてマークします。 –

答えて

2

initでこの作業を行う代わりに、単純化されていない式を設定し、単純化して簡略化した式を返す便利なメソッドを用意してください。または、オブジェクト自体のメソッドとして、これを行うことができます。

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

これは、それがすでに簡略化されています場合selfを返すか、いない場合は、新たな簡易版を構築することができます。そうすれば、今やっているようにオブジェクトを割り当て/初期化した後で簡単にオブジェクトを初期化できます。一度に両方を行う便利なコンストラクタを作成することもできます:

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

私はこれに非常に似た何かをしました。便利なコンストラクタでalloc/initingする前に単純化できるかどうかを確認しました。その場合、余分なオブジェクトの割り当ては行われません。 –

関連する問題