几个月前我完全没有要将代码写得优美漂亮的想法,直到看到一段非常优美的代码。


  为什么要将代码写得优美?因为优美的代码意味着稳定、高效、易读,一段充满未知bug或者冗长罗嗦的代码绝对算不上优美的代码。优美的代码还有一个很重要的作用:让作者感到愉悦。每一个爱好技术的人绝对会因为自己技术上的成就感到身心愉悦。稳定的重要性不言而喻,要做到足够稳定就需要尽可能地去预判代码中可能出现的异常,要做到“尽可能”就需要不断地积累经验和学习他人优秀的编码风格。高效是继稳定之后另一个非常重要的影响用户体验的因素,高效的代码就需要高效的算法来实现。易读就是要让别的程序员能够尽可能地只是通过代码就能知道代码的功能,这一点需要从每个类、方法、变量的名称和尽可能简单的语法上去下功夫。


  那么怎样才能写出优美的代码?和每个人对于美的定义不同一样,不同的人对于代码的美意见也不同,下面我将从我自己写得一段我认为比较优美的代码来分析如何从细节去构建一段优美的代码。


  下面这段代码的功能是实现将Excel文件中的数据导入到Winform的DataGridView控件中。

  在写代码之前我们必须要确定的是命名规则,命名规则对于代码的易读性有着非常重要的作用,我采用的命名规则是:类名采用首字母大写的名词,事件和委托采用第一个单词首字母小写其他单词首字母大写的动名词组合,方法采用首字母大写的动名词组合,静态变量采用全大写用下划线分隔单词,全局变量的基本类型变量采用基本类型的首字母开头加下划线加第一个单词首字母小写其余单词首字母大写的变量名例如:string s_userName,全局变量的类的对象采用下划线开头加类名第一个字母小写加变量名例如: User _u_login,局部变量的命名规则在全局变量命名规则的基础上在每个变量的最前面加上字母小写"l"加下划线(类的实例有微小差别)例如:string l_s_userName User _l_u_login。有了这段命名规则,那么当我整个程序都采用这种命名规则后,任何一段代码只要我看到其中变量或方法的名称就能知道它的作用域和变量类型。


  命名规则确定后就是代码的编写。注:部分实现细节未展示

        public bool ImportDataFromExcel(string l_s_excelFileName)

        {

            string l_s_conn = "";


            l_s_conn = string.Formart(

                    @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source ='{0}';

                      Extended Properties ='Excel 8.0;HDR=NO;IMEX=1'"

                                        , l_s_excelFileName);


            OleDbConnection _l_e_conn = new OleDbConnection(l_s_conn);


            if (_l_e_conn == null) { return false; }


            _l_e_conn.Open();

            OleDbDataAdapter _l_e_cmd  = new OleDbDataAdapter("select * from [sheet1$]", _l_e_conn);


            if (_l_e_cmd  == null) { return false; }


            DataSet _l_d_data = new DataSet();

            _l_e_cmd.Fill(_l_d_data, "table1");


            DataTable _l_d_childTable = new DataTable();

            foreach (DataGridViewColumn dgvc in dgv.Columns)

            {

                if (dgvc.Visible && dgvc.CellType != typeof(DataGridViewCheckBoxCell))

                {

                    DataColumn dc = new DataColumn();

                    dc.ColumnName = dgvc.DataPropertyName;

                    _l_d_childTable.Columns.Add(dc);

                }

            }

            foreach (DataRow excelRow in ds.Tables[0].Rows)

            {

                int i = 0;

                DataRow dr = tb.NewRow();

                foreach (DataColumn dc in tb.Columns)

                {

                    dr[dc] = excelRow[i];

                    i++;

                }

                tb.Rows.Add(dr);

            }

            dgv.DataSource = tb;

        }