10步让你成为更优秀的程序员

本文分享了作为专业程序员多年来的经验总结,包括避免复制代码、注意分心时刻、测试代码、代码审查等11条提高编程效率和代码质量的建议。通过实践这些步骤,可以显著提升个人编程能力。

英文原文:10 steps to becoming a better programmer

  篇文章要介绍的,是我作为专业程序员这些年来学到的能真正提高我的代码质量和整体工作效率的 10 件事情。

  1. 永远不要复制代码

  不惜任何代价避免重复的代码。如果一个常用的代码片段出现在了程序中的几个不同地方,重构它,把它放到一个自己的函数里。重复的代码会导致你的同事在读你的代码时产生困惑。而重复的代码如果在一个地方修改,在另外一个地方忘记修改,就会产生到处是 bug,它还会使你的代码体积变得臃肿。现代的编程语言提供了很好的方法来解决这些问题,例如,下面这个问题在以前很难解决,而如今使用 lambdas 却很好实现:

/// <summary> /// 一些函数含有部分重复代码
/// </summary> void OriginalA ()
{
    DoThingsA ();

    // unique code 
    DoThingsB ();
}

/// <summary> /// 另外一个含有部分重复代码的函数
/// </summary> void OriginalB ()
{
    DoThingsA ();

    // 没有重复的代码 
    DoThingsB ();
}

  现在我们重构含有部分相同代码的函数,用 delegate 模式重写它们:

/// <summary> /// Encapsulate shared functionality
/// </summary> /// <param name="action">User defined action</param> void UniqueWrapper (Action action)
{
    DoThingsA ();

    action ();

    DoThingsB ();
}

