业务程序员不建议造轮子

十念  论坛元老 | 2023-6-13 20:30:39 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1036|帖子 1036|积分 3108

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不要问我是.net程序员还是java程序员,我是业务程序员。
工作多年,我觉得业务程序员,不应该造轮子。
多年以前,我就吃过造轮子的亏,有时,我工作大概60%的时间在造轮子、改轮子的BUG,40%的时间在写业务功能。
为什么要造轮子呢,为了学技术,为了不认输。但是造轮子的代价很大,也影响工作,写着业务代码呢,突然出现BUG,而且是轮子的BUG,程序跑不下去了,然后去改轮子的BUG,很浪费时间。
业务代码有BUG很正常,随手就改了。但轮子最好不要有BUG,因为容易坑人。
但BUG总是存在的,怎么才能尽量避免BUG呢?要有完善的单元测试。怎么才能及时发现BUG呢?要有一定的用户量。
但是我的单元测试不够专业不够完善,也没有什么用户,我总结出来一些适合我自己的经验,只要不写代码,就没有BUG,只要代码写的少,BUG就少,所以,我把脏活扔了,把它降级为一个Dapper扩展。即便如此,依然付出了很多时间代价,也非常折腾人。
前两天,发现了一个严重BUG,然后修改后重新发布了。本着负责的态度,觉得这个BUG比较严重,把自己不再维护的旧库也修复重新发布了。但新旧多个版本的维护真的很累人。
单元测试、其它测试工程都测试通过了,又静态检查了代码,觉得没有问题了。可是,使用该轮子的业务代码居然又报错了,是轮子的错误。然后修改重新发布,把各种流程又走了一遍,好在不再维护的旧库没有这个问题,省了一些时间。
这个BUG有点意思,单元测试考虑到了,但没有测出来,如果是业务代码,可能完全没有问题,但轮子要考虑各种情况。
有BUG的代码如下:
  1. /// <summary>
  2. /// 提交事务
  3. /// </summary>
  4. public void CommitTransaction()
  5. {
  6.     if (_tran == null) return; //防止重复提交
  7.     try
  8.     {
  9.         _tran.Commit();
  10.     }
  11.     catch
  12.     {
  13.         RollbackTransaction();
  14.         throw;
  15.     }
  16.     finally
  17.     {
  18.         if (_tran != null)
  19.         {
  20.             if (_tran.Connection.State != ConnectionState.Closed) _tran.Connection.Close();
  21.             _tran.Dispose();
  22.             _tran = null;
  23.         }
  24.     }
  25. }
复制代码
我的单元测试代码使用的是MySql.Data库,没有问题。但我的项目中使用的库是MySqlConnector库,报空指针异常,因为MySqlConnector库,成功提交事务后,事务的Connection属性就被置为null了。修复后的代码如下:
  1. /// <summary>
  2. /// 事务关联的数据库连接
  3. /// </summary>
  4. private DbConnection _connForTran;
  5. /// <summary>
  6. /// 开始事务
  7. /// </summary>
  8. public DbTransaction BeginTransaction()
  9. {
  10.     var conn = GetConnection();
  11.     if (conn.State == ConnectionState.Closed) conn.Open();
  12.     _tran = conn.BeginTransaction();
  13.     _connForTran = _tran.Connection;
  14.     return _tran;
  15. }
  16. /// <summary>
  17. /// 提交事务
  18. /// </summary>
  19. public void CommitTransaction()
  20. {
  21.     if (_tran == null) return; //防止重复提交
  22.     try
  23.     {
  24.         _tran.Commit();
  25.     }
  26.     catch
  27.     {
  28.         RollbackTransaction();
  29.         throw;
  30.     }
  31.     finally
  32.     {
  33.         if (_tran != null)
  34.         {
  35.             if (_connForTran != null)
  36.             {
  37.                 if (_connForTran.State != ConnectionState.Closed) _connForTran.Close();
  38.                 _connForTran = null;
  39.             }
  40.             _tran.Dispose();
  41.             _tran = null;
  42.         }
  43.     }
  44. }
复制代码
业务程序员不建议造轮子,但这是很矛盾的事。造轮子确实可以学到写业务代码学不到的技术。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表