很久很久前就想写这个话题的文章了,但是,总是找不到合适的例子。例子简单不足于说明问题,例子复杂可读性就会降低,就会达不到文章的目的。两难总让人激发解决问题的斗志,于是乎自己试着写写这个例子吧。这个例子就是学籍管理中增加学籍信息的一个功能。我想通过这个例子的不同的解决思路,来说明编程的层次步步提高。(注意:文中所有函数都是即兴编写,没有通过调试验证,仅用于说明)

已知:1)数据库名为:mydb,密码:1234

2) 主表名为:student

3)student字段名:

Id char(6)   ;学籍编号

Name char(10)   ;学生姓名

Sex char(2)    ;学生性别

Born_date char(8) ;学生出生日期

F1    char(10)   ;其他字段1

F2    char(20)   ;其他字段2

F3    char(30)   ;其他字段3

F4    char(40)   ;其他字段4

求:将界面上的学生信息增加到数据库中。

注意:此功能不考虑学籍编号的重复等问题,不考虑例外处理,采用insert语句进行信息插入,为了便于简化问题,以上字段都采用Char型等。

 方法1

1、 设计界面拖拉8个控件用于接收8个学生信息。控件名为:ctrl1、ctrl2、ctrl3...ctrl8

2、 假定控件均为文本框。

3、 设计一个增加命令按钮

4、 命令按钮程序:用C#编写:将控件中的信息写入到数据库student表中。

Public void add_data()

{

string con_str = "Provider=SQLOLEDB.1;Password=1234;Persist Security Info=True; User ID=mydb;";

OleDbConnection conn = new OleDbConnection(con_str);

conn.Open();

string insert_str = "insert into student (id,name,sex,born_date,f1,f2,f3,f4) valuses ";

string valuses_str = "(";

valuses_str = valuses_str + "'" + ctrl1.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl2.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl3.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl4.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl5.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl6.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl7.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl8.text.tostring().trim() + "'";

valuses_str = valuses_str + ")";

string sql_str = insert_str + valuses_str;

OleDbCommand cd = new OleDbCommand(sql_str, conn);

cd.CommandType = CommandType.Text;

cd.ExecuteNonQuery();

cd.Dispose();

conn.Close();

conn.Dispose();

}

方法1分析:

此编程为最常见,特点就是就事论事,一气呵成,达到设计要求。此为一般之水平。

 方法2同方法1,但是编写时注意到了方法1没有逻辑划分,不便于阅读。于是改进之处是:将程序进行逻辑划分,通过函数调用来清晰功能的结构。主函数只有三行语句。

其命令按钮程序为:

Public void add_data()

{

OleDbConnection conn =Open_db();

Stirng sql=Get_insert_str();

Exec_sql(sql,conn);

}

Public OleDbConnection open_db(string db_name,string password)

{

String conn_str= "Provider=SQLOLEDB.1;Password=1234;Persist Security Info=True; User ID=mydb;";

OleDbConnection conn = new OleDbConnection(con_str);

conn.Open();

return conn;

}

Public string Get_insert_str()

{

string insert_str = "insert into student (id,name,sex,born_date,f1,f2,f3,f4) valuses ";

string valuses_str = "(";

valuses_str = valuses_str + "'" + ctrl1.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl2.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl3.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl4.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl5.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl6.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl7.text.tostring().trim() + "'" + ",";

valuses_str = valuses_str + "'" + ctrl8.text.tostring().trim() + "'";

valuses_str = valuses_str + ")";

string sql_str = insert_str + valuses_str;

return sql_str;

}

Public void Exec_sql(string sql_str, OleDbConnection conn)

{

OleDbCommand cd = new OleDbCommand(sql_str, conn);

cd.CommandType = CommandType.Text;

cd.ExecuteNonQuery();

cd.Dispose();

conn.Close();

conn.Dispose();

}

方法2分析:

方法2强调了逻辑划分,将一个功能分成了3个函数。可读性大大加强。初步地使用了参数和参数调用,为函数公用打下了基础,但是,在get_insert_str()中,还是和方法1一样,没有什么技巧。

方法3

同方法2,但是要解决get_insert_str()中语句简单、语句行数过多问题,以及字段变化对程序的影响问题。其方法是,对控件命名进行重新命名:txt_id,txt_name,txt_sex,txt_born_date,txt_f1,txt_f2,txt_f3,txt_f4。使之包含字段名。

public string get_insert_str()

{

string flds = "id,name,sex,born_date,f1,f2,f3,f4";

string insert_str1 = get_insert_str1(flds);

string sql = "insert into student " + insert_str1;

return sql;

}

public string get_insert_str1(string flds)