/// <summary> /// New implmentation of A
/// </summary> void NewA ()
{
    UniqueWrapper (() =>
    {
        // unique code     });
}

/// <summary> /// New implementation of B
/// </summary> void NewB ()
{
    UniqueWrapper (() =>
    {
        // unique code     });
}

  2. 留意你开始分心的时候

  当你发现自己在浏览 facebook 或微博、而不是在解决问题,这通常是一种你需要短暂休息的信号。离开办公桌,去喝一杯咖啡,或去跟同事聊 5 分钟。尽管这样做看起来有点反直觉,但长久去看,它会提高你的工作效率。

  3. 不要匆忙赶任务而放弃原则

  当带着压力去解决一个问题或修改一个 bug,你很容易失去自制,发现自己匆匆忙忙,甚至完全忘了一直坚持的重要的测试过程。这通常会导致更多的问题,会让你在老板或同事眼里显得很不专业。

  4. 测试你完成的代码

  你知道你的代码能做什么,而且试了一下,它确实好用,但你实际上需要充分的验证它。分析所有可能的边界情况,测试在所有可能的条件下它都能如期的工作。如果有参数,传递一些预期范围外的值。传递一个 null 值。如果可能,让同事看看你的代码,问他们能否弄坏它。单元测试是到达这种目的的常规方法。

  5. 代码审查

  提交你的代码之前,找个同事一起坐下来,向他解释你做了哪些修改。通常,这样做的过程中你就能发现代码中的错误,而不需要同事说一句话。这比自己审查自己的代码要有效的多得多。

  6. 让代码更少

  如果你发现写了大量的代码来解决一个简单的问题,你很可能做错了。下面的 boolean 用法是一个很好的例子:

if (numMines > 0)
{
   enabled=true;
}
else
{
   enabled=false;
}

  这时你应该写成这样:

enabled = numMines > 0;

  代码越少越好。这会使 bug 更少,重构可能性更小,出错的几率更小。要适度。可读性同等重要,你可不能这样做而使代码丧失可读性。

  7. 为优雅的代码而努力

  优雅的代码非常的易读,只用手边很少的代码、让机器做很少的运算就能解决问题。在各种环境中都做到代码优雅是很难的,但经过一段时间的编程,你会对优雅的代码是个什么样子有个初步的感觉。优雅的代码不会通过重构来获得。当你看到优雅的代码是会很高兴。你会为它自豪。例如,下面就是一个我认为是优雅的方式来计算多边形面积的方法:

static public double GetConvexPolygonArea (Vector2[] vertices)
{
    double area = 0;
    for (int i = 0; i < vertices.Length; i++)
    {
        Vector2 P0 = vertices[i];
        Vector2 P1 = vertices[(i + 1) % vertices.Length];

        area += P0.Wedge (P1);
    }

    return area / 2;
}

  8. 编写不言自明的代码

  勿庸置疑,注释是编程中很重要的一部分,但能够不言自明的代码跟胜一筹,因为它能让你在看代码时就能理解它。函数名变量名要慎重选择,好的变量/方法名字放到语言语义环境中时,不懂编程的人都能看懂。例如:

void DamagePlayer (Player player, int damageAmount)
{
    if (!player.m_IsInvincible && !player.m_IsDead)
    {
        player.InflictDamage ( damageAmount );
    }
}

  能自我说明的代码不能代替注释。注释是用来解释“为什么”的,而自我说明的代码是来描述“是什么”的。

  9. 不要使用纯数字

  直接把数字嵌入代码中是一种恶习,因为无法说明它们是代表什么的。当有重复时更糟糕——相同的数字在代码的多个地方出现。如果只修改了一个,而忘记了其它的。这就导致 bug。一定要用一个命名常量来代表你要表达的数字,即使它在代码里只出现一次。

  10. 不要做手工劳动

  当做一系列动作时,人类总是喜欢犯错误。如果你在做部署工作,并且不是一步能完成的,那你就是在做错事。尽量的让工作能自动化的完成,减少人为错误。当做工作量很大的任务时,这尤其重要。

  11. 避免过早优化

  当你要去优化一个已经好用的功能代码时,你很有可能会改坏它。优化只能发生在有性能分析报告指示需要优化的时候,通常是在一个项目开发的最后阶段。性能分析之前的优化活动纯属浪费时间,并且会导致 bug 出现。

  好吧,我说是 10 个,但你却得到了额外赠送的一个!

  这些就是我要说的,我希望它们能帮助你改进编程开发过程。

  下次再见!祝快乐!

  Cheers, Paul.

下载方式:https://pan.quark.cn/s/26794c3ef0f7 本文阐述了在Django框架中如何适当地展示HTML内容的方法。 在Web应用程序的开发过程中,常常需要向用户展示HTML格式的数据。 然而,在Django的模板系统中,为了防御跨站脚本攻击(XSS),系统会默认对HTML中的特殊字符进行转义处理。 这意味着,如果直接在模板代码中插入包含HTML标签的字符串,Django会自动将其转化为文本形式,而不是渲染为真正的HTML组件。 为了解决这个问题,首先必须熟悉Django模板引擎的安全特性。 Django为了防止不良用户借助HTML标签注入有害脚本,会自动对模板中输出的变量实施转义措施。 具体而言,模板引擎会将特殊符号(例如`<`、`>`、`&`等)转变为对应的HTML实体,因此,在浏览器中呈现的将是纯文本而非可执行的代码。 尽管如此,在某些特定情形下,我们确实需要在页面上呈现真实的HTML内容,这就需要借助特定的模板标签或过滤器来调控转义行为。 在提供的示例中,开发者期望输出的字符串`<h1>helloworld</h1>`能被正确地作为HTML元素展示在页面上,而不是被转义为文本`<h1>helloworld</h1>`。 为实现这一目标,作者提出了两种解决方案:1. 应用Django的`safe`过滤器。 当确认输出的内容是安全的且不会引发XSS攻击时,可以在模板中这样使用变量:```django<p>{{ data|safe }}</p>```通过这种方式,Django将不会对`data`变量的值进行HTML转义,而是直接将其当作HTML输出。 2. 使用`autoescape`标签。 在模板中,可以通过`autoesc...
已经博主授权,源码转载自 https://pan.quark.cn/s/1d1f47134a16 Numerical Linear Algebra Visual Studio C++实现数值线性代数经典算法。 参考教材:《数值线性代数(第2版)》——徐树方、高立、张平文 【代码结构】 程序包含两个主要文件 和 。 中实现矩阵类(支持各种基本运算、矩阵转置、LU 分解、 Cholesky 分解、QR分解、上Hessenberg化、双重位移QR迭代、二对角化),基本方程组求解方法(上三角、下三角、Guass、全主元Guass、列主元Guass、Cholesky、Cholesky改进),范数计算方法(1范数、无穷范数),方程组古典迭代解法(Jacobi、G-S、JOR),实用共轭梯度法,幂法求模最大根,隐式QR算法,过关Jacobi法,二分法求第K大特征值,反幂法,SVD迭代。 中构建矩阵并求解。 【线性方程组直接解法】 不选主元、全主元、列主元三种Guass消去法,Cholesky分解及其改进版。 【report】 【方程组解误差分析】 矩阵范数计算、方程求解误差分析。 【report】 【最小二乘】 QR分解算法求解线性方程组、最小二乘问题。 【report】 【线性方程组古典迭代解法】 Jacobi迭代法、G-S迭代法、SOR迭代法求解方程组。 【report】 【共轭梯度法】 实用共轭梯度法。 【report】 【非对称特征值】 幂法求模特征根、QR方法(上Hessenberg分解、双重位移QR迭代、隐式QR法) 【report】 【对称特征值】 过关Jacobi法、二分法、反幂法。 【report】 【对称特征值】 矩阵二对角化、SVD迭代。 【report】
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值