1

すべての変数とプロパティを事前に設定して機能させる必要があるこのクラスをプログラムする方法について、いくつかのアイデアが必要です。3秒を設定する方法を考えていましたCCSprite。しかし、プロパティはどうですか?それらがユーザーによって設定されていることを確認する必要NSAssertがありますか、それともより良い方法がありますか?

@interface DigParallaxBackgroundLayer : CCLayer
{
    CCSprite *background1;
    CCSprite *background2;
    CCSprite *background3;
}

@property (nonatomic, assign) float bg1ScrollSpeed;
@property (nonatomic, assign) float bg2ScrollSpeed;
@property (nonatomic, assign) float bg3ScrollSpeed;

@property (nonatomic, assign) CGPoint initialOffset;
4

3 に答える 3

2

プロパティの適切なデフォルト値を見つけ、および/またはそれらのそれぞれの値を含む初期化子を作成します。

-initWithBG1ScrollSpeed:bg2ScrollSpeed:bg3ScrollSpeed:
于 2013-04-25T00:25:39.747 に答える
2

クラスに独自のコラボレーターを作成させるのではなく、クラスのコラボレーターを外部から提供することをお勧めします。これは依存性注入と呼ばれます。. . (クラスに独自のデフォルト値と共同作業者を設定してから、これらを変更したい場合は、それらが使用されているすべての場所を見つけて、1つずつ変更する必要があります.. .また、クラスは難しいでしょう.単体テストへ) .

. . . このアプローチをクラス全体に広めると、構成管理 (適切なデフォルト値) を実行したり、コンポーネントを機能する全体に配線するために使用できる最上位のアセンブリ/ワイヤリング クラスができあがります。

ここで使用できるのは次の 2 種類です。

  • イニシャライザインジェクション:ここで、必要なコラボレータがイニシャライザ メソッドによって提供されます。このアプローチの利点の 1 つは、続行する前に、クラスが必要な状態にあることを非常に簡単にアサートできることです。

  • プロパティ注入:ここで、必要なコラボレーターがプロパティ セッターを介して設定されます。このアプローチの利点の 1 つは、クラスが他の多くのクラスで構成されている場合に読みやすくなることです。このアプローチの欠点は、オブジェクトが誤った状態になりやすいことです。. . 一部の依存性注入ライブラリでは、これを回避するためのコールバック メソッドが提供されています。

オブジェクトが不変の場合 (つまり、共同作業者が実行時に変更されない場合)、私は読み取り専用のプロパティを使用し、initializer を介してそれらを注入するのが好きです。これにより、明確なコントラクトが促進され、続行する前にオブジェクトが必要な状態にあることを簡単に主張できます。. . . それ以外の場合は、プロパティ セッターが実行された後に呼び出されるメソッドを使用するのが好きです。

注意: assert は、デバッグ モードで必要な状態をチェックするのに最適ですが、デフォルトでは実行時に実行されません。(これはあなたが望むものかもしれませんし、そうでないかもしれません)。

于 2013-04-25T00:28:50.470 に答える
1

答え

メソッドに妥当なデフォルト値を設定する必要がありますinit。また、プロパティを変更するときは、プロパティが適切な値に設定されていることを確認する必要があります。

デフォルトでは、NSAssert はアプリの製品版では実行されないことに注意してください (この動作は変更できますが、お勧めしません。https://stackoverflow.com/a/6445429/1445366を参照してください) 。

カスタム クラス ファクトリ メソッドを作成することもできます。何かのようなもの:

+ (DigParallaxBackgroundLayer *) newBackgroundLayerWithDefaultScrollSpeed:(float)defaultSpeed {
    DigParallaxBackgroundLayer * newLayer = [[DigParallaxBackgroundLayer alloc] init];
    newLayer.bg1ScrollSpeed = newlayer.bg2ScrollSpeed = newLayer.bg3ScrollSpeed = defaultSpeed;
    return newLayer;
}

さらなる解説

something1、のような変数名で新しいクラスを開始するとsomething2something3ほとんどの場合後悔します。

ほとんどの場合、CCSprite の NSArray を作成し、速度を含む別の NSArray を作成することをお勧めします。(NSValue または NSNumber を使用して単純な変数をオブジェクトにラップし、NSArray に入れることができます)。

さらに良いことに、プロパティbackgroundとを持つ別の非常に単純なクラスを作成scrollSpeedし、それらを NSArray に入れることができます。

于 2013-04-25T00:36:53.623 に答える