业务程序员不建议造轮子

不要问我是.net程序员还是java程序员,我是业务程序员。

工作多年,我觉得业务程序员,不应该造轮子。

多年以前,我就吃过造轮子的亏,有时,我工作大概60%的时间在造轮子、改轮子的BUG,40%的时间在写业务功能。

为什么要造轮子呢,为了学技术,为了不认输。但是造轮子的代价很大,也影响工作,写着业务代码呢,突然出现BUG,而且是轮子的BUG,程序跑不下去了,然后去改轮子的BUG,很浪费时间。

业务代码有BUG很正常,随手就改了。但轮子最好不要有BUG,因为容易坑人。

但BUG总是存在的,怎么才能尽量避免BUG呢?要有完善的单元测试。怎么才能及时发现BUG呢?要有一定的用户量。

但是我的单元测试不够专业不够完善,也没有什么用户,我总结出来一些适合我自己的经验,只要不写代码,就没有BUG,只要代码写的少,BUG就少,所以,我把脏活扔了,把它降级为一个Dapper扩展。即便如此,依然付出了很多时间代价,也非常折腾人。

前两天,发现了一个严重BUG,然后修改后重新发布了。本着负责的态度,觉得这个BUG比较严重,把自己不再维护的旧库也修复重新发布了。但新旧多个版本的维护真的很累人。

单元测试、其它测试工程都测试通过了,又静态检查了代码,觉得没有问题了。可是,使用该轮子的业务代码居然又报错了,是轮子的错误。然后修改重新发布,把各种流程又走了一遍,好在不再维护的旧库没有这个问题,省了一些时间。

这个BUG有点意思,单元测试考虑到了,但没有测出来,如果是业务代码,可能完全没有问题,但轮子要考虑各种情况。

有BUG的代码如下:

/// <summary>
/// 提交事务
/// </summary>
public void CommitTransaction()
{
    if (_tran == null) return; //防止重复提交

    try
    {
        _tran.Commit();
    }
    catch
    {
        RollbackTransaction();
        throw;
    }
    finally
    {
        if (_tran != null)
        {
            if (_tran.Connection.State != ConnectionState.Closed) _tran.Connection.Close();
            _tran.Dispose();
            _tran = null;
        }
    }
}

我的单元测试代码使用的是MySql.Data库,没有问题。但我的项目中使用的库是MySqlConnector库,报空指针异常,因为MySqlConnector库,成功提交事务后,事务的Connection属性就被置为null了。修复后的代码如下:

/// <summary>
/// 事务关联的数据库连接
/// </summary>
private DbConnection _connForTran;

/// <summary>
/// 开始事务
/// </summary>
public DbTransaction BeginTransaction()
{
    var conn = GetConnection();
    if (conn.State == ConnectionState.Closed) conn.Open();
    _tran = conn.BeginTransaction();
    _connForTran = _tran.Connection;
    return _tran;
}

/// <summary>
/// 提交事务
/// </summary>
public void CommitTransaction()
{
    if (_tran == null) return; //防止重复提交

    try
    {
        _tran.Commit();
    }
    catch
    {
        RollbackTransaction();
        throw;
    }
    finally
    {
        if (_tran != null)
        {
            if (_connForTran != null)
            {
                if (_connForTran.State != ConnectionState.Closed) _connForTran.Close();
                _connForTran = null;
            }
            _tran.Dispose();
            _tran = null;
        }
    }
}

业务程序员不建议造轮子,但这是很矛盾的事。造轮子确实可以学到写业务代码学不到的技术。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章