在编程中,魔鬼数字(magic numbers)是指代码中直接使用的未经解释的常量数字,这些数字通常没有明确的含义,可能会使代码变得难以理解、维护或扩展。魔鬼数字的存在会让人难以判断这些数字的用途或来源,因此在代码中通常建议避免使用魔鬼数字,而是用具名的常量或宏来代替。
在你提供的示例代码中,以下几个数字可以被认为是魔鬼数字:
魔鬼数字示例
-
3
:表示创建的线程数量。- 原代码:
const int numThreads = 3;
- 解释:这里
3
表示程序中要创建的线程数量。为了使代码更具可读性,可以将这个数字替换为一个具名的常量。
- 原代码:
-
2
:用于sleep(2)
,表示线程要休眠2秒。- 原代码:
sleep(2);
- 解释:这个数字表示线程的休眠时间,直接使用会让人困惑为什么选择2秒。可以用一个具名的常量来替代它,以解释这段休眠的目的。
- 原代码:
改进后的代码
为了消除魔鬼数字,可以将它们替换为具名常量或宏,以增强代码的可读性和可维护性:
#include <iostream>
#include <pthread.h>
#include <unistd.h> // sleep 函数
// 定义具名常量
const int NUM_THREADS = 3; // 线程数量
const int THREAD_SLEEP_DURATION = 2; // 每个线程休眠的秒数
// 线程执行的函数
void* threadFunc(void* arg) {
int* id = static_cast<int*>(arg); // 传入的参数类型转换
std::cout << "Thread " << *id << " is running." << std::endl;
sleep(THREAD_SLEEP_DURATION); // 使用具名常量代替魔鬼数字
std::cout << "Thread " << *id << " has finished." << std::endl;
return nullptr;
}
int main() {
pthread_t threads[NUM_THREADS]; // 使用具名常量代替魔鬼数字
int threadArgs[NUM_THREADS];
// 创建多个线程
for (int i = 0; i < NUM_THREADS; ++i) {
threadArgs[i] = i + 1; // 为每个线程传递不同的参数
if (pthread_create(&threads[i], nullptr, threadFunc, &threadArgs[i]) != 0) {
std::cerr << "Error creating thread " << i + 1 << std::endl;
return 1;
}
}
// 等待所有线程完成
for (int i = 0; i < NUM_THREADS; ++i) {
if (pthread_join(threads[i], nullptr) != 0) {
std::cerr << "Error joining thread " << i + 1 << std::endl;
return 1;
}
std::cout << "Thread " << i + 1 << " has joined." << std::endl;
}
std::cout << "All threads have completed." << std::endl;
return 0;
}
改进的地方:
NUM_THREADS
: 代替了数字3
,表示线程的数量。这样如果未来需要更改线程数量,只需要修改这个常量即可,增强了代码的可扩展性。THREAD_SLEEP_DURATION
: 代替了sleep(2)
中的2
,明确表示线程的休眠时间,这使代码更加清晰,并且能够解释为什么线程需要休眠。
这样做的好处:
- 可读性:具名常量提供了上下文信息,告诉代码的读者这些数字的含义。
- 可维护性:如果需要更改这些常量的值,只需修改一处,减少了错误的可能。
- 可扩展性:当需要扩展代码时,使用具名常量可以让代码更容易修改和理解。
避免魔鬼数字是编程中的一个重要实践,可以显著提高代码的质量。
标签:魔鬼,数字,代码,C++,线程,具名,常量 From: https://www.cnblogs.com/chentiao/p/18468745