2

親愛なるインターネットの長老たちへ

一連の辞書を処理しようとしています。異なるデータ セットには異なる処理が必要であり、各データ セットは作成、更新、および削除操作を処理する必要があります。簡単に言えば、これを行うためのより効率的で賢い方法を探しています...

- (NSDictionary*)processUpdatesForDataSet:(NSString*)dataSet ofType:(NSString*)type {


if ([dataSet isEqualToString:@"countries"]) {

    if ([type isEqualToString:@"CREATE"]) {


    } else if ([type isEqualToString:@"UPDATE"]) {


    } else if ([type isEqualToString:@"DELETE"]) {


    }

} else if ([dataSet isEqualToString:@"connections"]) {

    if ([type isEqualToString:@"CREATE"]) {


    } else if ([type isEqualToString:@"UPDATE"]) {


    } else if ([type isEqualToString:@"DELETE"]) {


    }

} else if ([dataSet isEqualToString:@"sites"]) {

    if ([type isEqualToString:@"CREATE"]) {


    } else if ([type isEqualToString:@"UPDATE"]) {


    } else if ([type isEqualToString:@"DELETE"]) {


    }

}

}
4

1 に答える 1

3

これはかなり特殊なケースであり、このアプローチは少し混乱していると考える人もいると思いますが、これで終わりです。

2 つのオプション。1 つは、データ セットを処理するブロックを設定することです。欠点は、これらのブロックを辞書などに保持する必要があることです。その方法には立ち入りません。もう 1 つの方法は、データ セットに基づいてセレクターを生成し、そのメソッドを確認して呼び出すことです。

processUpdates メソッドでは、

NSString *dataSelString = [NSString stringWithFormat:@"dataSet_%@:", dataSet];
SEL dataSel = NSStringFromSelector(dataSelString);
if ([self respondsToSelector:dataSel)] {
    [self performSelector:dataSel withObject:type];
} else {
    NSLog(@"warning: unknown dataSet: %@", dataSet);
    // deal with unknown data set, e.g. alerting user or such
}

すべてのデータセットタイプに対してself、たとえばにメソッドがあります

- (void)dataSet_countries:(NSString *)type
{
    // handle each type accordingly
}

必要に応じて、selector-caller メソッド (processUpdates) でタイプを一度チェックすることで、if else を switch ケースに合理化することもできます。例:

上部の .m ファイル内

typedef enum {
    DataTypeInsert  = 0,
    DataTypeUpdate  = 1,
    DataTypeDelete  = 2,
    DataTypeUnknown = NSNotFound
} DataType;
static NSArray *typeValues = nil;

// in processUpdates method
if (typeValues == nil) {
    // we set up typeValues once
    typeValues = [[NSArray alloc] initWithObjects:@"INSERT", @"UPDATE", @"DELETE", nil];
}
// since 'unknown' is NSNotFound, this will work out fine always
NSNumber *typeVal = [NSNumber numberWithInt:[typeValues indexOfObject:type]];

次に、選択したメソッドに type の代わりに typeVal を指定すると、メソッド自体が実行されます。

- (void)dataSet_countries:(NSNumber *)type
{
    DataType dataType = [type intValue];
    switch (dataType) {
    case DataTypeInsert:
        break;
    // ...
    case DataTypeUnknown:
        // alert user or such that the type was invalid
    }
}

それがあなたにいくつかのアイデアを与えることを願っています。

于 2012-08-22T13:51:12.450 に答える