私は計算を表すためにオブジェクトプロトコルに準拠したオブジェクトを使用しています。定数[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]と呼ぶことを忘れないでください。
私のオプションは次のとおりです。
- だけでコンパイラを黙ら(および ドキュメントに徹底的ノートを書く)
- は(余分なオブジェクトを作成する別のオブジェクトを返す別の「簡体字」の方法を作成して呼び出します)
- 初期化で同じオブジェクト を返す最適化を行いますが[[[x] +1] +1]→[[x] +2])、[2 +2] = [4]の場合
- ???
いずれかの考えやアドバイスをいただければ幸いです。
initでこの作業を行うのではなく、簡略化されていない式を設定してから簡略化する便利なメソッドを用意してください単純化されたものを返します。 –
それは解決策かもしれません。私はまだ余分なオブジェクトを作成する必要があるようですが、私はそれを避けるためにオブジェクトを割り当てる/初期化する前に計算を行うことができたと思います。 –
@ケビン:それについて考えた後、それが最良の解決策だと思う。あなたがそれを答えとして書くならば、それを正しいものとしてマークします。 –