{

string [] flds_array=flds.Split(',');

int n=flds_array.Length;

string fld_str="("+flds+")";

string values_str= "(";

for (int i = 0; i < n; i++)

{

values_str = values_str + "'" + get_ctrl_value("txt_"+flds_array[i],Page) + "'";

if (i < n - 1)

values_str = values_str + ",";

}

values_str= values_str + ")";

string sql = fld_str + " values " + values_str;

return sql;

}

public string get_ctrl_value(string ctrl_name,System.Web.UI.Page page)

{

foreach (Control maincontrol in page.Controls)

{

foreach (Control obj in maincontrol.Controls)

{

string type = obj.GetType().ToString();

if (type.IndexOf("TextBox") != -1)

{

TextBox txt = new TextBox();

txt = (TextBox)obj;

if (txt.ID == ctrl_name)

return txt.Text.ToString().Trim();

}

}

}

return "";

}

方法3分析:

通过重新命名控件名,建立字段名和控件名的关系,利用字段名的字符串,将控件中的值通过循环语句,逐一的计算处理,并形成了insert语句。这个技巧的好处在于,当字段增加和减少时,只要通过编辑filds的字符串便可解决了。不需要增加减少任何语句。当字段增加很多时,语句行数仍然不变。另外,get_ctrl_value()函数成了公共函数,与实际功能只存在被调用的关系。

方法4

以上方法都是着眼于本功能的优化。分离出的函数只满足本功能使用,眼界很低。我们可以扩展我们的眼界将函数用于我们的整个系统。因为系统中还有很多地方有类似的数据插入功能的。

这个时候,我们可以考虑编写一个程序,将功能中的一些子函数打造成通用函数,例如:open_db,exec_sql, get_insert_str1,get_ctrl_value等,并将它变成DLL,供整个系统的调用。

方法4分析:

方法4是一种革命性的变革,程序员终于将自己目光投向整个系统,也就是说,编制一段程序不仅仅是用于一个功能,而是用于整个系统中相同的功能。很多程序员很难跨出这一步,他们懒得考虑程序的复用性,相同功能可能因时间的不同,而导致程序的不同,更多的程序员则满足于复制粘贴这种简单的复制,当源程序出错的时候,所有粘贴的地方都要改变。我们说程序的复用性树立是程序员水平提高的重要标志。

方法5

方法4的眼界虽然提高到整个系统,但是,眼界还是比较低。因为有太多的应用系统都用到数据插入的功能。因此,我们可以考虑到将函数用于多个系统。

如果我们还是采用DLL方式,我们还可以在参数上作些文章,由于调用这些函数时,有关用户名、密码和字段名串都写在程序中,因此,可以将这些参数放置在程序之外。

一种写在文件之中,例如congfig文件,自定义的参数文本文件,自定的参数xml文件,另一种将参数放置在数据库的参数表中。

方法5分析:

方法5将函数的复用提高到多系统之中,这就意味着这个函数讲用于多个系统,程序员开发的效率将会有很大的提高,程序的复用性大提升;并且参数化的运用,提升了程序的灵活性和扩展性。方法5体现了程序员较高的水平。

方法6

方法5虽然,提升了函数的复用范围和提高了参数化程度,但是,软件的构架还是处于一个静态思考阶段。函数和系统还处于紧耦合方式,函数还仅用于自己开发的系统。我们可试着将这些函数功能变成Webservice方式加以使用。即编写功能的webservice放在网上,让程序进行非耦合式调用。这样其他程序员也可以轻松的调用了。(当然许多函数是很难变成webservices,例如参数需要格式化等要求)

方法6分析:大大提高的函数功能的使用范围。使得函数变自己使用为大家使用。程序员此时已经达到很高的水平。

方法7

尽管方法6已经使得程序员达到了一个很高的水平,但是这种水平还是停留在技术层面和实用层面。程序员要想在此基础上有所提高,就要对这个功能进行理论上的分析,分析这个功能与其他功能的关系,分析这个功能在整个系统或多个系统中的地位,并且将这个功能上升到标准功能高度,建立这个功能和其他功能的接口,使得这个功能于其他功能有机的融为一体。

方法7,体现了程序员的理论分析的水平,他不是单单从单一功能上考虑问题,而是从标准化和其他功能的相互关系上考虑问题了。通过这个思路再去改造这个函数,这样将大大扩展了其功能的使用范围。

以上从一个数据插入的实例来说明了编程水平的步步提高。我们看到程序员的水平与函数的逻辑划分有关、与编程技巧有关、与程序的参数化有关、与程序的复用范围和形式有关、与程序员的理论意识有关、与程序的标准化有关、与多功能统一考虑有关。我们虽然写到了方法7这个层次,但这个层次决不是最高层次,学无止境,艺无止境,在此之上还有更大的天空。这就需要程序员不懈地努力、不懈地进取。唯有这样我们的程序员的视野才会更开阔,我们程序员的水平才会有更加提高。

