首页 > 编程语言 >[TSG开发日志4]算法组件、个人编写的库文件如何封装成DLL,如何更好地对接软件开发?

[TSG开发日志4]算法组件、个人编写的库文件如何封装成DLL,如何更好地对接软件开发?

时间:2023-07-15 17:23:43浏览次数:41  
标签:int TSG 代码 DLL Test 算法 动态链接库 日志

写在前面

这个内容确实是我有点疏忽了,我以为做算法的同事应该多少对这方面会有点了解的。但是我想了一下我刚毕业的时候,确实对这方面的理解不深,查了很多资料才勉强搞懂什么意思,也是后来随着工程学习的愈加深入,才渐渐了解了在C++开发中动态链接库的重要性及如何编写。

一般在说一个标准时,我喜欢从两个角度出发:为什么,怎么做。

一、为什么

这里问的是为什么要把自己的算法组件打包成C++动态链接库。
事实上,我不仅需要你作为一名开发,写出来的代码需要打包成一个DLL的动态链接库,而不是直接提供工程文件,或者直接提供 .h文件和.cpp文件?其实主要从以下几个角度出发:

  1. 代码保护:通过提供动态链接库,您可以隐藏算法的源代码和实现细节,从而更好地保护您的知识产权。其他人只能使用动态链接库提供的接口来调用算法,而无法查看或修改算法的实现。

    这个对于大伙来说其实不那么重要,因为作为软件开发我不够关心算法是怎么写的,但是这个世界不好说是不是小人多,也许今天你把算法交给他了,明天他就拿到github上开源说是自己写的了。

  2. 代码封装:动态链接库允许您将算法封装为一个单独的实体,从而提供一个清晰的接口和功能集。其他开发人员可以直接使用库提供的函数,而无需关心算法的内部实现。

    这么说吧,前面的开发并不关心你算法代码是怎么实现的,你这样将一坨代码粗暴的插入到软件中是非常不合适的,因为这会导致测试上的拖沓,试想一下,当程序崩溃时,测试员/程序员如果追到你的代码里面去,这时候你说你的代码在本地实现很好啊,这时候你和软件开发双方该如何面对彼此?是不是非常尴尬?因为错误确实是在你的代码中发生的,但是确实是在他的程序里才会发生这种问题,你自己本地运行就不会发生这种问题,这下你们两个人就扯不清了!会严重拖慢测试进度和开发进度,而这样的问题会在你短暂的职业生涯中疯狂地折磨你的精神,直到永远,因为和算法对接的那个软件开发大概率也不会关心算法是怎么写的,他在乎他自己(悲。

  3. 版本控制:通过提供动态链接库,您可以更轻松地进行版本控制。如果您对算法进行了更新或修复,只需提供更新的动态链接库即可,而不需要重新编译依赖于该算法的其他代码。

    试想一下,你现在手上有一个算法Calculation1,你交到软件A的时候是v1.0.1版本,交的是.h和.cpp文件,你交过去之后软件开发要对你的代码做好一番修改(这几乎是必然的)之后才能顺利插入到软件中去。

    时过境迁,多年后,你的算法要被另一款软件使用了,而这个软件B的时候可能你的算法已经提供了非常完备的计算方法,计算的能力也获得了巨大进步,已经是v2.14.10版本了,这个时候你再同样的将.h和.cpp文件插入到软件中。

    突然,维护A软件的同志惊奇地发现,原来Calculation1算法从一开始就有巨大的问题,是一直依靠内存溢出或者什么莫名其妙的bug才能正常运行的。你非常惊讶,但想了一下自己应届的水平,确实,写出这种代码是人之常情。于是你潇洒的一批把v2.14.10交给了软件开发。

    也许是作为一名算法开发完全不需要遵守开闭原则或者其他设计模式(虽然我建议每一位算法都去看一下,这坨v2.14.10完全用不了,那边需求又来得很急,最终你和开发争不过只能重写Calculation1,你越看这个代码越生气,自己当年怎么就写出坨这么个东西,看了半天,决定重写。但是甲方的催促已经驾到你的脖子上了,你只能在丧钟一般的微信报警中熬夜通宵重写完这个算法,装上软件一编译,满屏幕的依赖错误,输出的结果不符合预期,输入经常会报错。你扶额看着这一摊究极烂摊子。天亮的时候必须给甲方一个答复,而你的答复是...

  4. 跨语言兼容性:动态链接库可以被多种编程语言调用和使用。通过提供动态链接库,您可以使算法在不同的编程语言和平台上可用和可调用。

    事实上,我们希望所有的算法都提供统一C接口的动态链接库。因为我们都知道算法是确定的,而语言是不确定的。什么意思呢?就是这个项目部会经历很多东西,也许他会从C#到Qt,再从Qt到C#,再到GO,再到VB,再到Rust,再到Ruby,甚至到前端,到什么乱七八糟的C++ 114514版本,规范和当年的完全不同了————

    但是呢?哪怕是核弹轰炸了东京,你的动态链接库从点云中解算出净空的算法仍然是正确的。如果我们说TSD这个软件是一坨屎,那么点云解算算法就是这坨屎圣代上的神圣樱桃,值得永远传承下去,而不是疯狂地重写迭代。

它就永远存在 懂我的意思吗,就算是公司炸了,公司重建了,公司上市了,公司退市了,世界崩塌了,世界重启了,我死了,我出生了,我怀孕了,我堕胎了,我又出生了,如果你写的是C接口的动态链接库,那么它就永远存在.

所以为了大家的心里更健康一点,请写类C接口,哪怕是COM组件呢?

看完以上四点,想必你已经明白为什么要把代码封装成动态链接库了吧?

这既是为了你好,也是为了那个软件开发好。当然了如果你从入职开始就考虑好什么时候跑路,请联系我

标签:int,TSG,代码,DLL,Test,算法,动态链接库,日志
From: https://www.cnblogs.com/Leventure/p/17556274.html

相关文章

  • mysqld.log日志文件输出的时间不对
    在本机新安装MySQL8后,查看mysql.log日志发现输出的日志有点不对劲,如下图所以:差不多相差了8个小时,但是我们查看数据库的时间的时候又是正常的,如下图所示:通过翻看MySQL官方文档后发现,新增了一个参数log_timestamps来设置错误日志输出的时区,如下图所示这个变量默认值是UTC,我们......
  • 如何修改dll代码后重新打包
    前期使用反编译工具,例如:dnSpy,打开指定dll,展开dll后,右键可对其命名空间,模块,程序集进行编辑。因为缺少源码,反编译后的dll代码与源码存在差异,导致编译后的dll大概率会报错,无法修改代码后重新打包,如果要修改dll里的代码并重新打包,需要用到微软自带反编译工具。路径:C:\ProgramFiles(......
  • 实现loganalyzer展示图形日志
    三台主机rsyslog,mysql,loganalyzer1rsyslogyuminstallrsyslog-mysqlscp/usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql192.168.30.17:vim/etc/rsyslog.conf$ModLoadommysql*.info;mail.none;authpriv.none;cron.none:ommysql:192.168.30.17,Syslog,sys......
  • Loki+Promtail+Grafana 监控 K8s 日志
    Loki架构:1、loki:服务端,负责存储日志和处理查询2、promtail:采集端,负责采集日志发送给loki3、grafana:负责采集日志的展示创建yml文件cat>loki-rbac.yaml<<EOFapiVersion:v1kind:ServiceAccountmetadata:name:lokinamespace:thanos-monitoringapiVersion:rbac......
  • SLF4J 日志框架与 SpirngBoot
    SLF4J是一个相对成熟的日志框架,它基于外观模式(门面模式)实现了插拔式的日志实现替换功能,而且还提供了其他日志框架的迁移方案。迁移方案目的依赖库备注将ApacheCommonsLogging框架打印的日志桥接至SLF4J框架jcl-over-slf4j需要在构建工具中排除jcl的......
  • WiredTiger引擎的日志和检查点机制
    每个数据库系统都要确保持久性和可靠性。MongoDB使用journal和检查点来每个数据库系统都必须确保持久性和可靠性。MongoDB使用Journals和Checkpoints完成WAL(Write-Ahead-Logging)。从最基本的开始,为什么首先需要WAL?这是为了确保我们的数据在每次写操作之后都是持久的,并且在不......
  • 日志
    目录日志轮转访问权限日志轮转1、项目的日志需要考虑日志轮转,不然可能会把磁盘空间打爆。设置单个文件大小100MB,最大文件数量10个,每小时转储一次等等。访问权限linux/unix系统上的文件和文件夹需要设置相应的访问权限,符合安全规范:程序文件目录-------550(r-xr-x---)配置文......
  • 遇到问题一定要学会看日志
    如果你生病了到医院,医生首先会问你哪里不舒服,然后通过你的描述来确认病情,如果还无法确认就得让你去验血或者拍片。最后根据结果来进一步确认你到底有什么病。这个道理大家都明白,其实作为一个运维人,服务器在我们眼里就是我们的病人,而我们就是给它看病的医生。如何确认病情?我们自然......
  • 发送请求忘记指定协议方式,日志com.jcraft.jsch.JSchException: java.net.ConnectExcep
      2023-07-1319:06:51.487-ERROR17629---[http-nio-192.168.2.206-36093-exec-8]c.t.b.p.b.c.common.util.sftp.SftpPool:com.jcraft.jsch.JSchException:java.net.ConnectException:拒绝连接(Connectionrefused)_atcom.jcraft.jsch.Util.createSocket(......
  • Kubernetes轻量级日志工具Loki安装及踩坑记录
    Loki简介Loki是Grafana出品的一个轻量级日志系统,熟悉ELK的都知道ELK使用起来的成本,而且仅仅是日志检索使用ELK的话有点大材小用了。Loki8技术栈中使用了以下组件。Promtail用来将容器日志发送到Loki或者Grafana服务上的日志收集工具,该工具主要包括发现采集目标以及给日志......