随想录(构建自己的代码库)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】


曾经有一段时间,我非常地苦恼,那就是如何提高自己的代码健壮性?难道,除了单元测试就没有别的办法了吗。这一问题困挠了我很久。直到最近才有了一丝眉目。作为整个完整的项目来说,它涉及到的不可控因素很多。而对个人来讲,困难的东西也很多,但是还是有很多办法可以提高个人开发效率的方法的。比如说,建立自己的代码库就是不错的一个办法。采用已经经过测试的方法,可以在短时间达到提高效率的方法。


(1)建立自己本地的函数库代码

构建代码库是最基本的一个方法。比如说,如果对算法比较熟练,可以在本地创建一个基本的函数库代码。这些代码可以包括常用的一些基本算法和数据结构,比如说链表、栈、堆、二叉树、排序算法、查找算法等等。注意,这些代码只要自己用得顺手就可以,至于短时间能不能为别人通用,那就是后话了。


(2)创建跨平台的代码库

现在,我们需要的代码常常需要实现跨平台的功能。因此,我们可以在本地构建一些基本的跨平台函数,比如说内存访问、线程互斥、文件操作、网络操作、数据库操作等等。当然,其他的因素比如说字节序、字节序也要进行考虑。因为构建本地跨平台的代码库是一项长期的基本工作,但是一旦做好了,不但可以提高自己最代码的理解能力,还能有效地提高自己的开发效率。


(3)对已经存在的业务模块进行抽象和提炼

不可否认,我们现在的很多工作具有很大的重复性,那我们是否可以将业务进行提炼处理,抽象出一个基本的架构模块。独立出来的模块可以安排一个编译宏,如果模块本身没有支持,那么完全可以不让它参加编译。经过提炼出来的模块,不但可以具有很大的拓展性,而且在健壮性上面也会有保证。


(4)多使用开源库代码

很多时候,我们使用开源库代码,不代表相应的代码我们自己没有办法写出来。只是因为效率和时间的问题。如果业界对此已经有一个比较公认和权威的代码,那我们自己实在是没有必要重复造车轮子。这方面的代码很多了,比如说lua、webkit、ffmpeg、zip、libpng、libjpg、lwip、ucos、sqlite、ftgk等等。只要我们对这些代码进行测试了,那么为什么别人的代码不能为我们所用呢?


(5)保存和改进自己的练习代码

很多人都有一个不好的习惯,当然也包括我在内。那就是,我们不注意积累平常自己的练习代码。等到一段时间之后,就会发现自己曾经确实练习过这样的代码。可是原来的代码早已经不存在了。保存原来的代码,让我们的工作可以建立在一个更高的起点上面,同时节约了时间。现在的移动硬盘这么便宜,放几十兆或者上百兆的代码,我想应该是没有什么问题的吧。这总比dota、qq飞车、nba、实况足球、仙剑奇侠、天下、天龙八部的空间要少吧。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Algorithms   本次README修订为算法仓Algorithms的第100次commit,首先我们庆祝自2016年8月4日本仓建立以来Dev-XYS在算法学习方面取得的显著进步!   这里有各种算法的C++代码,任何人可以在自己的任何程序中使用,欢迎大家指出代码中的错误以及有待改进的地方。   本仓内所有代码的授权方式为Unlicense,大家如果使用我的代码开发自己的软件挣了大钱,或是参考我的代码在NOI中得了金牌,我都会很高兴的。使用这里的代码之后,你可以自主选择是否公开源代码。总而言之,你可以把这里的代码当作你自己写的一样,无论怎样使用都是被允许的。但是,我不对本仓代码的正确性负责。大家要是使用我的代码开发软件而导致程序崩溃,或是参考我的代码在考试时出错,请不要向我抱怨。如果你愿意,遇到问题可以在Issues中提出来,我们共同解决。我们不赞成Pull Request,因为本仓主要储存作者已经学习的算法,全部代码均由作者本人负责维护与更新。   以下索引提供了本仓内算法的中文名,方便大家查找。更新可能有很长时间的延迟,不保证所有算法的名称都在列表中出现。 Index --------------------------Contents-------------------------- --------------------------FileName-------------------------- AC自动机 Aho-Corasick-Automation 单源最短路径(SPFA) Bellman-Ford(Queue-Optimised) 单源最短路径(Bellman-Ford) Bellman-Ford 使用Edmonds-Karp进行二分图匹配 Bigrpah-Matching(Edmonds-Karp) 普通的二叉搜索树 Binary-Search-Tree 广度优先搜索 Breadth-First-Search 冒泡排序 Bubble-Sort 桶排序 Bucket-Sort 组合数的递推求解 Combination(Recursion) 枚举组合 Combination 基本的复数类 Complex-Number 割点 Cut-Vertex 深度优先搜索 Depth-First-Search 堆优化的Dijkstra算法 Dijkstra(Heap-Optimised) 并查集 Disjoint-Set-Union 最大流Edmonds-Karp算法 Edmonds-Karp 欧拉函数 Euler's-Totient-Function 有向图的欧拉回路 Eulerian-Tour(Digraph) 拓展欧几里得算法 Extended-Euclid 简单的快速幂 Fast-Exponentiation 树状数组 Fenwick-Tree 所有结点对之间的最短路径(Floyd) Floyd-Warshall 凸包算法(Graham扫描法) Graham-Scan 辗转相除法求最大公约数 Greatest-Common-Divisor 堆排序 Heap-Sort ISAP算法 Improved-Shortest-Augmenting-Path(Naive) 插入排序 Insertion-Sort 字符串匹配(KMP) Knuth-Morris-Pratt 最小生成树(Kruskal) Kruskal 最近公共祖先(Tarjan) Least-Common-Ancestor(Tarjan) 使用后缀数组求解最长公共子串 Longest-Common-Substring 最长上升子序列(n·log(n)) Longest-Increasing-Subsequence(n·log(n)) 倍增法求最近公共祖先 Lowest-Common-Ancestor(Doubling) 朴素的矩阵乘法 Matrix-Multiplication(Naive) 归并排序 Merge-Sort 最小堆 Min-Heap 乘法逆元 Modular-Multiplicative-Inverse 仅支持单点修改的可持久化线段树(维护区间和值) Persistent-Segment-Tree(Sum) 试除法素数测试 Prime-Check(Naive) 线性的素数筛法 Prime-Sieve(Linear) 队列的基本操作 Queue 快速排序的优化版本 Quick-Sort(Extra-Optimised) 快速排序的随机化版本 Quick-Sort(Randomized) 快速排序 Quick-Sort 使用向量叉积判断两个有向线段的时针关系 Segment-Direction 线段树维护区间最大值 Segment-Tree(Maximum) 线段树维护区间最小值 Segment-Tree(Minimum) 线段树维护区间和值 Segment-Tree(Sum) 普通的选择算法 Selection Eratosthenes素数筛法 Sieve-of-Erotosthenes 指针版的单向链表 Singly-Linked-List(Pointer) 跳表 Skip-List ST表 Sparse-Table 伸展树 Splay 博弈论SG函数 Sprague-Grundy 栈的基本操作 Stack 递推法求解无符号第一类斯特林数 Stirling-Number(Cycle,Unsigned,Recursion) 递推法求解第二类斯特林数 Stirling-Number(Subset,Recursion) 倍增法求解后缀数组 Suffix-Array(Doubling) 倍增法求解后缀数组(附带Height数组) Suffix-Array-with-Height(Doubling) 使用Tarjan算法求解强连通分量 Tarjan(Strongly-Connected-Components) 数组版的字典树 Trie(Array) 指针版的字典树 Trie(Pointer)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值