如何开发优秀的库代码

在系统规模越大越大、功能越来越复杂的当下,整个系统通常被拆分成多个功能模块,个人或团队负责其中的一个或多个模块。如果说约定好的接口是实现的标准的话,那么最后生成的库就是常见的最终的交付形式之一。那么,该如何开发出优秀的库代码呢?

首先,需要明确基本的功能需求。任何软件系统都是为了服务于具体的业务,业务的具体流程和要求就是对软件的需求。为了明确模块的具体需求,就需要对模块在整个系统中的位置有比较全面的了解,这样才能对它所在的上游接口和底层模块对它的限制和要求有深入的理解。

其次,使用通用的模型和数据结构实现。需求明确之后,剩下就是整个模块如何搭建设计的事情了。这个阶段最重要的能力就是抽象和建模能力。以一个边统计收集底层动态边向上提供查询报警信息的模块为例子,根据其中主要的数据流程,把统计搜集信息的子模块视作生产者,而查询和报警的模块就是消费者,因而整个模型本质就是一个生产者和消费者模型。这个分析的过程就是抽象建模的过程。既然模型已经清晰,那么就不难应用我们在操作系统中学习到关于生产者和消费者模型的基本知识了。当然,回归到具体实现,还需要考虑到下面的问题:数据的格式是否结构化的;数据的规模是几十个Byte,几个KB,还是数MB;是持续不断的增长还是偶尔才增长;需要访问最新的数据还是需要优先访问最早的数据;允许为缓存数据而分配的内存是否有限制;这些数据是否需要储存到日志当中去;是否需要优先从缓存中访问数据等等。上述的这些问题都需要紧密结合具体的业务需求给出答案,并且一旦上述问题清晰之后,我们就不难确定选择什么样的数据结构来组织这些数据。

这里特别要强调的是一旦确定了数据组织的结构,那么务必实现基于该数据结构常用的标准的操作方法或者函数,保证使用该数据结构的程序都有相应的函数或者方法去访问它,而不用再在业务层考虑数据结构内部的细节,这样就能把业务层和具体的数据结构层分离开来,更多的时间和精力能够集中到业务的实现上。比如,如果使用的是环形缓冲区,在具体的业务流程代码里面不应该出现引用环形缓冲区头、尾索引的代码,也不应该在业务层出现判断缓冲区空、满状态的具体代码,这些都必须引用针对环形缓冲区的基本插入、删除、判断空、判断满、计算元素长度的标准函数去实现。有的工程师会设计出带有自己特色的数据结构、甚至实现有些特别的函数,这个本无可厚非,但如果可能还是应该尽量实现标准的数据结构和常用的方法,这样的好处一是会大大降低出错的概率,二是会极大地提高程序的可读性和可维护性能。

再者,需要考虑到所有调用库函数和访问数据的场景,这些可能的场景包括:1. 存在多个调用者同时调用库中函数的可能,并且库代码里面使用了全局变量或者静态变量,那么不要忘记用锁等并发互斥机制保证数据的一致性;2. 在所有的业务逻辑流程当中,是否存在生产者和消费者,或者多读者和多写者的模型,如果存在,需要使用相应的同步互斥机制保证数据一致性;同时,也要兼顾整个系统对代码在空间(内存、存储)和时间(性能、响应时间、吞吐率、IOPS)纬度的具体的要求;而在业务逻辑上千万不要只考虑到主要的、正常执行的操作流程,务必考虑到各种现实中可能出现的错误操作流程和依赖模块出现问题的情况。此外,还需要考虑今后是否需要升级、前后版本如何保证兼容等问题。

最后,进行可测试性设计和开发。实现可测性开发的手段包括但不限于:在模块开发过程中就考虑支持断言、日志、debug Mode等模式来提高程序的可调试程度;每开发一个小的新功能和模块之后,就写出一个测试程序去及时测试;把所有的小测试模块集中起来,整理成一个可以全部运行和检查的自动化测试程序或脚本。

总而言之,一个好的库代码的实现除了需要考虑功能完整性、稳定性、健壮性、鲁莽性之外,还务必需要重视它的通用性、可维护性、可调试性、可读性、数据一致性和时空要求和限制。

时间: 2024-08-08 05:19:49

如何开发优秀的库代码的相关文章

IOS开发第三方开源库

