使用枚举 Enum 来减少 if else,快来看看适不适合你吧?

本文探讨了如何使用枚举(Enum)来优化代码,以减少大量if else语句的使用。在特定场景下,当接口参数需要根据业务条件传入固定值时,传统的if else结构显得冗长且不易维护。通过定义枚举,可以显著简化代码,提高可读性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 场景

当我需要调用其他其他接口,这个接口某个参数需要根据不同情况来传递不同的固定值
如:B接口调用A接口,A接口中需要传递授权码,这个授权码在不同的业务场景不同的手机系统需要传递不同的值,普通的传值方式如下:

public void notEnum(Request req){
	TestReq testReq = new TestReq();//A接口的请求

	if("android".equals(req.getSysType())){
		if("a".equals(req.getBusinessType())){
			testReq.setSign("android_aaaaaaaaaaa");
		}else if("b".equals(req.getBusinessType())){
			testReq.setSign("android_bbbbbbbbbbb");
		}else if("c".equals(req.getBusinessType())){
			testReq.setSign("android_ccccccccccc");
		}
	}else if("ios".equals(req.sysType)){
		if("a".equals(req.getBusinessType())){
			testReq.setSign("ios_aaaaaaaaaaa");
		}else if("b".equals(req.getBusinessType())){
			testReq.setSign("ios_bbbbbbbbbbb");
		}else if("c".equals(req.getBusinessType())){
			testReq.setSign("ios_ccccccccccc");
		}
	}
	
}

17行 if else 看着贼&*¥#@难受!我就赋个值而已!而且值还是死的。

2.优化

定义enum:

public enum TestEnum{
	A_ANDROID("a","android","android_aaaaaaaaaaa"),
	A_IOS("a","ios","ios_aaaaaaaaaaa"),
	B_ANDROID("b","android","android_bbbbbbbbbbb"),
	B_IOS("b","ios","ios_bbbbbbbbbbb"),
	C_ANDROID("c","android","android_ccccccccccc"),
	C_IOS("c","ios","ios_ccccccccccc");

	private String type;
	private String source;
	private String code;

	TestEnum(String type,String source,String code){
		this.type = type;
		this.source = source;
		this.code = code;
	}

	public static String getCodeByTypeAndSource(String type,String source){
		TestEnum[] enums = TestEnum.values();
		for(TestEnum item : enums){
			if(item.type.equals(type)&&item.source.equals(source)){
				return item.code;
			}
		}
	}

}

简化后的代码:

