求助求助——请教各位高手,抽出一点宝贵的时间根据这个实例讲解一下应该如何分层呢?

简介: 有很多的问题没有明确,比如三层架构的定义到底是什么呢?(有些人说我的是分层,有的说不是。我个人感觉还是分层了)各个层的定义又是如何呢?每个层里都需要实现什么功能,放哪些代码呢?这些好像都并不是很明确。
 有很多的问题没有明确,比如三层架构的定义到底是什么呢?(有些人说我的是分层,有的说不是。我个人感觉还是分层了)
各个层的定义又是如何呢?
每个层里都需要实现什么功能,放哪些代码呢?

这些好像都并不是很明确。

常常可以看到两个人(或多个人)讨论的很激烈,但是到最后才发现其实讨论的的东东并不完全一致。虽然都是用了数据访问层(或是逻辑层)的名词,但是各自的理解却是不一样的。

大家在理论上的讨论比较多,但是具体到一个实例上的却比较少,有的话也是个说各的,不够统一,影响理解。

这里本人斗胆,定了一个命题,邀请各路高手针对这个实例来讨论一下,如何划分层次,哪些代码应该放在哪些层里面等问题。
谢谢大家的帮忙。

题目很简单 —— 实现一个添加数据的功能。

说明:简单,才可以更明晰、快速一些,让更多的人更容易地看懂。

简单的都没有分清楚的话,复杂的就更晕了呀。:)

 环境介绍
IDE:vs2003
语言方面:asp.net 1.0、ADO.NET 1.0、
数据库:Server SQL 2000

实现的功能:项目里的一个简单但是很常用的功能 —— 填加数据。再具体一点,新闻系统里的添加新闻的功能。(注意:只是添加新闻,不包括显示数据等功能)。具体一点可以更有的放矢。

数据库说明:
新闻表(LayerDemo_News)
字段暂时定义为:
ID:NewsID (数据库自动生成)
标题Title、 (用户添加)
分类(一级分类)ClassID、(用户添加)
编辑Editer、(用户添加)
内容Content、(用户添加)
发布时间AddedDate、数据库自动生成)
人气Hits。(数据库自动生成。默认值:0)

这里要添加四个字段。


下面按照完全“一层”的方式来编写代码。不能使用自定义的类。
(代码会比较长,所以这里并不会写全,只写出说明和主要的代码。其实也没有必要写全嘛。呵呵)

为了说明的方便,给代码加上一个标识J 主要讨论 A部分之外的部分。

img_a6339ee3e57d1d52bc7d02b338e15a60.gif // ===============A部分 aspx页面里的代码==============
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
这个就不写代码了,绘制一些文本框,下拉列表之类得控件了。还有格式之类的事情
img_a6339ee3e57d1d52bc7d02b338e15a60.gif另外还要写一些js脚本来验证数据。(偷懒的话也可以不写)
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
// ====结束====


// aspx.cs页面里的代码。这里面要再细分一下。
//另外说明一下,下面的代码都会写在“保存按钮”的点击事件里面。

img_a6339ee3e57d1d52bc7d02b338e15a60.gif // ==================B部分 获取新闻信息==============
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
定义变量,获取用户添加的新闻信息,同时去掉两端的空格,并且过滤“’”
img_a6339ee3e57d1d52bc7d02b338e15a60.gif例如:
string  NewsTitle  =   this .Txt_Title.Text.Trim().Replace(“‘”,””);
img_a6339ee3e57d1d52bc7d02b338e15a60.gif其他省略
img_a6339ee3e57d1d52bc7d02b338e15a60.gif代码行数:大于等于字段数(
>=   4 )。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
// ====结束====


img_a6339ee3e57d1d52bc7d02b338e15a60.gif // ==================C部分 验证数据==============
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
这里要做一些安全验证和逻辑验证,比如新闻标题不能为空、是否重复之类。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif安全验证一个要处理“‘”,另一个就是,如果字段类型是数字的就要验证是否是数字了。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif(本着不能相信页面传过来的数据的原则,一些信息还要重复验证一遍,呵呵)
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif如果数据不合格,要给用户显示提示信息,并且终止事件的继续执行。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif如果数据合格继续执行。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif具体代码略。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif代码行数:大于4行,小于 不详。根据实际情况来决定,这里就不好确定了。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
// ====结束====


