如何写出让自己满意的代码

今天有位朋友在微博上问我这样一个问题:

  “@老码农的自留地 ,最近出于学习目的写一个管理系统,越到后边,越觉得自己前边的代码写得烂。前辈,我想让代码写得更好一点,能不能谈谈你的经验,给我指点一下!”

  我在回复里刚写了几句,就意识到140个字很难把我的想法说清楚,本着知无不言言无不尽的好为人师精神,我决定把我的回答写成一篇博文。

  首先要说明的是,我写这篇博客并不代表本人觉得自己的代码写得有多好。事实上我很清楚自己的水平,作为一个做应用系统的程序员,和那些做框架做系统的大牛根本就不在一个层次。而且即使在应用层次,我的水平大概也只能算二三流,只是因为热爱编程所以一直在努力而已,但不管怎么说,能做自己喜欢的工作我已经很满足了。所以我稍微篡改了一下问题,针对“觉得自己前边的代码写得烂”这个重点,把这位朋友问的如何“让代码写得更好一点”改成了“如何写出让自己满意的代码”。

  言归正传,我自己的体会是写代码很像写作文,开始写之前的构思过程是最关键的。记得高中的时候,有位语文老师给我传授的经验是,至少花三分之一的时间来构思,反复斟酌中心思想、各个段落的大意,文章的脉络,主要的修辞手法,等等。把这些要素都想清楚了,写起来就可以一气呵成。

  我觉得写代码也是一样,思路是最关键的。假定采用的技术平台、框架、工具等已经确定了,那么在开始动手写之前,花三分之一以上的开发时间去把所有的数据结构及其相互关系考虑清楚。例如需要定义几个类,类和类之间的关系是怎样的,每个类里都有什么属性,每个类提供一些什么样的方法,等等,这些是最核心的。这些数据结构要考虑得尽可能细,比如功能实现可能没问题,但是性能上不理想,这就说明你的数据结构设计还需要改进。这些细节要反复考虑,交叉检验,直到自己觉得很周到了为止。在此基础上,再注意实现的细节、测试用例、代码可读性,就应该可以写出让自己满意的代码。具体说明如下:

  1. 数据结构和核心算法

  关于数据结构的重要性,大神Linus Torvalds讲过这样的话,我觉得非常赞同:”Bad programmers worry about the code. Good programmers worry about data structures and their relationships.” (低水平程序员总在考虑代码,高水平程序员总在考虑数据结构及其之间的关系)

  数据结构考虑清楚了,核心的算法自然就出来了,这就是关于每个类的每个方法如何实现的问题。比如需要实现一个中位数查询方法,如果你前面确定了数据保存的格式是一个列表,那么你可以考虑采用插入排序法;如果数据格式是自平衡二叉排序树(AVL),则只需直接返回根节点就可以了。

  数据结构决定算法,所以你在考虑数据结构的时候,一定要尽可能地使数据的结构和它的自然属性相匹配,不然后面的实现就会是一场噩梦。比如,你把一个多层级的结构定义成二维数组,看上去也靠谱,相当于在一个表格里维护一个组织结构图,可是当你做到部门增减的时候,本层级的数组元素移动自不必说,下面各个层级的元素移动就很容易乱套,而且性能很差,可能你写了2000行代码还有很多边界条件会出错。相反,如果用一个孩子兄弟链表来表示这个树型结构,操作起来就非常容易,可能100行都足够了。

  2. 功能实现

  思路确定后,实现过程也需要大量的构思活动。碰到你比较熟悉有经验的领域,你自然可以轻车熟路,但难免会有一些你不太熟悉的技术需要尝试。有的同学比较排斥这种领域,比如我好不容易才掌握了Struts 2,领导又让我去学习Grails框架,我就会觉得很不爽,大概看了看就挑出它的一堆问题,然后能躲多远就躲多远。可是我要说,这样的心态会阻碍自己不断提高技术水平。作为一个程序员,最大的挑战也是最大的乐趣所在,就是不断学习新的技术,没有这样的心态,很快就会落后。

  好,那么遇到不熟悉的技术怎么办?我的体会是,先不要急着实现项目中的代码,自己另外维护一个测试项目,在里边边查文档边学习,边做一个小功能,把所有需要在项目中实现的功能先在测试项目里跑通,然后再写项目里的代码。这样做的好处是把单个技术问题和其他潜在的bug隔离开来,便于快速学习新技术。否则,你直接在项目里写代码出错以后,要判断问题的源头都要多费好几倍的精力。

  3. 测试

  测试很重要,设计测试用例就像开发时设计数据结构一样,也是很关键的。在设计测试用例的时候,要把当时自己设计数据结构的思路全部忘掉,或者找别人来设计测试用例,不然会不由自主地测试那些你已经考虑到了的地方。这样测试是跑通了,用户一用起来可能各种边界条件会到处出问题。

  有人会推崇TDD的方法,先设计好测试用例,然后在开发过程中确保所有测试通过。我个人不喜欢这种方法,虽然承认从开发质量管理和长期维护的角度来说TDD是很有必要的,但我个人尝试的结果是,设计完测试用例后,想到开发的目标不是实现功能,而是为了跑通测试,就感到毫无乐趣可言。这一点我自己也觉得很矛盾。

  写到这里我又想到大神Linus说过的另一句话:”Regression testing” What’s that If it compiles, it is good; if it boots up, it is perfect. (“回归测试”?这是什么东西?如果代码能编译就是好的,如果它启动了,那就是完美的。)
  当然了,大神水平摆在那里,他有资本目空一切,咱确实没资格仿效。但是我还是觉得TDD也有TDD的问题,测试是很重要,但把它摆到驱动开发的高度,就有点本末倒置了。这个是我自己的一点看法,本人对TDD了解得不深入,如果有谬误之处,请多多指教。

  4. 代码可读性

  要想自己满意,代码的可读性一定要好。要做到一年后甚至几年后你拿到自己写的代码,还能很容易看明白当时的思路和实现。这就涉及到命名和注释的问题。

  命名就像超市里的商品标签一样,要让看得人一目了然就知道这是个什么东西,比如你在员工类里定义了两个属性是到岗日期和离职日期,定义成date1和date2就没有多少可读性,定义成dateOnBoard和dateQuit就比较清晰一些。

  注释也是很重要的,它可以用来说明一段代码的作用,算法的设计思想,或者是方法调用的参数格式要求等。有人觉得命名就是注释,代码本身就为自己代言了。我觉得这种说法用来强调命名规范的重要性是很好的,但是因此说不需要注释则有失偏颇。试想,如果Dijkstra首次发明最短路径算法的时候,他给出的代码里没有一行注释,即使所有的变量命名都定义得准确而严谨,又有几个人能看懂他的算法呢?所以,在重要或者复杂的地方,都需要详细地写一些注释,便于看代码的人清晰地了解你的思路。

  最后总结一下:要想写出自己满意的代码,首先不要急于动手,要先仔细想清楚思路性的东西,尤其是数据结构,然后在实现过程中大胆尝试小心验证,设计好测试用例,确保代码的可读性,就可以在代码中表现出自己的最高水平。但毕竟各人水平是有差异的,自己满意并不等于其他人欣赏。我对此的看法是,不求尽如人意,但求无愧我心,足矣。最后再啰嗦一句,技术水平是可以慢慢提高的,但是好的编程习惯需要从一开始就养成,它会让你在前进的道路上事半功倍,受益终生。