从一个实例看编程水平的步步提高相关推荐

  1. 查询优化器内核剖析第四篇:从一个实例看执行计划

    查询优化器内核剖析第四篇:从一个实例看执行计划 系列文章索引: 查询优化器内核剖析第一篇 查询优化器内核剖析第二篇:产生候选执行计划&执行计划成本估算 查询优化器内核剖析第三篇:查询的执行与计 ...

  2. 【FlexSim2019】自学笔记:一个实例看何为A连接?何为S连接?其意义的深入探讨

    A.S连接是仿真软件FlexSim 2019中常用的两种连接.那么,二者有什么区别?笔者在这篇文章里以实例,进行了讨论.了解二者意义,才能以不变应万变,具备独立处理问题的能力. 了解连接之前,先看看什 ...

  3. VS Code竟然能约会,找对象不看脸,看编程水平

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI VS Code现在居然可以用来谈恋爱了. 为了用最硬核的方式找到男(女)朋友,23岁的程序员Ben Awad在VS Code里打造一个约会 ...

  4. 这款网红编辑器竟然能约会谈恋爱,找对象不看脸,主要看编程水平!

    个点击上方"Github中文社区",关注 看遍Github好玩的项目 量子位 报道 大家好,我是huber! VS Code现在居然可以用来谈恋爱了. 为了用最硬核的方式找到男(女 ...

  5. 从一个实例看jaxb的强大

    http://zyl.iteye.com/blog/33729 读取xml对于应用软件来说是一个必不可少的工作,当然现在的jdk也提供了很好的处理xml方式,读写xml的库也挺多,包括有名的dom4j ...

  6. 【C/C++】一个实例看 回调函数 / 函数指针 应用与原理

    前言:笔者在学习数据结构经典问题"四种方法求解最大子列和"时,遇到了一个需求:计时是重复动作,因此想创建一个可以为算法运行时间计时的函数.由于计时的特殊性(被计时的函数要被掐头又掐 ...

  7. 从一个实例看javascript几种常用格式的转换

    要对如图一所示的左侧table的数据按照"总量"进行排序 1,在前端实现 2,数据格式为object,如图二 原创文章,转载请注明:http://www.cnblogs.com/p ...

  8. 模拟退火算法系列之(二):一个实例

    为什么我的眼里常含泪水?因为我有一个算法不会.为了节约点眼泪,今天我们就来介绍著名的模拟退火算法(Simulated Annealing),它是一种基于蒙特卡洛思想设计的近似求解最优化问题的方法. 这 ...

  9. 一个函数的自白:从函数的角度看编程的方式

    以下内容转载自 https://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=2651002566&idx=1&sn=76b652 ...

最新文章

  1. Java学习总结:56(Stack子类)
  2. Metasploit运行环境内存不要低于2GB
  3. 优化春运服务 北京铁路局在车站设置哺乳室等设施
  4. 计算机系在职研究生 网络班,在职研究生都有网络班吗?
  5. python特征选择工具_一个Python特征选择工具,助力实现高效机器学习
  6. 数组的合并和升序排列_leetcode No.31 下一个排列
  7. 头条自己提问的问题在哪看_在头条的这三十天
  8. jBPM开发入门指南(4)
  9. poj 3279 poj 1753
  10. deleter mysql,如何通过env文件传递docker中的环境变量?
  11. 数据增强操作(旋转、翻转、裁剪、色彩变化、高斯噪声等)
  12. SQL:2016标准概念之数据类型
  13. mvp架构 java_MVP架构基本使用
  14. 计算机组成原理 罗克露 pdf,罗克露计算机组成原理课件(二).pdf
  15. python的模块和包
  16. 漫步数理统计三十一——依分布收敛
  17. python安全工具开发应用_2019年顶级应用安全工具
  18. 密钥mysql_MySQL加密和密钥管理
  19. codeforces 1553B Reverse String
  20. 初中不读学计算机难吗,为什么初中生更加适合学习计算机编程?

热门文章

  1. 最初版本的simplecall是如何把2个callleg连起来的
  2. 诗与远方:无题(四十一)
  3. Python TabError inconsistent use of tabs and spaces in indentation 错误问题描述以及解决
  4. hash表、java中的hashMap/hashSet
  5. Log4j2基本使用入门
  6. Springboot实现邮件发送(2020最新版)
  7. http://java.sun.com/jsp/jstl/core cannot be resolved(含有jstl1.2jar包网盘)
  8. android 拖动缩放窗口大小,Android小应用----图片的拖动、缩放
  9. python 把numpy.ndarray转为图像_Python 让蔡徐坤在我的命令行里打篮球?打得还不错...
  10. 新的log4j2.xml