IOSios开发第三方开源库 1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS.Mac OS X网络通信类库,现在是GitHub上第三大Objective-C库.它建立在NSURLConnection.NSOperation等类库的基础上,让很多网络通信功能的实现变得十分简单,因此,许多iOS应用开发都会使用到它. 支持HTTP请求和基于REST的网络服务(包括GET.POST.PUT

JAVA程序员一定知道的优秀第三方库(2016版)

几乎每个程序员都知道要“避免重复发明轮子”的道理——尽可能使用那些优秀的第三方框架或库,但当真正进入开发时,我却经常发现他们有时并不知道那些轮子在哪里.最近,我在业余时间带几个年轻的程序员一起做了一个很小的商业项目,而在一起开发的过程中,我几乎在所有需要判断字符串是否为空的地方,看到了下面的代码: if(inputString == null || inputString.length == 0){......} 1 除了字符串判断是否为空之外,还有很多字符串处理或其他数据类型判断的方法,缺少经

iOS开发常用三方库、插件、知名博客等等

TimLiu-iOS   Swift版本点击这里 欢迎加入QQ交流群: 594119878 介绍 这是一个用于iOS开发的各种开源库.开源资料.开源技术等等的索引库. github排名 https://github.com/trending,github搜索:https://github.com/search 使用方法 根据目录关键字搜索,记得包含@,以保证搜索目录关键字的唯一性. 问题反馈 期待大家和我们一起共同维护,同时也期望大家随时能提出宝贵的意见(直接提交issues即可).请广大网友只

[转]JAVA程序员一定知道的优秀第三方库(2016版)

原文地址:http://blog.csdn.net/zxc123e/article/details/51418163 几乎每个程序员都知道要“避免重复发明轮子”的道理——尽可能使用那些优秀的第三方框架或库,但当真正进入开发时,我却经常发现他们有时并不知道那些轮子在哪里.最近,我在业余时间带几个年轻的程序员一起做了一个很小的商业项目,而在一起开发的过程中,我几乎在所有需要判断字符串是否为空的地方,看到了下面的代码: if(inputString == null || inputString.len

ios 开发中 动态库 与静态库的区别

使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库,多个应用程序共享内存中得同一份库文件,节省资源 3使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的. 从1可以得出,将整个应用程序分模块,团队合作,进行分工,影响比较小. 等其他好处, 从2可以看出,其实动态库应该叫共享库,那么从这个意义上来说,苹果禁止iOS开

iOS开发之静态库(五)—— 图片、界面xib等资源文件封装到静态框架framework

编译环境:Macbook Air + OS X 10.9.2 + XCode5.1 + iPhone5s(iOS7.0.3) 一.首先将资源文件打包成bundle 由于bundle是静态的,所以可以将“iOS开发之静态库(三)—— 图片.界面xib等资源文件封装到.a静态库”中生成的“MyToolsWithAssetsA.bundle”文件直接拿过来使用. 二.创建静态框架 创建过程参考“iOS开发之静态库(四)—— 静态框架framework制作”,里面介绍非常详细. 静态库代码借用“iOS开

Hybrid App开发git多分支代码版本管理实践

3.Setting Up and Configuring Backup and Recovery 这个单元讲述如何启动.与rman client如何互动,准备rman环境,实现备份和恢复策略 注意:尽管闪回数据库和安全还原点不是真的数据库备份,但是它们是数据保护策略一个重要部分.这些特性需要一些初始化设置,这些设置依赖于在备份策略中你怎么混合它们.Chapter 5-Data Protection with Restore Points andFlashback Database 提供了关于怎么

Android开发之手机铃声代码实现

如果读到的是音频文件路径,需要先将音乐文件插入到多媒体库.如:path传入:/mnt/sdcard/mp3/a.mp3 //设置--铃声的具体方法 public void setMyRingtone(String path) { File sdfile = new File(path); ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, sdfile.getAbsolutePa

git 一般的开发流程中的代码管理

一般的开发流程中的代码管理 1. 从版本库中下载代码 git clone ssh://[email protected]192.168.1.3:29418/mustang-web 2. 针对某个feature(比如instance-lanuch)开新分支 cd mustang-webgit checkout -b instance-lanuch插一句:每次从master同步代码以后,最好执行pip install -r requirments.txt,保证被人新加的库被安装好可以查看目前拥有的分