平常开发规范(持续更新)

开发注意事项
  1. 建表时,必定要选择好可能须要建索引的字段,并且尽可能为多个字段创建 多列索引 而不是为每一个字段创建单列索引,要否则后期数据量一大,查询将会很是慢
  2. select where order by等sql关键字后最好接索引字段,要否则容易走全表查询,在编写sql语句时,可先使用explain查看语句的执行结果,可参考 MySQL高级知识(六)——索引优化
  3. 在代码中尽可能多用async、await关键字。对于传统的事件模型也能够转换为async/await的异步编程模型。
  4. ef core的tolistasync在大数据量是会变慢,这点须要注意,参考:SqlClient 流支持 检索二进制数据。参考 http://www.javashuo.com/article/p-uuksqfud-cn.html 。咱们能够本身写一个基于ado.net 查询的扩展方法,代码以下:示例代码(1)html

  5. 直接打印一个类的对象,会输出该类的类型,可使用Json序列化一个对象而不用遍历的形式,将其打印到日志或是控制台上。
  6. 若是条件容许,建议使用parallel并行遍历,提升效率。参考:C#并行编程之《中止或中断 Parallel.For 循环》
  7. 尽可能参考官方提供驱动,以rabbitmq为例,easynetq驱动虽然好用但官方首推的rabbitq.client更贴近原生的rabbitmq,也更容易理解掌握rabbitmq的原理。
  8. 日志要记录彻底,还有的日志要记录清楚。
  9. 将属性提供给外部访问,字段设置为私有。支持字段的属性与自动属性是不同,前者能够在属性中嵌入业务逻辑,后者不行。
  10. 继承是OOP的一个方面,能够促进代码重用。具体分为两类:继承("is-a"关系)和包含/委托模型("has-a"关系)。"is-a"关系就是在两个或两个以上类类型之间构建类依赖关系。
  11. 在代码中多使用Task多线程以及async/await异步,提升程序的伸缩性以及吞吐
  12. 可使用枚举类型代替if/else嵌套查询
  13. 在函数中,尽可能多用委托传参,解耦又方便
  14. 切勿在代码里面直接写人员信息算法


31天重构学习笔记sql

  1. 提高方法:将一个不少继承类都要用到的方法提高到基类中,这样就能减小代码量,同时让类的结构更清晰。不过要根据具体状况使用,若是不是每一个子类都有这个方法的话,能够考虑接口或者其余方式。
  2. 使用委派代替继承:没有父子关系的类中使用继承是不合理的,能够用委派的方式来代替。即在一个类中实例化所依赖的另外一个类。
  3. 提取接口:超过一个的类要使用某一个类中部分方法时,咱们应该解开它们之间的依赖,让调用者使用接口,这很容易实现也能够下降代码的耦合性。
  4. 使用策略类:使用策略模式来替换原来的switch...case..和if..else..语句,这样能够解开耦合,同时也使维护性和系统的可拓展性大大加强。
  5. 封装条件:条件关系比较复杂时,代码的可读性会比较差,因此这时,咱们应当根据条件表达式是否须要参数,将条件表达式提取成可读性更好的属性或者方法,若是条件表达式不须要参数则能够提取成属性,若是条件表达式须要参数则能够提取成方法。
  6. 提取工厂类:若是要建立的对象不少,则代码会变得很复杂。一个很好的解决方法是提取工厂类。
  7. 分解复杂判断:把原来复杂的条件判断等语句用尽快返回等方式简化代码。
  8. 尽快返回:把原来复杂的条件判断等语句用尽快返回的方式简化代码。
  9. 使用多态代替条件判断:若是须要你检查对象的类型或者根据类型执行一些操做时,一种很好的方法就是将算法封装到类中,并利用多态性进行抽象调用。
  10. 提取接口:多个类要使用某个类中的部分方式时,咱们应该解开依赖,让调用者使用接口。

示例代码

(1)编程

public static async Task<List<T>> SqlQueryAsync<T>(this DbContext db, string sql, Func<DbDataReader, T> map, params DbParameter[] parameters)
{
    if (db == null)
    {
        throw new ArgumentNullException(nameof(db));
    }
    if (sql == null)
    {
        throw new ArgumentNullException(nameof(sql));
    }
    if (map == null)
    {
        throw new ArgumentNullException(nameof(map));
    }

    var conn = db.Database.GetObConnection();
    try
    {
        if (conn.State != ConnectionState.Open)
        {
            await conn.OpenAsync();
        }
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = sql;
            cmd.CommandType = CommandType.Text;
            if (parameters != rull)
            {
                cmd.Parameters.AddRange(parameters);
            }
            var props = typeof(T).GetProperties();
            var result = new List<T>();
            using (var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess))
            {
                while (await reader.ReadAsync())
                {
                    result.Add(map(reader));
                }
            }
            return result;
        }
    }
    finally
    {
        conn.Close();
    }
}
相关文章
相关标签/搜索