【自然框架】注册会员活动——第一份代码的修改建议(第一版)

  感谢“好坏”提供代码,这是我看过的比较不错的三层结构的代码了,业务层并不是直接调用DAL,而是有其自身的逻辑判断,并不是传声筒,很赞。

我对这份代码,按照自己的理解进行了下面几个修改:

  1. 规范命名
  2. 实体类的属性的定义写法
  3. 修改添加数据的方式

规范命名

  我以前写代码也不注意命名规范,跟着感觉走,也养成了不好的习惯。靠自觉是不行了,只好用点强制的手段了,呵呵。使用 ReSharper 进行规范,尽量按照他的要求来改。   为什么说是尽量,而不是全部呢?比如他要求 Page_Load 要改成 PageLoad,即去掉中间的下划线。这个是vs2008(包括以前的版本,vs2010没注意)默认的方式,这个就很冲突了,要不要改呢?目前还是按照vs的习惯来,没有修改。

  用  ReSharper 来强制一下,命名上也好统一,也好查找不规范的地方,比较省事了。

实体类的属性的定义的写法

  比较绕口,呵呵。

  原来的写法是中规中矩的,先定义一个内部成员,然后定义一个属性,属性里只有简单的get、set,没有任何的限制。这种情况就可以改成“动态属性”,ReSharper也是建议这样。所以就把它改成动态属性的写法了。当然这个没有对错之分。

/// <summary>
/// 社区信息ID
/// </summary>
public int OSUserID { get; set; }

  另一个就是加注释的方法,这样加注释,在调用的时候,可以显示出来提示信息,这样便于调用。当然还需要做一个设置才行(如下图)。设置后再次编译,bin目录里会出现.xml的文件,提示信息就放在这里面。

添加修改数据的方式

  原版用的是SQLHelp。感谢“好坏”的苦心,因为他们实际中用的是微软的企业库,但是他感觉直接用ado.net 效果更好,所以他自己弄了一个SQLHelp,使用这种方式来写代码,这样大家看着就更明确。   使用SQLHelp简单易懂,这是优点,但是也存在很多的缺点。

1、 如果要更换数据库,那么就要改代码。 2、 不易读。 3、 用着不方便。 4、 增加出现bug的机会。

  我们先看看看SQLHelp的调用方式:

string sql = "insert into OS_User_Info values(@UserID,@PersonID,@NikeName,@ProvinceID,@CityID,@CountyID,@Introductions,@RegisterDate)";
            SqlParameter paramUserID = new SqlParameter("@UserID", SqlDbType.Int);
            paramUserID.Value = osuser.UserID;
            SqlParameter paramPersonID = new SqlParameter("@PersonID", SqlDbType.Int);
            paramPersonID.Value = osuser.PersonID;
            SqlParameter paramNikeName = new SqlParameter("@NikeName", SqlDbType.NVarChar);
            paramNikeName.Value = osuser.NikeName;
            SqlParameter paramProvinceID = new SqlParameter("@ProvinceID", SqlDbType.Int);
            paramProvinceID.Value = osuser.ProvinceID;
            SqlParameter paramCityID = new SqlParameter("@CityID", SqlDbType.Int);
            paramCityID.Value = osuser.CityID;
            SqlParameter paramCountyID = new SqlParameter("@CountyID", SqlDbType.Int);
            paramCountyID.Value = osuser.CountyID;
            SqlParameter paramIntroductions = new SqlParameter("@Introductions", SqlDbType.NText);
            paramIntroductions.Value = osuser.Introductions;
            SqlParameter paramRegisterDate = new SqlParameter("@RegisterDate", SqlDbType.DateTime);
            paramRegisterDate.Value = osuser.RegisterDate;
            int row = Sql_Helper.ExecuteSql(sql, paramUserID, paramPersonID, paramNikeName,
                                            paramProvinceID, paramCityID, paramCountyID,
                                            paramIntroductions, paramRegisterDate);
            if (row == 0)
                return false;
            
            int id = SelectNewID("OS_User_Info");
            osuser.OSUserID = id;
            return true;

  然后在对比一下使用自然框架的数据访问的调用方式。