public void useEnum(Request req){
	TestReq testReq = new TestReq();//A接口的请求
	testReq.setSign(TestEnum.getCodeByTypeAndSource(req.getBusinessType(),req.getSysType());
		
}
<think>嗯,用户想要用五步写一个任务调度器的C语言实现。我需要先理解任务调度器是什么。任务调度器通常用于操作系统或者嵌入式系统中,管理多个任务的执行顺序和时间分配。常见的调度算法有轮转调度、优先级调度等。用户可能对操作系统的基础概念有一定了解,但可能太清楚具体如何用C语言实现。 首先,得确定用户需要哪种调度算法。可能用户没有明确说明,所以应该选择最简单的先来,比如轮转调度或者FIFO。这样步骤会比较简单,适合分五步完成。然后,每一步需要分解任务,确保用户能逐步理解。 第一步,定义任务结构体。每个任务需要包含函数指针、状态、优先级等基本信息。结构体的设计要简单,可能包括ID、函数指针、状态(就绪、运行、完成等)、优先级,可能还有堆栈信息,过为了简化,可能先考虑堆栈。 第二步,初始化任务队列。使用数组或链表来管理任务。数组比较简单,适合初学者,所以先用数组实现。初始化函数需要设置任务队列的大小,初始化各个任务的状态为就绪或空闲。 第三步,实现调度逻辑。这里需要根据调度算法来编写。如果是轮转调度,就循环遍历任务队列,依次执行每个任务。可能需要一个调度函数,负责选择下一个要执行的任务,并切换状态。 第四步,编写任务函数。用户需要提供示例任务函数,比如打印信息或者执行简单计算。任务函数需要符合任务结构体中的函数指针类型,比如无返回值,无参数。 第五步,主函数整合。初始化任务队列,添加任务,启动调度器,进入无限循环,断调用调度函数执行任务。 需要考虑用户可能的问题,比如如何切换任务状态,如何处理任务执行完毕的情况。是否需要循环执行任务还是只执行一次?可能需要在任务函数中设计无限循环,或者在调度器中处理。 另外,代码的示例要简单,避免复杂的语法,比如使用动态内存分配,用静态数组。确保每个步骤的代码清晰,注释详细,方便用户理解。可能还需要测试代码,比如添加几个示例任务,观察输出是否符合预期。 需要检查每一步是否合理,是否能在五步内完成。可能需要合并某些步骤,或者简化部分逻辑。例如,任务的状态管理可以简化为是否完成,而是多个状态。或者,调度逻辑仅实现最简单的FIFO,每次执行一个任务,完成后执行下一个,但这样可能够实用。或者,每个任务按顺序执行一次,然后循环。 可能需要使用时间片或者定时器,但这样会增加复杂度。用户可能希望的是协作式调度,而非抢占式,这样任务函数需要主动让出CPU。例如,在任务函数中调用调度器,但这样可能复杂。或者,调度器依次调用每个任务,任务函数执行一次后返回,由调度器再次调用。 可能需要在任务结构体中记录执行次数,或者在每次调度时执行任务函数一次。这样任务函数需要设计成可重复调用的形式。例如,每个任务函数代表一个步骤,调度器每次调用时执行一步,但这样可能需要更复杂的状态管理。 为了简化,假设任务函数是无限循环的,但这样无法结束。或者,任务函数执行完成后标记为完成,调度器再调度。但这样任务只会执行一次。可能需要用户明确自己的需求,但用户可能没有说明,所以需要做出合理假设。 总结,分五步实现一个简单的轮转调度器,任务函数无限循环,调度器依次调用每个任务的一次执行。这样代码简单,适合教学。然后,在步骤中解释如何扩展,比如添加优先级或时间片。</think>好的!我将分5个步骤带你实现一个简单的「协作式任务调度器」的C语言框架。我会尽量简化逻辑,确保每一步都能清晰理解。现在开始: --- **第1步:定义任务结构体** ```c #include <stdio.h> // 定义任务状态枚举 typedef enum { TASK_READY, TASK_RUNNING, TASK_DONE } TaskState; // 定义任务结构体 typedef struct { int id; // 任务ID void (*func)(void); // 任务函数指针 TaskState state; // 当前状态 } Task; ``` *作用*:创建一个`Task`结构体,用于保存任务的基本信息(每个任务有自己的ID、执行函数和状态) --- **第2步:初始化任务队列** ```c #define MAX_TASKS 5 // 最大任务数 Task task_queue[MAX_TASKS]; // 任务队列 int task_count = 0; // 当前任务数量 // 初始化任务队列 void init_scheduler() { for(int i=0; i<MAX_TASKS; i++){ task_queue[i].state = TASK_DONE; // 初始标记为已完成 } task_count = 0; } ``` *作用*:创建一个固定大小的任务队列,并初始化所有任务状态为「已完成」 --- **第3步:实现任务添加函数** ```c // 添加新任务到队列 void add_task(int id, void (*task_func)(void)) { if(task_count < MAX_TASKS) { task_queue[task_count].id = id; task_queue[task_count].func = task_func; task_queue[task_count].state = TASK_READY; task_count++; } else { printf("任务队列已满!\n"); } } ``` *作用*:允许用户通过此函数将自定义任务添加到调度队列中 --- **第4步:编写调度器核心逻辑** ```c // 任务调度函数 void schedule() { for(int i=0; i<task_count; i++) { if(task_queue[i].state == TASK_READY) { task_queue[i].state = TASK_RUNNING; printf("正在执行任务 %d\n", task_queue[i].id); task_queue[i].func(); // 执行任务函数 task_queue[i].state = TASK_DONE; } } } ``` *关键点*:循环检查所有任务,当发现状态为「就绪」的任务时,执行其关联的函数 --- **第5步:创建示例任务并测试** ```c // 示例任务函数1 void task1() { printf("任务1: 计算中...\n"); } // 示例任务函数2 void task2() { printf("任务2: 处理数据...\n"); } int main() { init_scheduler(); add_task(1, task1); add_task(2, task2); while(1) { schedule(); // 这里可以添加延时或退出条件 } return 0; } ``` *输出效果*: ``` 正在执行任务 1 任务1: 计算中... 正在执行任务 2 任务2: 处理数据... (循环执行) ``` --- **需要理解的要点**: 1. 这是协作式调度,任务必须主动让出CPU(当前实现是顺序执行完所有任务) 2. 可以通过添加`yield()`函数实现任务切换(进阶) 3. 当前为简单轮询调度,没有优先级 理解完当前步骤后,可以告诉我哪一步需要更详细的解释,或者我们可以继续扩展功能(如添加优先级/时间片)!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值