在知乎上搜“编程思想”,你会看到一堆高赞回答,有人讲面向对象,有人谈函数式编程,还有人扯设计模式。但真正让人记住的,往往不是那些术语堆砌,而是某个具体场景下的顿悟时刻。
一个循环能解决的问题,别写十行重复代码
刚学编程那会儿,我写过这样的代码:处理10个用户的登录状态,写了10遍几乎一样的判断。后来在知乎看到一条回答说:‘你这不是在写程序,是在复制粘贴体力活’。这句话戳得挺疼。其实用个数组加个 for 循环就能搞定的事,非搞得像手工报表一样。从那以后,我开始留意代码里的重复味道,只要发现两处以上相似逻辑,就想着怎么抽成函数或者循环。
for (int i = 0; i < users.length; i++) {
if (users[i].isLoggedIn()) {
sendWelcomeMessage(users[i]);
}
}
把变化的部分和不变的分开
有次做天气预报小程序,需求老变:一会儿要支持国内城市,一会儿要加国外数据源。最开始我把所有逻辑都塞在一个类里,改一次就得重新测试全部功能。后来在知乎看到有人推荐‘策略模式’,说是把可能变的部分封装起来,外面只留调用接口。试着改了一版,果然清爽了。新增一个数据源,只要实现统一接口,主流程完全不用动。
这就像家里做饭,菜谱是固定的(不变的部分),但今天买的是西红柿还是黄瓜(变化的部分),不影响你按照步骤炒菜。编程也一样,核心流程稳定,细节可以插拔替换。
别急着写代码,先想清楚谁该干什么
很多人一拿到需求就开始敲键盘,结果写着写着发现逻辑乱成一团。知乎上有位答主说得形象:‘你在让一个人既当厨师又当服务员还兼职收银,不出错才怪’。程序里的每个模块也得有明确职责。比如用户注册,验证信息、发邮件、存数据库,这三个事就得分开,各自负责一块。这样以后改发短信而不是邮件,只动通知模块就行,不会波及注册主流程。
这种思维方式不是学了某种语言才有的,而是在动手前多问一句:这件事到底该由谁来做?答案往往藏在现实生活的分工逻辑里。
函数不要太“贪心”
见过太多函数名字叫 handleData(),点进去一看,解析、校验、转换、存储全干了。这种函数一旦出问题,查半天都不知道卡在哪一步。知乎有人建议:一个函数最好只做一件事,名字也要说得清清楚楚。比如 parseUserData() 就只管解析,validateEmail() 就只检查邮箱格式。这样组合起来清晰,测试也方便。
function registerUser(rawData) {
const userData = parseUserData(rawData);
if (!validateEmail(userData.email)) {
throw new Error('邮箱格式错误');
}
saveToDatabase(userData);
sendConfirmationEmail(userData);
}
这就像组装自行车,链条归链条,车把归车把,没人会拿一把扳手从头拧到尾。程序也是靠一个个小零件拼出来的,每个零件各司其职,整体才能转得顺。”}