自我貯水槽

このブログを用い記憶を失った時の再現性を担保しています。

訳あってAWSのコードを読んでたらいいなと思える実装に出会った

訳あってAWSのコードを読んでたらいいなと思える実装に出会った

+ (instancetype)defaultPinpointTargeting {
    static AWSPinpointTargeting *_defaultPinpointTargeting = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        AWSServiceConfiguration *serviceConfiguration = nil;
        AWSServiceInfo *serviceInfo = [[AWSInfo defaultAWSInfo] defaultServiceInfo:AWSInfoPinpointTargeting];
        if (serviceInfo) {
            serviceConfiguration = [[AWSServiceConfiguration alloc] initWithRegion:serviceInfo.region
                                                               credentialsProvider:serviceInfo.cognitoCredentialsProvider];
        }

        if (!serviceConfiguration) {
            serviceConfiguration = [AWSServiceManager defaultServiceManager].defaultServiceConfiguration;
        }

        // ↓この部分です。
        if (!serviceConfiguration) {
            @throw [NSException exceptionWithName:NSInternalInconsistencyException
                                           reason:@"The service configuration is `nil`. You need to configure `awsconfiguration.json`, `Info.plist` or set `defaultServiceConfiguration` before using this method."
                                         userInfo:nil];
        }
        _defaultPinpointTargeting = [[AWSPinpointTargeting alloc] initWithConfiguration:serviceConfiguration];
    });

    return _defaultPinpointTargeting;
}

(うわ、はてブobjective-cシンタックスハイライトサポートしていない...)

当該部分のコードはここですね。→ aws-sdk-ios/AWSPinpointTargetingService.m at f114d767fef60c61be595f4e614ced3c4d2600ef · aws/aws-sdk-ios · GitHub

疑似コードみたいに切り出すと

object = nil
if (condintion1) {
  object = hogehoge.create
}

if (condintion2) {
  object = fugafuga.create
}

if (object == nil) {
  throw “object is nil” 
}

return object

こんな実装になっていて、returnの前にnilチェックしているため、optionalな型が保証されてない世界でこの関数の帰り値がnilにならないことが読みとりやすい感じがする。すてき