中年如何高效阅读代码?Linux大神拍了拍你并教给你这三个步骤( 四 )


3、现在看起来比较清爽了 , 但是仍然不够 , 因此我们进行第三轮精简 , 去掉各种调试和打印语句 , 还剩下52行:
int main(int argc, char *argv[]) { console_init() cpu_init() device_init() machine_init() timer_init() useremul_init() emuls = malloc(sizeof(struct emul *)) emuls[0] = emul_new(NULL) get_cmd_args(argc, argv, emuls[0], &ampdiskimages, &ampn_diskimages) if (!skip_srandom_call) { gettimeofday(&amptv, NULL) srandom(tv.tv_sec ^ getpid() ^ tv.tv_usec) } if (emuls[0]-&gtmachines[0]-&gtmachine_type == MACHINE_NONE) { n_emuls -- } else { for (i=0 i&ltn_diskimages i++) diskimage_add(emuls[0]-&gtmachines[0], diskimages[i]) } if (n_emuls &gt 0) { for (i=1 i&ltargc i++) if (argv[i][0] == "@") { exit(1) } emul_simple_init(emuls[0]) } for (i=1 i&ltargc i++) { if (argv[i][0] == "@") { if (strlen(s) == 0 &amp&amp i+1 &lt argc &amp&amp argv[i+1][0] != "@") { i++ s = argv[i] } n_emuls ++ emuls = realloc(emuls, sizeof(struct emul *) * n_emuls) console_allow_slaves(1) if (n_emuls == 1) { emul_destroy(emuls[0]) } emuls[n_emuls - 1] = emul_create_from_configfile(s) } } if (n_emuls == 0) { exit(1) } device_set_exit_on_error(0) console_warn_if_slaves_are_needed(1) emul_run(emuls, n_emuls) console_deinit() for (i=0 i&ltn_emuls i++) emul_destroy(emuls[i]) return 0}
4、一般来说 , 超过一屏的函数或多或少都会影响可读性 , 因此我们需要进行第四轮精简 , 去掉各种异常处理语句 , 还剩下43行:
int main(int argc, char *argv[]) { console_init() cpu_init() device_init() machine_init() timer_init() useremul_init() emuls = malloc(sizeof(struct emul *)) emuls[0] = emul_new(NULL) get_cmd_args(argc, argv, emuls[0], &ampdiskimages, &ampn_diskimages) if (!skip_srandom_call) { gettimeofday(&amptv, NULL) srandom(tv.tv_sec ^ getpid() ^ tv.tv_usec) } if (emuls[0]-&gtmachines[0]-&gtmachine_type == MACHINE_NONE) { n_emuls -- } else { for (i=0 i&ltn_diskimages i++) diskimage_add(emuls[0]-&gtmachines[0], diskimages[i]) } if (n_emuls &gt 0) { emul_simple_init(emuls[0]) } for (i=1 i&ltargc i++) { if (argv[i][0] == "@") { if (strlen(s) == 0 &amp&amp i+1 &lt argc &amp&amp argv[i+1][0] != "@") { i++ s = argv[i] } n_emuls ++ emuls = realloc(emuls, sizeof(struct emul *) * n_emuls) console_allow_slaves(1) if (n_emuls == 1) { emul_destroy(emuls[0]) } emuls[n_emuls - 1] = emul_create_from_configfile(s) } } emul_run(emuls, n_emuls) console_deinit() for (i=0 i&ltn_emuls i++) emul_destroy(emuls[i]) return 0}
对于一个熟练的开发者来说 , 该函数的逻辑精简到了这个状态以后已经比较清晰了(可以到此为止) 。 但如果是初次接触的话 , 还是相对显得有点复杂 。
5、让我们来进行第五轮精简 , 去掉那些不常用的、罕见的代码路径 , 剩下18行:
int main(int argc, char *argv[]) { console_init() cpu_init() device_init() machine_init() timer_init() useremul_init() emuls = malloc(sizeof(struct emul *)) emuls[0] = emul_new(NULL) get_cmd_args(argc, argv, emuls[0], &ampdiskimages, &ampn_diskimages) for (i=0 i&ltn_diskimages i++) diskimage_add(emuls[0]-&gtmachines[0], diskimages[i]) if (n_emuls &gt 0) emul_simple_init(emuls[0]) emul_run(emuls, n_emuls) console_deinit() for (i=0 i&ltn_emuls i++) emul_destroy(emuls[i]) return 0}


推荐阅读