1

我想要一些关于如何对这个类进行编程的想法,该类需要预先设置其所有变量和属性才能使其工作。我正在考虑创建一种方法来设置 3 CCSprites。但是属性呢?我应该做一个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

在外部提供班级的协作者是一个好主意,而不是让班级创建自己的协作者。这称为依赖注入。. . (如果您让班级设置了自己的默认值和合作者,然后想要更改这些,您必须找到所有他们使用的地方并一个接一个地更改它们......而且班级也很难进行单元测试)

. . . 如果你在你的类中传播这种方法,你最终会得到一个顶级的装配/连接类,它可以用来执行配置管理(合理的默认值),以及将组件连接到一个功能完整的整体中。

这里可以使用两个品种:

  • 初始化程序注入:这是由初始化程序方法提供所需协作者的地方。这种方法的好处之一是在继续之前很容易断言该类处于所需状态。

  • 属性注入:这是通过属性设置器设置所需协作者的地方。当一个类由许多其他类组成时,这种方法的好处之一是它提高了可读性。这种方法的一个缺点是很容易使对象进入不正确的状态。. . 一些依赖注入库提供了一个回调方法来避免这种情况。

在对象不可变的情况下(即协作者在运行时不会改变),我喜欢使用只读属性并通过初始化程序注入它们。这促进了一个清晰的契约,并使得在继续之前断言对象处于所需状态变得容易。. . . 否则我喜欢使用在执行属性设置器后调用的方法。

注意: assert 非常适合在调试模式下检查所需状态,但默认情况下它不会在运行时执行。(这可能是也可能不是您想要的)。

于 2013-04-25T00:28:50.470 回答
2

为属性找到合理的默认值,和/或创建一个包含每个属性值的初始化程序:

-initWithBG1ScrollSpeed:bg2ScrollSpeed:bg3ScrollSpeed:
于 2013-04-25T00:25:39.747 回答
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;
}

进一步的评论

当你用 , 之类的变量名开始一个新类时something1something2something3几乎总是会后悔的。

创建一个 CCSprites 的 NSArray 和另一个具有您的速度的 NSArray 几乎总是更好。(您可以使用 NSValue 或 NSNumber 将简单变量包装在一个对象中,以便它们进入 NSArray)。

更好的是,您可以创建另一个非常简单的具有属性background和的类scrollSpeed,然后将它们放入 NSArray。

于 2013-04-25T00:36:53.623 回答