MST
星途 面试题库

面试题:Objective-C中如何通过代码重构优化复杂的条件判断逻辑

假设你有一段Objective-C代码,其中包含多层嵌套的if - else语句来处理不同的业务逻辑分支,比如根据用户的不同身份(普通用户、VIP用户、管理员)以及不同的操作(登录、购买、删除)执行不同的代码块。请描述你会如何对这段代码进行重构,使其结构更清晰、可维护性更高,并且举例说明可能运用到的设计模式。
46.4万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 策略模式
    • 思路:将不同身份和操作组合对应的业务逻辑封装成不同的策略类。每个策略类实现一个统一的接口。这样,主代码根据用户身份和操作选择合适的策略类来执行相应逻辑,避免了大量嵌套的if - else语句。
    • 示例代码
// 定义策略接口
@protocol OperationStrategy <NSObject>
- (void)execute;
@end

// 普通用户登录策略
@interface NormalUserLoginStrategy : NSObject <OperationStrategy>
- (void)execute {
    NSLog(@"普通用户登录逻辑");
}
@end

// VIP用户购买策略
@interface VIPUserPurchaseStrategy : NSObject <OperationStrategy>
- (void)execute {
    NSLog(@"VIP用户购买逻辑");
}
@end

// 根据用户身份和操作获取对应的策略实例
- (id<OperationStrategy>)getStrategyWithUserType:(NSString *)userType operation:(NSString *)operation {
    if ([userType isEqualToString:@"普通用户"]) {
        if ([operation isEqualToString:@"登录"]) {
            return [[NormalUserLoginStrategy alloc] init];
        }
    } else if ([userType isEqualToString:@"VIP用户"]) {
        if ([operation isEqualToString:@"购买"]) {
            return [[VIPUserPurchaseStrategy alloc] init];
        }
    }
    return nil;
}

// 主调用逻辑
- (void)handleUserOperationWithUserType:(NSString *)userType operation:(NSString *)operation {
    id<OperationStrategy> strategy = [self getStrategyWithUserType:userType operation:operation];
    if (strategy) {
        [strategy execute];
    } else {
        NSLog(@"不支持的操作");
    }
}
  1. 状态模式
    • 思路:将用户身份看作不同的状态,每个状态对象负责处理该状态下的各种操作。这样,代码结构更加清晰,每个状态对象专注于自己状态下的业务逻辑。
    • 示例代码
// 状态基类
@interface UserState : NSObject
- (void)handleOperation:(NSString *)operation;
@end

// 普通用户状态类
@interface NormalUserState : UserState
- (void)handleOperation:(NSString *)operation {
    if ([operation isEqualToString:@"登录"]) {
        NSLog(@"普通用户登录逻辑");
    } else if ([operation isEqualToString:@"购买"]) {
        NSLog(@"普通用户购买逻辑");
    }
}
@end

// VIP用户状态类
@interface VIPUserState : UserState
- (void)handleOperation:(NSString *)operation {
    if ([operation isEqualToString:@"登录"]) {
        NSLog(@"VIP用户登录逻辑");
    } else if ([operation isEqualToString:@"购买"]) {
        NSLog(@"VIP用户购买逻辑");
    }
}
@end

// 用户上下文类
@interface UserContext : NSObject
@property (nonatomic, strong) UserState *currentState;

- (void)setState:(UserState *)state;
- (void)handleOperation:(NSString *)operation;
@end

@implementation UserContext
- (void)setState:(UserState *)state {
    self.currentState = state;
}

- (void)handleOperation:(NSString *)operation {
    [self.currentState handleOperation:operation];
}
@end

// 使用示例
UserContext *context = [[UserContext alloc] init];
NormalUserState *normalState = [[NormalUserState alloc] init];
[context setState:normalState];
[context handleOperation:@"登录"];
  1. 使用多态和继承
    • 思路:创建一个基类,例如User类,根据用户身份创建NormalUserVIPUserAdminUser等子类继承自User类。在每个子类中重写处理不同操作的方法。这样,通过多态性,在主代码中只需要调用统一的方法,具体逻辑由子类实现,减少了if - else的嵌套。
    • 示例代码
// 用户基类
@interface User : NSObject
- (void)handleOperation:(NSString *)operation;
@end

@implementation User
- (void)handleOperation:(NSString *)operation {
    NSLog(@"不支持的操作");
}
@end

// 普通用户子类
@interface NormalUser : User
- (void)handleOperation:(NSString *)operation {
    if ([operation isEqualToString:@"登录"]) {
        NSLog(@"普通用户登录逻辑");
    } else if ([operation isEqualToString:@"购买"]) {
        NSLog(@"普通用户购买逻辑");
    }
}
@end

// VIP用户子类
@interface VIPUser : User
- (void)handleOperation:(NSString *)operation {
    if ([operation isEqualToString:@"登录"]) {
        NSLog(@"VIP用户登录逻辑");
    } else if ([operation isEqualToString:@"购买"]) {
        NSLog(@"VIP用户购买逻辑");
    }
}
@end

// 主调用逻辑
User *user = [[NormalUser alloc] init];
[user handleOperation:@"登录"];