zoukankan      html  css  js  c++  java
  • 日常开发规范(持续更新)

    开发注意事项
    1. 建表时,一定要选择好可能需要建索引的字段,而且尽量为多个字段建立 多列索引 而不是为每个字段建立单列索引,要不然后期数据量一大,查询将会非常慢

    2. select where order by等sql关键字后最好接索引字段,要不然容易走全表查询,在编写sql语句时,可先使用explain查看语句的执行结果,可参考 MySQL高级知识(六)——索引优化

    3. 在代码中尽量多用async、await关键字。对于传统的事件模型也可以转换为async/await的异步编程模型。

    4. ef core的tolistasync在大数据量是会变慢,这点需要注意,参考:SqlClient 流支持 检索二进制数据。参考 https://www.cnblogs.com/dudu/p/10423126.html 。我们可以自己写一个基于ado.net 查询的扩展方法,代码如下:示例代码(1)

    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天重构学习笔记

    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();
        }
    }
    
  • 相关阅读:
    Oracle通过透明网关连接SQL SERVER
    无法初始化链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.Jet.OLEDB.4.0" 的数据源
    DBGrid应用
    C#学习之C#3.0语言功能
    windows 下 java 环境配置
    discuz UCenter对接遇到问题总汇
    mysql 备份之mysqldump 常用命令
    struts2与FreeMarker 简单配置实现
    hessian 简单实现
    jquery ui
  • 原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/10926310.html
Copyright © 2011-2022 走看看