可读代码编写炸鸡十一 - 小黄鸭从你的心里游到脑子里

多选参数推荐搜索

数据结构与算法

可读代码编写

Java

Redis

MySQL

大家好,我是多选参数的大炮。

可读代码编写的炸鸡很快要写到头了,从一开始的尝试到现在的倒计时,还是有一些成就感的。当然,这不是炸鸡篇幅缩短的托词。而是 越到后头,其实内容越少,越需要代码的实践。在上一篇炸鸡的结尾,我也提到了这一点,所以各位勿怪。

我们已经了解了,抽取不相干子问题,让代码段尽量一次只做一件事 对于代码可读性的优化,但是这些都是针对已经 出现不好代码 的情况。

而很多情况下,你要面对不少前人留下来的你不愿面对的糟糕代码,并且修改他,从此背上这口大锅。不过如果他们能 在写之前 就能想清楚该怎么写能尽量使代码通顺可读干净,你也少背锅,岂不美哉。

更何况,在编码前就要提醒自己尽量写出可读性高的代码,这也是对于自身的要求,与项目垃圾与否无关,不是吗。(当然,这句话是从我同事那里偷来的,他叫 pickline。)

再回顾一下可读代码编写的第三层:

后台回复 「第三层」获取源文件

所以接下来两篇炸鸡,都是站在 编码前就考虑如何减少不好代码 的角度而提供的建议。

小黄鸭

各位或许都听说过,小黄鸭调试法吧,所谓的小黄鸭调试法就是:当程序员面对 bug 却不可自查,陷入困顿时。在电脑旁放一只小黄鸭,一边抚摸它一边讲述自己的代码思路与流程,希望借此找到代码的漏洞。

所以这只小黄鸭完全可以用在编码,也可以称作 小黄鸭编码法。小黄鸭编码法就是 面对一段需要实现的功能,先自己想一遍,说一遍功能的大致流程与细节,然后再对应地编码。

编码前的大脑

《编写可读代码艺术》第十二章中也提到,其实写程序,就是人利用计算机语言来向计算机解释一件事情,就好像我们跟朋友讲述一个故事。所以自己说一遍自己要写的东西,是有帮助的。

小黄鸭编码法对可读性的提高有所帮助,尤其是一些较为复杂的逻辑判断,这个在业务中也是常见的校验流程。

如果发现自己代码整体有点复杂冗长,就更应该先小黄鸭一下,理清楚思路,而不是盲目上手。提高可读性的方法是很多,但是从一开始就规范起来,可以少走弯路。

假设我们一个 依据配置提供下一题 这样的业务需求。在编码前,我们的大脑可能不太清醒,认为的步骤是这样的:返回一个 next question。

question 有跳转类型,any 和 right 才有 next question 的数据,如果是 right, 需要答对才能继续。

同时回答题目没有结束。(not isEnd)

没结束需要看 nextQuestionId, -1 的是随机,不然就是固定。

好了 ,如果依据这样的想法,我们写出了之前炸鸡中出现的例子来了。function QuestionSystem:giveNextQuestion(questionId, isAnswerCorrect)

local question = {

isEnd           = false,

maxAnswerTime   = 11,

nextQuestionId  = 0,

}

local questionConfig = Config.getConfById(questionId)

if questionConfig.nextType == NEXT_TYPE.ANY

or (isAnswerCorrect

and questionConfig.nextType == NEXT_TYPE.RIGHT) then

if not self:isEnd() then

self._count = self._count + 1

question.isEnd = false

-- 随机一个

if questionConfig.nextQuestionId == -1 then

question.nextQuestionId = math.random(1, questionConfig.maxNum)

else

question.nextQuestionId = questionConfig.nextQuestionId

end

question.maxAnswerTime = Config.getConfById(question.nextQuestionId).maxAnswerTime

return question

else

question.isEnd = true

return question

end

end

end

写出的代码可读性较差,也反映了你的脑子里,还是稍显混乱的。

小黄鸭的游动

那么这时候,我们完全可以利用小黄鸭编码法,重新在讲述一遍业务需求和代码思路,将刚才稍显混乱的想法重新梳理。小黄鸭在你的心里出生,而它随着你的思绪游动到脑海。我觉得刚才的思路需要重新梳理。

回答结束了,就直接结束了,不搞太多东西。

如果回答没结束需要看跳转类型,不符合就没数据返回。

确定有下一题,下一题需要确定随机还是固定生成。

接着把想法倾泻到代码中:function QuestionSystem:giveNextQuestion(questionId, isAnswerCorrect)

local question = {

isEnd           = false,

maxAnswerTime   = 11,

nextQuestionId  = 0,

}

if self:isEnd() then

question.isEnd = true

return question

end

local questionConfig = Config.getConfById(questionId)

local nextAnyway     = questionConfig.nextType == NEXT_TYPE.ANY

local nextNeedRight  = (isAnswerCorrect and questionConfig.nextType == NEXT_TYPE.RIGHT)

if not nextAnyway

and not nextNeedRight then

return question

end

self._count    = self._count + 1

question.isEnd = false

if questionConfig.nextQuestionId == -1 then

question.nextQuestionId = math.random(1, questionConfig.maxNum)

else

question.nextQuestionId = questionConfig.nextQuestionId

end

question.maxAnswerTime = Config.getConfById(question.nextQuestionId).maxAnswerTime

return question

