这篇文章是前段时间我在百度空间里发表的,原文地址:http://hi.baidu.com/quakeii/item/0003aebe0c55b89318469745
在这里我添了一些新东西,主要是最后一条内容。
首先声明一下,我只不过是一个小菜鸟,但一个小菜鸟对国内计算机的劣质图书都到了厌恶的程度,可想而知,国内这方面做得是多么差劲!
现在中国的计算机普及率的确不错,但是国内大多数计算机图书技术含量低下,让人不堪入目!当然也有优秀的作品,不过只是占少数,这里要提的是“博客园开发者征途”系列,都是MVP写的,MVP这个称号可不是白拿的!当然还有金旭亮的《.NET 2.0面向对象编程揭秘》和朱印宏的《CSS商业网站布之道》等...这些作品才是“真正的书”(其他没拜读过的好书,我不枉加评论)。
下面我通过C#和.NET的相关知识,来发表一下个人的看法:
国内计算机图书的通病:
1、内容肤浅
几乎一个模式,讲一些最基本的原理,就开始搞什么应用,罗列一大堆代码!搞来搞去都是一些最基础的东西,没有真正研究技术的内容!没有ASP.NET生命周期,没有编程模型,不知道怎么解决疑难问题,只知道一个IsPostBack属性,悲哀!
依赖异常处理,不知道使用新特性,数值类型的转换只会用Parse方法,不知道TryParse方法,结果就是写这样的代码:
try
{
int leftValue = int.Parse(txbLeftValue.Text);
int rightValue = int.Parse(txbRightValue.Text);
txbResultValue.Text = (leftValue + rightValue).ToString();
}
catch(FormatException e)
{
throw e;
}
catch(Exception e)
{
throw e;
}
要知道错误处理会浪费很多不必要的资源,更让人感到不解的是,有些都不进行错误处理,就这么写:
int leftValue = int.Parse(txbLeftValue.Text);
int rightValue = int.Parse(txbRightValue.Text);
txbResultValue.Text = (leftValue + rightValue).ToString();
难道就不能这样写吗,那些作者有没有学C# 2.0:
int leftValue, rightValue;
if(int.TryParse(txbLeftValue.Text, out leftValue) && int.TryParse(txbRightValue.Text, out rightValue))
{
txbResultValue.Text = (leftValue + rightValue).ToString();
}
else
{
txbResultValue.Text = default(int).ToString();
}
对比一下就知道孰优孰劣了,更何况在C# 1.0中double数据类型就已经有TryParse方法了,C# 2.0中只是进行了扩展!
2、没有中心和重点,囫囵吞枣
真的,国内的大多数计算机图书都是胡子眉毛一把抓,不管什么东西拿过来就用,也不进行比较,能“动”起来就行!那奥运会还搞个百米赛跑干吗...感觉国内的计算机图书不但抄袭国外的,甚至是直接把网络上的一些老掉牙的技术文章也搬了过来。俗话说的好:“天下文章一般抄”,可也要有些中心、重点之类的,难道出本书,就是告诉读者有这么个技术,告诉读者这么做那么做,这跟鹦鹉学舌有什么区别!你抄也要抄出点自己的东西,给别人一个指引。我们读者要的这些都没有,不但没有,连抄袭别人的东西都没抄到人家的精华部分,是不是那样太明显了,怕搞出个版权纠纷,谁知道!
3、技术陈旧,缺乏新意
在看《ASP.NET 2.0电子商务开发实战》之前,我看了国内人邮出版的“精通ASP.NET”系列。可我看了那么多,结果对三层架构以及多层架构的概念依然很模糊!而且我记得有本书,三层架构方面的东西写了很多,我却始终无法参透它的意思,难道我很笨!看了《ASP.NET 2.0电子商务开发实战》,简短的几句话,就使我豁然开朗,三层架构最基本要求遵循的是表示层不要直接与数据层进行交互,更简单的说就是不要在ASP.NET页面的CS代码中写ADO.NET代码与数据库进行交互!表示层不直接与数据层进行交互,而是通过业务层来进行数据的存取,这会带来很多好处,这里就不说了,各位可以上网看相关的文章或者买本好书进行研究,就比如《ASP.NET 2.0电子商务开发实战》!
除了ADO.NET还是ADO.NET,我几乎看到的都是ADO.NET代码,全是围绕数据库,真是无聊透顶!难到ASP.NET技术里面只有ADO.NET...这也是我对这些书感到失望甚至是厌恶的最根本原因。还用什么“精通”来做噱头,真是瞎扯淡!很多分页的代码都是直接用ADO.NET来实现,难道就不能写在数据库里面,就比如写个存储过程;当然也有用存储过程来进行数据存取的,不过我没看到用存储过程来进行分页的,不管三七二十一,把数据通通拿过来,到“运行时”进行数据过滤,然后数据绑定!小项目还行,大项目这样做要耗费多少资源,况且ADO.NET本质上是通过游标来实现的,本身就慢,相对数据库中的存储过程更慢,还把数据死命地塞进去!
项目可移植性差!整天SqlConnection、SqlDataReader、SqlCommand,要是哪天客户说要改用oracle数据库,难道把那些SqlConnection、SqlDataReader、SqlCommand统统改成OracleConnection、OracleDataReader、OracleCommand,就不能这样做吗:
代码段1:
//读取web.config配置文件
private readonly static string dbConnectionString;
private readonly static string dbProviderName;
static static DbConfiguration()
{
......
dbConnectionString = ConfigurationManager.ConnectionStrings["DbConnection"].ConnectionString;
dbProviderName = ConfigurationManager.ConnectionStrings["DbConnection"].ProviderName;
......
}
public static string DbConnectionString
{
get
{
return dbConnectionString;
}
}
public static string DbProviderName
{
get
{
return dbProviderName;
}
}
代码段2:
//用DbProviderFactories工厂类在运行时确定数据源
public static DbCommand CreateCommand()
{
string dataProviderName = DbConfiguration.DbProviderName;
string connectionString = DbConfiguration.DbConnectionString;
DbProviderFactory factory = DbProviderFactories.GetFactory(dataProviderName);
DbConnection conn = factory.CreateConnection();
conn.ConnectionString = connectionString;
DbCommand comm = conn.CreateCommand();
comm.CommandType = CommandType.StoredProcedure;
return comm;
}
代码段3:
//通过存储过程执行查询
public static DataTable ExecuteSelectCommand(DbCommand command)
{
DataTable table;
try
{
command.Connection.Open();
DbDataReader reader = command.ExecuteReader();
table = new DataTable();
table.Load(reader);
reader.Close();
}
catch (Exception ex)
{
throw ex;
}
finally
{
command.Connection.Close();
}
return table;
}
代码段4:
<!-- web.config配置文件 -->
<connectionStrings>
<add name="DbConnection" connectionString="Server=.\SQLEXPRESS;Integrated Security=True;Database=TheBeerHouse" providerName="System.Data.SqlClient" />
</connectionStrings>
这样做的话,我们只要做两项工作,就能进行项目移植:1. 修改web.config配置文件;2. 将Sql Server数据库中相关的东西在oracle数据库实现一遍,比如表、视图、存储过程、触发器之类。
4、没有最佳实践
我没看到那些所谓“精通”的书里面有用is和as运算符的。相反,我看到的都是这样的代码:
protected void btnCommit_Click(object sender, EventArgs e)
{
Button button = (Button)sender;
......
}
为什么我没看到这么写的:
Button button = sender as Button;
《Effective C#》说的很清楚,is和as优于强制类型转换,除了值类型,比如int、double或者自定义的enum、struct进行强制类型转换,还有在foreach语句中要进行强制类型转换,最佳实践要求在绝大多数情况下使用as运算符,因为值类型必须进行强制转换。
更没看到用泛型的,还是用System.Collections命名空间中的各种集合类,比如ArrayList、Hashtable。为什么不用泛型,ArrayList、Hashtable这些完全可以用System.Collections.Generic命名空间中List<T>、Dictionary<TKey,TValue>代替。泛型不需要将数值类型进行装箱,会大大提高我们程序的执行效率,而且会对类型进行检查,如果你的数据类型不一致,在编译阶段就会报错,System.Collections命名空间中的集合类就做不到这点,可能到执行时才报错,可是我没看到有用泛型的!
应该怎么做,怎么做才是最好,为什么要那样做?我想很多朋友都想达到“知其然,知其所以然”的境界,可是国内的大多计算机图书是不会教会我们这些的!要让程序又快又好,最佳实践应该是贯穿始终的,我建议那些作者看完《Effective C#》并且大彻大悟了再写书吧,要对读者负责,更要对自己负责!一味地用控件,一味地用第三方组件...要是做些有难度的功能,难道再去找个什么第三方组件或控件吗?要是互联网上没有怎么办,难道对客户说:“对不起,我们无法实现该功能!”,客户说:“没关系,我们已经联系了另外一家XX软件公司,他们可以进行这些功能模块的开发!”,汗!
5、没有心得体会
我不知道究竟是国内的那些作者水平有限,还是不愿意把自己领悟的东西教给别人或者干脆是为了几个稿费,写一两本所谓精通的劣质书草草了事!如果是水平有限,那也是没办法的事;如果是后面两个原因,那就上升到了道德的问题,这种人我们只有“贬”他!不是我崇洋媚外,国内的知识、资源共享精神有待大大提高,真的现在跟国外没法比!幸好中国是WTO的一个成员国,我们可以选择自己要的图书,不幸中的万幸!我看了《C#本质论》三遍,每次都有新的体会,我最喜欢看的就是Mark Michaelis在书中提到的最佳实践、遵循的原则和一些总结性的内容,可以说,这些就是书中的精华,是作者从事多年C#编程的切身体会,让人悟到很多东西!
6、没有通用模式
设计模式就不用说了,那些都是高级程序员、架构师研究的东西。可是国内大多数C#和ASP.NET方面的书连一些简单的通用模式都没有,就算有,都说不出个究竟来,只会被模式牵着鼻子走,不懂活学活用!
模式指导我们写出更好、更强健的代码。它可以简化我们的编程,提高自身能力。在做项目时正确、灵活地应用模式更使开发者们大大受益,因为将来升级、维护系统,甚至对系统进行移植,我们的工作量也将大大减少。
由于我之前是学网络的,大学里面编程学了个C,过了个C语言二级,后来学了Java,虽然也是学的比较基础,却是班上学的最好的!C#是后来自学的,之前也玩过C++跟delphi,设计模式我是刚刚涉及,所以在不敢大放厥词!在这里就要赞赞我们国人的《大话设计模式》,可以用大白话的形式来讲技术,可以想象作者的功力有多强了!在这里又想到了《.NET 2.0面向对象编程揭秘》和《精通正则表达式》,都是用大白话的形式!
7、狂抄滥抄,粗制滥造
这类书的典型代表就是人邮出版的“精通ASP.NET”系列,所有资料都是从别的书或者网络上抄袭过来,不管国内国外的,看到别人还没抄,自己赶快抄过来,搞个什么书出来,还带版权的,怎么好意思的!还有就是博文视点出版的一系列JS方面的烂书,也都是在拼命地抄,你抄也要有个限度,抄又抄不到精华部分,连跨浏览器都做不到!中国版权方面的法律法规是不怎么健全,要是管的严,都叫你吃官司!在这里提下《精通ASP.NET 2.0的Web 2.0应用》和《精通LINQ数据访问技术》,我感觉还过得去,至少人家是原创,是作者真正花时间、心思、精力在上面了!那些不负责的作者们,有点职业道德好不好,在网上、博客上抄文章也就算了,都抄成书了!
以上是我对目前国内大多数计算机图书的一些看法。如果大家觉得有不妥之处,请予以更正、批评,我虚心接受大家的批评教育,谢谢!努力进行中...
如果我的言语对他人造成了伤害,影响了他人,请杜杜老大删除