程序员与工匠精神

2023-05-16

前几天和一个朋友聊天时说:我有强迫症,每次看到不符合自己审美的代码时,总想重构一下。朋友的观点与大多数人相仿,程序只要满足要求,运行正确就可以。
在现实的工作中一样,每当看到一段优美且高效的代码,我总是喜欢多看几遍,满心的享受。但是我们产品中的太多代码让我这个代码洁癖“患者”看了非常的烦躁:
1. 随便一个源文件都是上百行的函数,有些甚至超过500行(含空行和注释)。
2. 大量没有必要的临时变量定义。
3. 习惯性的把所有变量声明定义放到函数前面,一些大函数甚至超过20行都是函数局部变量的声明和定义。想想看,在第一个异常检查之后程序返回,而前面定义的十几个变量变得毫无价值。
4. 功能相仿的重复代码。
诸如此类的代码问题,给程序维护带来无尽的风险,而大多数技术管理者却认为代码重构根本毫无必要,甚至很多人认为只要设计文档写好,代码符合文档要求,顺利通过公司的各种质量评审,这段代码就最好不要动。要命的是,很多大型软件,很多团队共同开发,团队A要在团队B开发的代码中修改,为了省事,根本不考虑重构,甚至函数都不愿意增加一个,任由代码行数累加。
哎,如果我是一个技术管理者,我希望可以把敏捷中对于代码质量的要求贯彻和执行。程序开发者应该把自己看做一个追求极致的工匠,而不是一个累代码的民工。
之前完整的看了老罗的手机发布会,他最后一句话:我不是为了输赢,我就是认真。我当时真的打心底里感动,不管老罗的这次创业能否颠覆国内的手机市场,仅凭他的工匠精神,衷心的祝福他和他的公司取得成功,工匠精神配得上一次成功。
为了说明这个问题,我用一段代码重构结束这篇牢骚。
原代码:
http://www.cplusplus.com/reference/cstdarg/va_arg/?kw=va_arg
/* va_arg example */
#include <stdio.h> /* printf */
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
int FindMax (int n, ...)
{
  int i,val,largest;
  va_list vl;
  va_start(vl,n);
  largest=va_arg(vl,int);
  for (i=1;i<n;i++)
  {
    val=va_arg(vl,int);
    largest=(largest>val)?largest:val;
  }
  va_end(vl);
  return largest;
}
int main ()
{
  int m;
  m= FindMax (7,702,422,631,834,892,104,772);
  printf ("The largest value is: %d\n",m);
  return 0;
}