end

嵌套减少了,思路清晰了,可读性也提高了。

小结

全篇炸鸡其实都在讲一件事情:小黄鸭编码。其实小黄鸭编码就是给自己一个 同自己的想法对话的机会。

其实从事编码相关的工作也有一年了,个人感觉编码过程中最冒失的事情便是 —— 直接下手去写。倒不是反对实践,是反对盲目下手。因为这个时候那只小黄鸭还未振翅游来,你的思路是没有打开的,不仅可读性可能受到破坏,而且很可能达不到所需。

如果在编码之前,先同自己对话,找到一只小黄鸭,慢慢地梳理思路,势必会比莽撞敲键盘来得好。而且这也花不去多少时间,着什么急呢。

不甘于「本该如此」,「多选参数」值得关注

mysql小鸭子_可读代码编写炸鸡十一 - 小黄鸭从你的心里游到脑子里相关推荐

  1. 可读代码编写炸鸡八 - 变量兜兜转转像是一场梦

    大家好,我是多选参数的一员 -- 大炮. 这里先剧透一下, 在一段时间后,多选参数会搞一个抽奖福利,其中是有<可读代码编写的艺术>以及其他书籍(可能还有别的) 的福利.可以先关注「 多选参 ...

  2. 可读代码编写炸鸡六 - 控制流尽量向前奔涌就好,不要分心

    大家好,我是多选参数的一员 -- 大炮. 目前我还没想好该怎么写,多谢之前不嫌麻烦画的思维导图. 在 上一篇 作为引子的炸鸡中,我们知道接下来的可读代码的优化方向来到了 开始接触代码逻辑上的优化 的第 ...

  3. 可读代码编写炸鸡三 - 审美

    大家好,我是多选参数的一员 -- 大炮. 在上一篇 可读代码炸鸡二(下篇) - 命名的歧义 的结尾处,提到了接下来的炸鸡会围绕 多行代码,多个函数 的代码范围来讨论代码可读性的优化. 由这个思路走的话 ...

  4. python计算器程序_利用Python代码编写计算器小程序

    1 importtkinter2 importtkinter.messagebox3 importmath4 classJSQ:5 6 7 def __init__(self):8 #创建主界面 9 ...

  5. 扫描功能代码编写_干净的代码编写功能或方法

    扫描功能代码编写 This article is the second of a clean code series, you can find the first part about Clean ...

  6. 温度转换java小程序_利用easygui模块编写的华氏温度与摄氏温度转换的小程序

    -*- coding:utf-8 -*- #Author:'Lmc' #DATE: 2019/4/23/0023 下午 4:23:08 #FileName:tem_compare_gui.PY imp ...

  7. python计算器小程序源码_python代码编写计算器小程序

    本文实例为大家分享了python计算器小程序的具体代码,供大家参考,具体内容如下 import tkinter import tkinter.messagebox import math class ...

  8. 全云端万能小程序_百搜全云端万能门店小程序v4.0.13五端独家2次开发升级独立版...

    百搜全云端五端万能小程序独立版简介: 包含:百度小程序,支付宝小程序,微信小程序,头条小程序,QQ小程序,H5,PC商城. 功能:支持小程序一键上传极速审核,对接微信开放平台发布使用,也可以单独使用开 ...

  9. java mysql 占位符_在Java中编写带占位符的SQL语句

    C#中SQL中带占位符的语句 假设有一张学员信息表Student,通过表中的ID来找学员,查询的SQL语句如下 string sql = string.Format("select * fr ...

最新文章

  1. java big o_java – 计算Big-O复杂性
  2. 2009年9月全国计算机等级考试四级网络工程师试卷_选择题
  3. stm32中使用#pragma pack(非常有用的字节对齐用法说明)
  4. 全量复制 增量复制 异步复制
  5. RESTLET开发实例(三)基于spring的REST服务
  6. Dotnet Core应用跨框架版本运行
  7. java linux获取实时cpu_用java取得linux系统cpu、内存的实时信息(参考别人代码)...
  8. poj1236 Tarjan算法模板 详解
  9. 前端—每天5道面试题(十)
  10. 深度学习学习笔记-双向LSTM-CRF模型论文研读
  11. windows性能监视器API
  12. 自动化学科前沿讲座分享,作业,自动化与人工智能
  13. C++ 完全不完全资源导引
  14. android支付宝转跳转,APP跳转支付宝指定界面
  15. 游戏盾能防住几T的攻击吗
  16. C++11 find和find_if的用法
  17. Python语言程序设计(MOOC崇天)第三章基本数据类型学习笔记(天天向上的力量+文本进度条)
  18. janusgraph编程指南之-Schema设计
  19. 搭建一个大型网站架构的实验环境(Squid缓存服务器篇)
  20. Win10系统安装详细说明

热门文章

  1. 操作系统笔记 清华大学陈渝
  2. 鸿蒙纪元1.1正式版隐藏,毁灭纪元1.1.1官方版附隐藏英雄密码
  3. 2017年问题汇总-待整理
  4. 毕设之基金定投小程序
  5. php源码怎样修改logo,dedecms网站改logo怎么操作
  6. 小窍门解决大问题(绝对值得收藏)
  7. 五个无刷马达驱动电路分享!
  8. caffe 人脸识别
  9. 利用Python实现word文档合并
  10. Google Dremel 原理 – 如何能 3 秒分析 1PB