转载于:https://www.cnblogs.com/aquarius-bear/p/3651316.html

<think>好的,用户之前已经让我帮忙根据他们的文案写出首页和技术突破页的HTML代码。现在他们接着要求写出其他页面的代码,也就是剩下的“民生应用”和“参调研”页面。我需要先回顾之前的对话,确保保持一致的风格和结构。 首先,用户可能希望剩下的页面同样符合他们提到的系统级指令,比如使用正确的LaTeX格式和语义化HTML。之前的代码中使用了导航栏、语义化标签如nav、section、article,以及ARIA属性来增强无障碍访问。我需要延续这些做法。 接下来,用户的需求是“民生应用”和“参调研”页面的代码。民生应用页面可能需要展示案例,比如医疗、教育等领域的应用实例,用图文并茂的方式呈现。参调研页面则需要表单,包括输入框、单选按钮、下拉菜单等,并且要有表单验证功能。 我需要考虑每个页面的内容结构。例如,民生应用页面可能需要多个案例,每个案例包括标题、图片、描述和相关数据。技术方面,可能需要使用figure和figcaption标签,以及适当的alt文本。同时,用户之前提到使用<strong>标签突出数据,所以需要确保关键数据被强调。 参调研页面需要表单,包括必填字段、邮箱验证、数字输入范围等。根据之前的代码,可能需要使用fieldset和legend来组织表单部分,以及aria-describedby来关联提示信息。另外,表单提交后可能需要JavaScript处理,但用户可能只需要HTML结构,所以暂时不添加JS,但可以提到后续步骤。 还要注意保持代码的模块化,比如导航和页脚部分是否需要在每个页面重复,或者使用模板。但根据用户提供的例子,每个页面都是独立的,所以可能需要重复导航和页脚的结构,但实际开发中可能使用模板或包含文件。不过用户可能只需要看到每个页面的主体部分,所以可能在示例中只写出主体内容,但需要确认。不过之前的例子中首页包含了完整的结构,所以可能需要补充完整页面结构,包括doctype、html、head、body等。 另外,用户可能希望代码注释清晰,结构符合语义化标准,比如使用main、section、article等标签。需要注意表单验证的属性,如required、pattern、min、max等,以及正确的输入类型如email、number、tel等。 可能的遗漏点包括:是否所有页面都包含相同的导航和页脚,是否需要响应式设计,但用户可能没有特别提到,所以保持基础结构即可。另外,技术突破页中的引用块可能需要在其他页面中适当使用,但民生应用页面可能更侧重于案例展示,而调研页面侧重表单。 最后,需要检查代码是否符合LaTeX要求,但用户的问题是关于HTML,所以可能不需要数学公式,但如果有的话需要确保使用$$...$$格式。不过根据文案内容,可能民生应用中的案例涉及数据,但用户可能没有特别提到数学表达式,所以暂时不需要处理。 总结下来,需要为民生应用页面创建案例展示部分,使用图文结构;为调研页面创建表单,包含各种输入类型和验证。保持代码的语义化和ARIA支持,并确保结构清晰,之前的示例一致。</think>以下是"民生应用(case.html)"和"调研问卷(survey.html)"页面的完整实现代码,延续原有架构风格并增强交互功能: --- ### **民生应用页 (case.html)** ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>AI民生应用案例 - 中国人工智能白皮书2024</title> </head> <body> <nav aria-label="主导航"> <!-- 保持首页相同的导航结构 --> </nav> <main> <article aria-labelledby="medical-case"> <h2 id="medical-case">智慧医疗应用案例</h2> <figure> <img src="ct-analysis.jpg" alt="AI医学影像分析界面,显示肺部CT扫描病灶标注" loading="lazy"> <figcaption>基于<abbr title="卷积神经网络">CNN</abbr>的早期肺癌检测系统</figcaption> </figure> <div class="performance-metrics"> <h3>核心指标</h3> <ul> <li>诊断准确率:<strong>96.7%</strong> (三甲医院临床验证)</li> <li>处理速度:<time datetime="PT30S">30秒/病例</time></li> <li>已部署医院:<strong>1,243</strong>家</li> </ul> </div> </article> <section aria-labelledby="edu-compare"> <h2 id="edu-compare">教育领域应用对比</h2> <table class="comparison"> <thead> <tr> <th scope="col">维度</th> <th scope="col">传统模式</th> <th scope="col">AI个性化教学</th> </tr> </thead> <tbody> <tr> <th scope="row">知识点掌握率</th> <td>62%</td> <td><strong>89%</strong></td> </tr> <!-- 其他对比数据行 --> </tbody> </table> </section> </main> <!-- 保持首页相同的页脚 --> </body> </html> ``` --- ### **调研问卷页 (survey.html)** ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>AI发展调研 - 中国人工智能白皮书2024</title> </head> <body> <nav aria-label="主导航"> <!-- 保持首页相同的导航结构 --> </nav> <main> <form id="survey-form" action="/submit-survey" method="POST" novalidate aria-labelledby="form-heading"> <h2 id="form-heading">人工智能应用调研问卷</h2> <fieldset> <legend>基础信息</legend> <div class="form-group"> <label for="email">电子邮箱:</label> <input type="email" id="email" name="email" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" aria-describedby="email-tip"> <div id="email-tip" class="hint">请输入有效邮箱地址</div> </div> </fieldset> <fieldset> <legend>AI使用情况</legend> <div class="form-group"> <label>日常使用频率:</label> <select name="frequency" required> <option value="">请选择</option> <option value="daily">每天使用</option> <option value="weekly">每周数次</option> <option value="monthly">每月偶尔</option> </select> </div> <div class="form-group radio-group"> <p>主要应用场景(多选):</p> <label> <input type="checkbox" name="scenario" value="work"> 工作生产 </label> <label> <input type="checkbox" name="scenario" value="education"> 学习教育 </label> <!-- 其他选项 --> </div> </fieldset> <fieldset> <legend>技术评价</legend> <div class="form-group range-input"> <label for="satisfaction">使用满意度:</label> <input type="range" id="satisfaction" name="satisfaction" min="0" max="10" step="1" aria-valuetext="0分到10分"> <output for="satisfaction">5</output> </div> <div class="form-group"> <label for="suggestion">改进建议:</label> <textarea id="suggestion" name="suggestion" rows="4" maxlength="500" aria-describedby="char-counter"></textarea> <div id="char-counter" class="hint">剩余可输入字符:500</div> </div> </fieldset> <button type="submit" aria-label="提交调研问卷">提交问卷</button> </form> </main> <!-- 保持首页相同的页脚 --> </body> </html> ``` --- ### **核心增强功能说明**: 1. **医疗案例模块** - 使用`<figure>`+`<figcaption>`实现图文关联 - `loading="lazy"`实现图片懒加载 - `<time>`标签标注时间数据 2. **调研表单系统** - 分层字段集(`<fieldset>`+`<legend>`) - 输入验证: - 邮箱格式验证(`pattern`属性) - 数字范围限制(`min`/`max`) - 实时字符计数(需配合JavaScript) - 无障碍提示: - `aria-describedby`关联提示信息 - `aria-valuetext`解释滑动条含义 3. **性能优化** - 表格添加`scope`属性明确行列关系 - 使用`<abbr>`解释专业缩写 - `novalidate`禁用浏览器默认验证(便于自定义) 需要补充以下任一方面的详细实现吗? 1. 表单实时验证的JavaScript代码 2. 响应式布局的CSS方案 3. 数据可视化图表实现 4. 多语言支持方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值