这里并不是说原来的代码不好,仅仅是为了做说明之用。
有些重构并不一定可以减少总体的代码行数,但是可以改善代码的可读性和可重用性。假设上面的代码时作为API接口,具体的实现函数声明为static,仅仅对外开放FindMax函数声明。代码的开放封闭原则,应该在最初编码的时候有一个清晰和严格的标准。
重构后的代码:
//findMax.h
#ifndef _FIND_MAX_H_
#define _FIND_MAX_H_
int FindMax (int n, ...);
#endif
//findMax.cpp
#include <stdarg.h> /* va_list, va_start, va_arg, va_end */
#include <iostream>
#include "findMax.h"
using namespace std;
static int getTheLargest(va_list vl, int n)
{
    int val;
    int largest =0;
   
    for (int i=0;i<n;i++)
    {
        val=va_arg(vl,int);
        largest=(largest>val)?largest:val;
    }
    va_end(vl);
    return largest;
}
int FindMax (int n, ...)
{
    va_list vl;
    va_start(vl,n);
    return getTheLargest(vl, n);
}
//va_list_example.cpp
#include <stdio.h> /* printf */
#include <stdlib.h>
#include "findMax.h"
int main()
{
    printf ("The largest value is: %d\n",FindMax (7, 702,822,631,834,892,104,772));
    system("PAUSE");
}
控制台输出:
The largest value is: 892
Press any key to continue . . .
PS:
最近两个月一直没有更新博客,一方面工作确实太忙,另一方面花了很多时间在做个人的微信工作号:瑜伽分享汇。希望喜欢瑜伽的朋友们,可以关注。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序员与工匠精神 的相关文章

  • Android--›系统源码下载之"指定模块源码的下载"(如:系统闹钟源码下载)

    网上大多数的文章都是介绍Android系统源码的下载 本文小清新 介绍Android系统中 单个模块源码的下载 其实repo下载的Android系统 就是通过下载多个小模块 然后拼起来的 简单介绍下Android源码下载方法 来自Andro
  • FAT12文件系统

    一 FAT12软盘格式 软盘格式如图1 xff1a 每个扇区是512字节 xff0c 512B 2880 61 1 44MB 图 1 软盘 xff08 1 44MB xff0c FAT12 xff09 1 引导扇区 占512字节 xff0c
  • X86/Win32函数调用规范研究

    一 函数调用总体框图如下 xff1a 二 C语言函数如下 xff1a int sum int x int y int s s 61 x 43 y return s int foo void int m 61 2 int n 61 3 int
  • ELF文件结构

    一 ELF文件结构如下图 xff1a 之所以要用ELF文件格式 xff0c 是因为这样可以用C语言和汇编语言混合写内核代码 二 ELF header及Program header详细介绍 nasm f elf o kernel o kern
  • int 13H int 10H int 15H

    一 int 13h中断 对于1 44MB的软盘来讲 xff0c 总共有两面 xff08 磁头号0和1 xff09 xff0c 每面有80个柱面 xff08 0 79 xff09 xff0c 每个柱面有18个扇区 软盘的容量的由来 xff1a
  • Orange's 进程

    解释一个操作系统的实现 chapter6 r中代码 程序流程如下 xff1a 1 把Loader中的GDT和esp挪到Kernel中 xff0c 初始化IDTPTR 2 初始化8259 xff0c 初始化IDT xff0c 初始化GDT中的
  • Orange's TTY

    一 TYY任务本质就是增加了一个进程 xff0c 并且运行在ring1 xff0c 且优先级调高了 并且设置了键盘中断用于接收键盘输入 xff0c 并将扫描码存放在缓冲区 task tyy也就是新加入的进程 xff0c 循环执行读写缓冲区
  • C语言指针强制类型转换

    一 举例说明 上图 对应函数调用为int printf const char fmt xff0c fmt为char 指针类型 xff0c 所以共占了32位字节 xff0c 但是 fmt执行的是一个字节 xff0c fmt 43 43 执行的
  • Orange's 进程间通信

    新增一个系统进程 xff0c 和TESTA进行通信 xff0c 通信的流程是这样的 xff0c 如果首先执行到系统进程 xff0c 发送消息 xff0c 那么会触发内中断到ring0级 xff0c 完成发送所需要的动作 xff0c 之后回到
  • IDEA找不到项目根路径问题【多模块情况】

    如果不对idea进行设置 则默认项目根路径是父项目根路径下 xff0c 即使父项目就是一个壳儿 从eclipse转过来又点不习惯 下面给出解决方法 在启动项找到Edit 这个配置 找到要启动的那个项目 xff0c 进行配置 解决 这时候这个
  • 使用wmic命令获得计算机硬件信息

    wmic的使用方法 wmic 硬件信息名称 get 属性名称 xff0c 属性名称2 代码示例 xff1a java获取CPU代码 public static String getCpuId throws IOException Proce
  • Kotlin--›Android Activity/Fragment转场动画极简使用方法

    Activity之间共享元素实现的转场动画 需要API gt 61 21才支持 但是 转场动画 在 support包里面提供了支持 所以没有API 21的限制 可以参考Transition转场动画的文章 https blog csdn ne
  • android日志抓取

    目录说明 00 mtk dump mtk dump文件 01 qcom dump qcom dump文件
  • 带你走进EJB--EJB和Spring对比

    通过对 EJB 系列的总结和学习我们已经对 EJB 有了基本的了解 但是为了更进一步的去深入学习 EJB 我们很有必要将它拿出来跟之前非常熟悉的 Spring 进行一下对比 通过对比来了解这两个内容的相同与不同之处 更有利于我们对两者进行深
  • Dubbo之旅--Provider示例

    在本篇文章中我们将通过集体的示例来对 Dubbo 的提供和消费进行代码层面的认识 这里所介绍的是基本的提供者和消费者通过 Spring 容器来进行相关的提供和消费的服务 首先看整个示例的项目结构如下 我们通过 Maven 的方式来进行示例
  • Dubbo之旅--问题汇总

    在工作和学习的过程中 具体运用 Dubbo 的时候遇到了很多的问题 这些问题一方面让自己进一步了解所谓的 dubbo 另一方面通过对它们的总结和分析能够在工作中加倍的提高效率 接下来将会对遇到的和别人总结的一些常见的问题进行汇总 1 增加提
  • Dubbo之旅--集群容错和负载均衡

    当我们的系统中用到 Dubbo 的集群环境 因为各种原因在集群调用失败时 xff0c Dubbo提供了多种容错方案 xff0c 缺省为failover重试 Dubbo 的集群容错在这里想说说他是因为我们实际的项目中出现了此类的问题 因为依赖
  • 我和敏捷开发的故事--敏捷角色-SM

    通过上篇文章我们已经知道了敏捷角色中 PO 的角色内容 接下来的一个敏捷角色在敏捷开发中非常关键 但是往往很多项目实践中都没有很好的把控好这个角色 让他或多或少的没有起到相应的作用 这个角色就是 ScrumMaster Scrum Mast
  • backup

    backup
  • backup

    backup

随机推荐