[毕业生的商业软件开发之路]尽早暴露错误原则

简介:

近期开始接触到在校学生、高校实习生和毕业生,在此说一下笔者对这些徘徊在职场门口的学生一些建议,希望能给这些初学者进入软件开发行业带来一些帮助,使得毕业生能更顺利的进入软件开发公司开始职场生涯,人生来一个完美的转弯。

-----------------------------------------------------------------------

     开发者应当遵守“尽早暴露错误”的开发原则,这是因为程序错误是客观存在的事实,应当正视它并有效的处理它,而不是简单粗暴的和谐掉。而且在开发中应当尽早暴露出程序的错误,这有助于发现错误的本质,帮助改善程序质量;若一味的和谐掩盖错误,则错误越拖影响越大,最后不可收拾,程序崩溃。[袁永福版权所有]

下面举个这条原则的例子,现数据库中有一个名为Customers的数据表,其内容如下:

CustomerID

CompanyName

ContactName

ContactTitle

Address

City

1

少室山公司

方证

采购员

东园西甲 30 号

长平

2

擎天航空

雷震子

销售代表

常保阁东 80 号

莫斯科

3

华夏工程

李大禹

市场经理

广发北路 10 号

幽州

4

武当投资

宋青书

物主

临翠大街 80 号

巴伐利亚

5

擎天南京公司

大星星

物主

花园东街 90 号

许安

对此笔者可以写出以下的两种代码来读取并输出其中的数据:

第一种:

 

 
  1. using (IDbConnection conn = new OleDbConnection())  
  2. {  
  3.     // 连接数据库  
  4.     conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" 
  5.         + System.IO.Path.Combine(Application.StartupPath, "Customers.mdb");  
  6.     conn.Open();  
  7.     using (IDbCommand cmd = conn.CreateCommand())  
  8.     {  
  9.         // 设置SQL语句  
  10.         cmd.CommandText = @"  
  11.             Select   
  12.                 CustomerID ,  
  13.                 CompanyName ,  
  14.                 ContactName ,  
  15.                 ContactTitle ,  
  16.                 Address ,  
  17.                 City  
  18.             From Customers";  
  19.         // 读取并输出数据  
  20.         IDataReader reader = cmd.ExecuteReader();  
  21.         if (reader.Read())  
  22.         {  
  23.             Console.WriteLine("CustomerID  =" + reader["CustomerID"]);  
  24.             Console.WriteLine("CompanyName =" + reader["CompanyName"]);  
  25.             Console.WriteLine("ContactName =" + reader["ContactName"]);  
  26.             Console.WriteLine("ContactTitle=" + reader["ContactTitle"]);  
  27.             Console.WriteLine("Address     =" + reader["Address"]);  
  28.             Console.WriteLine("City        =" + reader["City"]);  
  29.         }//if  
  30.         reader.Close();  
  31.     }//using  
  32. }//using 

 第二种:

 

 
  1. using (IDbConnection conn = new OleDbConnection())  
  2. {  
  3.     // 连接数据库  
  4.     conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" 
  5.         + System.IO.Path.Combine(Application.StartupPath, "Customers.mdb");  
  6.     conn.Open();  
  7.     using (IDbCommand cmd = conn.CreateCommand())  
  8.     {  
  9.         // 设置SQL语句  
  10.         cmd.CommandText = @"Select *  From Customers";  
  11.         // 读取并输出数据  
  12.         IDataReader reader = cmd.ExecuteReader();  
  13.         if (reader.Read())  
  14.         {  
  15.             Console.WriteLine("CustomerID  =" + reader["CustomerID"]);  
  16.             Console.WriteLine("CompanyName =" + reader["CompanyName"]);  
  17.             Console.WriteLine("ContactName =" + reader["ContactName"]);  
  18.             Console.WriteLine("ContactTitle=" + reader["ContactTitle"]);  
  19.             Console.WriteLine("Address     =" + reader["Address"]);  
  20.             Console.WriteLine("City        =" + reader["City"]);  
  21.         }//if  
  22.         reader.Close();  
  23.     }//using  
  24. }//using 

 这两种代码的唯一的区别就在于其中使用了不同的SQL语句,第一种代码使用的SQL语句是

Select

    CustomerID ,

    CompanyName ,

    ContactName ,

    ContactTitle ,

    Address ,

    City

From Customers

而第二种代码使用的SQL语句是

Select * From Customers

第一种SQL语句字符比较多,开发者比较懒的话很容易写出第二种SQL语句。不过笔者推荐使用第一种SQL语句,因为第一种SQL语句符合尽早暴露程序错误的原则。[袁永福版权所有]

如果当数据库没有问题,则两种SQL语句都能执行,程序都能正确的读取数据,此时第二种写法反而貌似不错。

不过实际中应用程序开发和运行环境很复杂,比如发生了代码中字段名拼写错误、数据库字段结构发生改变,这些都是需要考虑到的问题。

例如数据表[袁永福版权所有]Customers中的字段Address由于某种原因删掉了,于是这两种代码都会发生错误。