img_a6339ee3e57d1d52bc7d02b338e15a60.gif // ==================D 部分 填写数据==============
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
数据验证完毕,可以写到数据库里面了。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif这里就有个分支了。基本上可以分为三种情况:组合Insert into 语句、使用带参数的Insert into 语句、存储过程。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif不管用哪种方法,都要先定义一个Connection 对象和一个command 对象。其他得根据情况来定了。
img_a6339ee3e57d1d52bc7d02b338e15a60.gifSqlConnection cn 
=   new  SqlConnection(…); 
img_a6339ee3e57d1d52bc7d02b338e15a60.gifSqlCommand cm 
=   new  SqlCommand 
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif(使用的是一层的方式,所以需要写出Connection之类的代码)
img_a6339ee3e57d1d52bc7d02b338e15a60.gif组合Insert into 语句 :行数会比较少,但是很不易读,一些人也会说不太安全。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif带参数的Insert into 语句:行数会比较多;需要一个长一点的SQL语句,需要一个存储过程的参数的数组,并且赋值;比较安全。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif存储过程:行数和带参数的方式基本一样;需要在数据库里编写一个存储过程,需要一个存储过程的参数的数组,并且赋值;很安全。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif具体代码略。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif代码行数是少不了,基本上会比添加字段数的两倍还要多一些。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
// ====结束====


img_a6339ee3e57d1d52bc7d02b338e15a60.gif // ==================E部分 异常判断==============
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
往数据库里添加数据要做一下异常的判断,用  try  的方式,要套在 D部分的代码的外面。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif如果发生异常了要给出说明(针对程序员的说明,和针对用户的说明两种),
img_a6339ee3e57d1d52bc7d02b338e15a60.gif对程序员的要尽量详细地说明出错的地方和出错信息,以便于程序员能够尽快修改错误;
img_a6339ee3e57d1d52bc7d02b338e15a60.gif对客户的就要友好一些了。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif具体代码略。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif没有异常的话要给出添加信息成功的提示。
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
// ====结束====



基本上填加数据的工作就完成了,当然这里只是一个部分,实际中还会再加一些代码。先以这些为准吧。

(如果您感觉我写的代码不对,也欢迎您拍板砖。)

那么请各位高手帮帮忙,对于这个实例,您会如何分层呢?或者说怎么拆分这一大段代码呢?


http://community.csdn.net/Expert/TopicView3.asp?id=4957543

这是 csdn 里的帖子,也希望各位高手能到csdn里面回个帖子,帮助大家一下,毕竟还有很多人对于三层还不是很了解(包括我在内),希望高手可以结合这个实例,用最简洁的语言讲解一下,再次谢谢!
相关文章
|
存储 开发工具 git
【软考学习16】用位示图法,轻松解决空闲存储空间的管理难题
【软考学习16】用位示图法,轻松解决空闲存储空间的管理难题
305 0
|
5月前
|
Oracle 数据库 UED
后台查询接口影响响应时间最大的因素:用空间换时间的优缺点及解决方案
1.当数据库的一个表记录很多显然查询数据很慢。 2.当数据库的一个表记录不大,但是数据很大也可能很慢。 我们的一个用户表中一个building很大,当查询100条数据就会把服务器的内存搞爆掉。 当然查询时要查询筛选有用字段,不可以直接把记录的所有字段都查拆来。这样能减少内存消耗和提高查询速度。 3.在经常查询字段上建立索引。据说oracle上用索查询和不用索引查询在超多记录的情况下相差1000倍。 4.若出现嵌套查询显然会大大增加相应查询时间。要先预处理用管道操作把能合并的查询合并到一个查询中,然后生成map,然后再处理。这是标准的用空间换时间的方案。
77 8
|
2月前
|
测试技术 持续交付
持续部署的内涵和实施路径问题之发布时间超过8小时会带来的问题如何解决
持续部署的内涵和实施路径问题之发布时间超过8小时会带来的问题如何解决
|
2月前
|
Docker 容器
典型热点应用问题之追求60秒构建时间目标的问题如何解决
典型热点应用问题之追求60秒构建时间目标的问题如何解决
|
2月前
|
存储 网络安全 文件存储
就软件研发问题之在创建数据流动时配置的问题如何解决
就软件研发问题之在创建数据流动时配置的问题如何解决
|
3月前
业务系统架构实践问题之如果一个域看起来太小问题如何解决
业务系统架构实践问题之如果一个域看起来太小问题如何解决
|
12月前
|
Cloud Native 算法 Go
面试中的时间管理:如何在有限时间内展示最大价值
面试中的时间管理:如何在有限时间内展示最大价值
102 0
|
10月前
|
设计模式 存储 缓存
怎么在有限的时间和资源里,设计出一个既经济高效又能保持扩展性的架构呢?
怎么在有限的时间和资源里,设计出一个既经济高效又能保持扩展性的架构呢?
42 1
|
存储 达摩院
如何合理安排员工工作时间以提高效率和减少成本?—达摩院MindOpt
人员排班在各行各业都具有重要的实际应用价值,可以帮助企业和机构提高管理效率、降低成本,同时提升员工的工作满意度和整体效能。
如何合理安排员工工作时间以提高效率和减少成本?—达摩院MindOpt
|
架构师 中间件
架构日记 - 资源成本控制
架构日记 - 资源成本控制
70 0
下一篇
无影云桌面