ManagerParameter parm = da.ManagerParameter;
            parm.ClearParameter();
            parm.AddNewInParameter("UserID", osuser.UserID);
            parm.AddNewInParameter("PersonID", osuser.PersonID);
            parm.AddNewInParameter("NikeName",osuser.NikeName,40 );
            parm.AddNewInParameter("ProvinceID",osuser.ProvinceID );
            parm.AddNewInParameter("CityID", osuser.CityID);
            parm.AddNewInParameter("CountyID", osuser.CountyID);
            parm.AddNewInParameter("Introductions",osuser.Introductions );  //ntext类型,不设置长度。
            parm.AddNewInParameter("RegisterDate", osuser.RegisterDate);
            
            //添加数据
            string newID = da.ModifyData.InsertData("OS_User_Info");
            if (da.ExecuteRowCount == 0)
                return false;
            osuser.OSUserID = int.Parse(newID);
            return true;

  看一下修改后的代码,如果数据库更换了,这段代码是不需要修改的。因为他不含有特点数据库的“影子”。

  1、存储过程的参数名前面并没有加 “@”,因为不是所有的数据库都用“@”。

  2、没有使用SqlDbType来设定参数类型,因为他带有SqlClient的影子。   3、没有写参数化的SQL,这样减少出现bug的机会,字段名如果有变化,也减少了修改点。

  4、因为根本就没有写SQL,所以也就不会出错,不用修改。

  那么SQL呢?在ModifyData.InsertData内部,通过存储过程参数和传递过去的表名,拼接出来的。你可能会说,拼接字符串会有性能损失。这个我承认,但是带来的优点是易读、易修改、减少出现bug的机会,也就是提高了编写代码的效率。

  我认为这是值得的,当然你也可以认为这是不值得的,因为可以用代码生成器。呵呵,每个人都有自己的看法、自己的理解。这里是我的理解,你可以反对。引用一句名言“我不同意你的观点,但是我誓死捍卫你说话的权力”呵呵。

  第一版就修改这些,既然是第一版,那么就是说还会有第二版,第三版……。代码需要大家的点评,需要不断改进,这样我们就一步一步成长起来,也是这次活动的目的。

  欢迎大家提出自己的修改建议,也欢迎大家参加这个活动!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spark生态圈

[spark] spark推测式执行

推测任务是指对于一个Stage里面拖后腿的Task,会在其他节点的Executor上再次启动这个task,如果其中一个Task实例运行成功则将这个最先完成的Ta...

1872
来自专栏架构师之旅

【强烈推荐】Java工程师如何从一名普通的码农成长为一位大神

本文源自 http://www.hollischuang.com/archives/489 写在前面 java作为一门编程语言,在各类编程语言中...

2538
来自专栏编程思想之异常处理

C++异常处理

0.如果使用普通的处理方式:ASSERT,return等已经    足够简洁明了,请不要使用异常处理机制.

1041
来自专栏Spark学习技巧

Flink DataStream编程指南及使用注意事项。

Flink中的DataStream程序是对数据流进行转换的常规程序(例如,过滤,更新状态,定义窗口,聚合)。数据流的最初的源可以从各种来源(例如,消息队列,套接...

1.6K7
来自专栏java工会

CodeReview常见代码问题

空值恐怕是最容易出现的地方之一。 常见错误有: a. 值为NULL导致空指针异常; b. 参数字符串含有前导或后缀空格没有Trim导致查询为空。 导致以上结果的...

1370
来自专栏北京马哥教育

爬虫实践---一次下完所有小说:排行榜小说批量下载

? 一、目标 排行榜的地址: http://www.qu.la/paihangbang/ 找到各类排行旁的的每一部小说的名字,和在该网站的链接。 二、...

3085
来自专栏牛肉圆粉不加葱

Spark 内存管理的前世今生(下)

在《Spark 内存管理的前世今生(上)》中,我们介绍了 UnifiedMemoryManager 是如何管理内存的。然而,UnifiedMemoryManag...

1022
来自专栏数值分析与有限元编程

Python IDLE关联.py文件

为进一步提升Python IDLE可操作性,本文介绍如何在windows操作系统下默认使用python自带的IDLE编辑器关联后缀名为.py的文件。

4761
来自专栏安恒网络空间安全讲武堂

浙江省首届网络安全大赛决赛Write Up

直接打开pwd.docx,发现是空的,那么将其作为zip 解压,在其中找到了一张二维码

1152
来自专栏JadePeng的技术博客

Flutter与Dart 入门

Flutter是google推出的,一个使用Dart语言开发的跨平台移动UI框架,通过自建绘制引擎,能高性能、高保真地进行Android和IOS开发。

1082

扫码关注云+社区