对于第一种代码,程序会在执行代码“IDataReader reader = cmd.ExecuteReader();”时就会爆出异常“至少一个参数没有指定值 OleDbException”。此时开发者借助VS.NET可以很快的确定出发生错误的代码,并根据错误提示很容易猜测SQL语句写错了。于是开发者进行SQL语句与数据库结构的对比,很快就能发现错误的本质,那就是字段Address突然没了。

而对于第二种代码,程序顺利的执行了代码“IDataReader reader = cmd.ExecuteReader();”,但在执行代码“Console.WriteLine("Address     =" + reader["Address"]);”时爆出异常“Address IndexOutOfRangeException”。对于这个错误,开发者首先会有些迷惑,不知为什么发生错误,因为错误提示信息和数据库联系不大,而后怀疑代码中的“reader["Address"]”出现字段名拼写错误,花上一段时间仔细校对确定无误后才会往前继续寻找错误的来源,会发现SQL语句没有拼写错误,最后才会想到去查数据库结构,绕了半天才发现数据库字段Address没了,这才是错误的本质。

在这个例子中,数据库字段Address删掉的那一刻起,系统就存在隐患,而第一种代码能在第一时间由于这个隐患而爆出错误,而开发者就能立即定位到离隐患最近的代码,得到跟隐患密切相关的错误提示信息,也就能非常快的发现问题的本质,从而解决问题。这是一种将错误扼杀在摇篮当中的做法,对开发者对程序都有好处。[袁永福版权所有]

而第二种代码很和谐,没能在第一时间让隐患爆出错误,让隐患养着更肥,一直默默的影响着程序的运行,最终隐患爆出更大的更让人摸不着头脑的错误,使得开发者需要花费更多的时间精力来处理这个错误,这是姑息隐患,将错误养大了出栏再杀的做法,对开发者对程序都有害处。

在VB中有一个写作“On Error Resume Next”的语句,号称能和谐掉程序中所有的错误,让程序不爆出任何异常,丫就彻彻底底的破坛子破摔、掩耳盗铃的做法,因此这种写法应用得比较少。

因此开发者要写出一个真正和谐的程序,其过程必然不能简单粗暴的和谐,要尽可能早的让各种隐患爆出程序错误;隐患要上访变成错误,程序不能打击压制,而且程序要疏通各种隐患上访的通道,让开发者更快的发现错误的本质,更快的解决错误。尊重科学规律,正视隐患和错误,正确处理错误而不是打压隐患,程序才能和谐健壮。

嘿嘿,人类社会又何尝不是这样啊。[袁永福版权所有]



     本文转自xdesigner 51CTO博客,原文链接:http://blog.51cto.com/xdesigner/652695,如需转载请自行联系原作者




相关文章
|
2月前
|
开发者
代码之外:软件开发者的职业素养提升之道
软件开发不仅是编写代码,更涉及职业素养的全面提升。本文探讨了软件开发者如何在沟通技巧、团队合作、持续学习、时间管理和职业规划等方面提升自我。良好的沟通能促进团队协作,持续学习助你紧跟技术潮流,高效时间管理则有助于实现工作与生活的平衡。通过这些方面的努力,开发者能够打造更加成功的职业生涯。
|
3月前
|
运维 监控 安全
运维之道:从混乱到秩序的旅程
【8月更文挑战第15天】在数字化时代的浪潮中,企业运维管理的重要性日益凸显。本文将探讨如何通过有效的策略和实践,将运维工作从一片混沌转变为有序可控的状态。我们将深入分析现代运维面临的挑战,并提出一系列解决方案,旨在帮助运维团队提高工作效率,确保系统的稳定性和安全性。
31 0
|
12月前
|
Web App开发 监控 安全
基本介绍实施工程师,以及实施工程师在软件开发的作用
基本介绍实施工程师,以及实施工程师在软件开发的作用
1192 0
|
12月前
|
存储 安全 数据可视化
PMP备考之路 - 敏捷实践第六讲(关于项目敏捷性的组织考虑因素)
PMP备考之路 - 敏捷实践第六讲(关于项目敏捷性的组织考虑因素)
125 0
|
设计模式 架构师 Java
五大(七大)原则-系统学习三
小编自涉足程序园界几千天之多;对于设计原则的学习一直在努力从未见到顶。最近又将设计原则从宏观和微观的角度进行了对比学习;仅以此将自己的学习过程和收获做如下总结,
|
运维 程序员 Android开发
程序人生 - 30多岁程序员选什么样的公司可以稳妥地把技术路线走下去?
程序人生 - 30多岁程序员选什么样的公司可以稳妥地把技术路线走下去?
160 0
程序人生 - 30多岁程序员选什么样的公司可以稳妥地把技术路线走下去?
|
项目管理
漫谈项目管理之:面对严重的技术问题,你应该怎么做?
  接到紧急电话,你匆忙的赶到用户现场。初步分析后,你大吃一惊:可以确定,这是一个方案设计阶段的重大失误,现在暴露出来,导致项目中的所有工作全面停顿。   此时此刻,作为项目经理,你马上要做那些事情?   你想到了什么? 组织技术人员进行讨论,对技术问题进行分析?非常好,这是必须要做的工作。
1536 0