平常開發規範(持續更新)

開發注意事項
  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();
    }
}
相關文章
相關標籤/搜索