解决一层半的缺点的一个思路。三层的另类解决方案。

自然框架 2010-05-01 02:12:12
  只用class的,那叫做“基于对象”,比如当初的vb6.0;只是分了三个项目,把以前写在一起的代码分成了三份,所谓的业务逻辑层就是一个传声筒,这一类自称三层的,在我看来都是“模仿三层”,甚至是“伪三层”。



  面向对象,就是要先考虑“对象”,考虑对象的时候完全不用去考虑数据库结构是什么样子的,这个对吧?ORM讲究的是现有O后有R,然后再去映射。




  写到这里,突然想到一个观点:其实O和R是同时有的,他们都是根据项目需求来分别设计的,互不影响!都设计好了之后再去考虑如何映射。


  您可能会说,都分别设计,那么设计之后还能对应上吗?关于这个问题,本来对象和关系型数据库的思路就是完全相反的。


  面向对象,考虑的是对象,抽象,个体。要把众多的对象抽象出来,要把众多的属性、方法整合起来,要把各个类找到适合的关系。

  关系型数据库,考虑的是划分,做到数据尽量没有冗余,那么多的范式要达到的效果是什么?就是要尽量的分表,分成多个表,每个表只表达一种意思,然后在“关系”(关联)在一起,以达到避免数据冗余的目的。

  面向对象是根本就不去考虑数据冗余的问题的,他考虑的是“一”。一个对象的结构,和其他对象的关系(继承、接口、委托、组合、聚合等)。他不会考虑一万个实例会如何,至少不会把这个当成重点来考虑。

  关系型数据库考虑的是“多”,多条数据,一万、十万、百万条记录,要如何处理。多条数据如何处理的问题。




  好像有点跑题了,赶紧回来。



  上一篇,写的那种“分开”方式,为了三层而三层的做法,我觉得就是伪三层,所以请注意,我说的是伪三层不好,为了三层而三层是不对的。我觉得我上一篇写代码的方式根本就不是真正的三层,所以请大家不要误会,我并没有说真正的三层不好,我也不是反对面向对象。



  这一篇我就是想说一下,我使用面向对象的方式。也许我的思路和您的理解不大一致,不过没关系嘛,拿出来大家一起讨论嘛。



  网站,从业务方面(就是客户的需求)可能的分类形式,比如csdn。csdn有很多的栏目,不如:首页| 空间| 新闻| 论坛| 博客| 下载| 读书| 网摘| 书店| 程序员| 项目交易| 培训| 网址,那么是不是每个栏目都要定义一个实体类,或者若干实体类呢? 如果这么简单处理的话,那么就会造成类爆炸。而且也没有抽象。我不知道csdn是怎么做的,这里只是猜测,从技术角度上的猜测。我只是那大家熟悉的来举个例子,请不要联想,谢谢。


  我作网站的话,会从另一个角度来思考 —— 从页面的角度来分类





  可能您看着有点晕,这都什么呀,乱七八糟的,先不要着急,带我慢慢道来。



  请注意,这里说的是网页,不包括后台管理。后台管理是另一个单独的项目,和页面是完全分离开来的。他们的连系只是读取同一个数据库。



  第一个图里面分了那么多的栏目,但是首页的随笔列表、左右两侧的各种列表,新闻里的新闻列表,小组里的小组列表、小组话题列表等等。这些都是列表,形式、数据格式(就是类的属性)也都大同小异,那么我们是不是可以抽象一下呢?针对这些各式各样的列表抽象出来一个实体类?


  先看小列表


  首页里的栏目导航,左侧的连接、专题、博客排行榜,右侧的24小时阅读排行等,这一类的就是我说的“小列表”。



  栏目导航需要哪些属性?栏目名称、连接地址。
  连接需要哪些属性?连接名称、链接地址。
  博客排行榜需要哪些属性?博客名称、连接地址。
  24小时阅读排行需要哪些属性?随笔名称、连接地址。



  好了其他的就不多说了,以免有凑字数的嫌疑。



  现在我们来抽象一下。



  这么多的属性,其实就两个属性——名称、连接地址。

   /// <summary>
/// 简单的列表
/// </summary>
public struct ListInfo1
{
/// <summary>
/// 记录的主键ID。
/// 对应字段名(别名):ID
/// </summary>
public string ID;

/// <summary>
/// 链接地址,用于静态页或者URL重写,也可以是动态页面
/// 对应字段名(别名):URL
/// </summary>
public string URL;

/// <summary>
/// 标题、名称等
/// 对应字段名(别名):Title
/// </summary>
public string Title;
}


 

  这么做的话,一个类可以用在许多的地方,出现新的需求不必再去定义新的类,避免了类爆炸。然后下一步就是考虑如何映射了。映射的思路也是很简单的,一个类在不同的地方,和不同的表(字段)进行映射。



  不知道有没有这样的规定,不允许一个类的属性和不同的表的字段作对应。



  您可能会问了,一个属性一会和随笔名称对应,一会和栏目名称对应,这不乱吗?这还怎么维护,怎么扩展,又乱来了!这个就要看映射规则如何来定义了。



  首先要有文档,这个是必须的,文档里规定,在某个地方,类的属性和哪个表的字段对应。这是第一步。



  第二步就是这个映射如何实现了。其实相当简单,相当的不容易乱。



  我估计好些人都是面向对象习惯了,ORM给惯坏了,把SQL语句都给忘记了。

Select col0 as ID, col1 as Title ,col2 as URL from table1 



  不知道大家看到这个SQL语句,有没有想到我要如何映射。对就是用字段别名来映射。这么映射,您还觉得会映射乱吗?会不好维护吗?



  因为实体类的结构固定了,那么给实体类赋值的代码(函数)也就固定了,只有SQL语句是变化的。当然了,在页面里如何显示也是变化的。



  这样的话,代码量就会几何级减少,而且不需要用代码生成器,用的话也就是生成个SQL语句了。



  字段名有变化,只需要修改SQL语句即可,实体类本来就是固定的,不用改。给实体类赋值的代码也是固定的,还是不用改。大大的降低了数据库结构的变动给代码带来的影响。

...全文
160 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
自然框架 2010-05-08
  • 打赏
  • 举报
回复
这个怎么沉了?
缪军 2010-05-02
  • 打赏
  • 举报
回复
你写出的代码基本跟你的言论自相矛盾,
代码才是你的思维模式的真实流露,代码会把你的思想境界展示出来。

随便谈谈对你代码片断的想法:
1、也许你有相得益彰的代码生产手段与之配套,否则我看不出来OO的思想;

2、那个Url,地址映射是现成的,你如果映射到aspx文件,那是默认的,什么都不用做,当然如果不使用url拦截或者微软的MVC,你还可以通过aspx当做跳板,再做一次接力,映射到你的view,你要做的就是让那个view和url的命名规则有某种映射关系;

3、不要在页面里放数据相关的内容,也许不少人觉得很难做到,其实,肯定能实现,不难,你首先坚信这一点,思考下去,你会发现你超过绝大部分的问题都是可以用MVC模式解决的;对于你做过的100页面,你拿掉数据,留下布局,看看是不是剩下样子不超过20呢?如果1000个页面呢?恐怕也不超过20个吧
看看我们天天在用的windows,从win95到现在,UI是那么的一致,只要你愿意,windows可以始终呈现出最经典的样子;

4、还有,就是你的文章看起来很累:段落不规整、图片太大、空行过多,不够面向读者这个对象


wuyq11 2010-05-02
  • 打赏
  • 举报
回复
慢慢看
通用性可使用泛型
自然框架 2010-05-02
  • 打赏
  • 举报
回复
看来还得写具体的例子呀,还有详细的用法。

否则还真是说不明白。
wanghui0380 2010-05-02
  • 打赏
  • 举报
回复
[Quote]
不知道大家看到这个SQL语句,有没有想到我要如何映射。对就是用字段别名来映射。这么映射,您还觉得会映射乱吗?会不好维护吗?
[/Quote]

呵呵,从来就没人说过实体类的属性,就一定要和字段名一样。所以这里根本就不必强调啥映射不映射,这里我们大家都是很自然的明白这个问题,倒是海洋兄“Super Natural”了

至于后面那个Url映射,恩,是种手段。但是我们通常不这么玩,我们不是跟着数据走,而是跟着对象走!!
IOC+配置文件 就成。


实际上不管是你在博客园和“吉日”打擂台的那个“自然框架”还有这篇我觉得比较空泛的文章,我可以看到你实际想做的是“元数据”,但是你没明白“元数据编程”的核心不是所谓的 “数据库结构”,“元数据”编程的核心是 “解析、编译与生成”,按你这篇文章的思路实际和hibernate基本思想一致,而hibernate的HQL恰恰就是一个元数据编程的例子,而你还没找到元数据编程的路子。我觉得你不妨去看看lex,Yacc,不妨试着用一下ANTLR


ps:元数据编程并不像你号称那么自然,他背后要要做的事情实际上也并不比对象简单,而且元数据编程也不像你号称的通用,要知道他是用来做DSL特定领域编程,记住了是特定领域而非通用领域
wanghui0380 2010-05-02
  • 打赏
  • 举报
回复
看完了,果真十分“自然”

“自然”到啥也没说,啥也没做,啥也没设计----好像10年前asp那样的“自然”

“自然”的像时光从我手中溜过啥也没留下
自然框架 2010-05-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 microtry 的回复:]
你写出的代码基本跟你的言论自相矛盾,
代码才是你的思维模式的真实流露,代码会把你的思想境界展示出来。

随便谈谈对你代码片断的想法:
1、也许你有相得益彰的代码生产手段与之配套,否则我看不出来OO的思想;

2、那个Url,地址映射是现成的,你如果映射到aspx文件,那是默认的,什么都不用做,当然如果不使用url拦截或者微软的MVC,你还可以通过aspx当做跳板,再做一次接力,映射到你……
[/Quote]

上一帖子是以前的思路和写法,有缺点,这个我是承认的。但是解决缺点的方式和流行的不一样。

而这个帖子就是我的解决方法的思路,代码还没写呢。

就是说,这一帖子要说的是全新的思路和代码,和上一帖子是不一样的。


在我看来,网站里的页面

布局上来说,就是三种:首页、分类、最新、分页、详细。

就数据来说,就是两种:列表、详细。

写入数据的还没仔细分析。简单的说就是一个表单,具体的还没想好。

详细:指的是一条记录的详细信息和显示方式。比如一条新闻,一条产品介绍。

在我看来是不超过10个的。

  • 打赏
  • 举报
回复
“从页面的角度来分类”

可惜,从“页面”这个概念之下,就变成两个“读数据、写数据”动作了。这就跟我们看到的很多人的做法一样,说是要设计,结果发呆几天之后,没有对象设计,直接动手编程了。
songfei5201314 2010-05-02
  • 打赏
  • 举报
回复
有项目管理经验的.NET开发的朋友,可以加上限500人的QQ群28720769,一起交流。
微工程 2010-05-01
  • 打赏
  • 举报
回复
学习下……
frankbooth 2010-05-01
  • 打赏
  • 举报
回复
学习下……
vip__888 2010-05-01
  • 打赏
  • 举报
回复
没看。 只为JF而来
wcj5689226 2010-05-01
  • 打赏
  • 举报
回复
ASP.NET技术交流群
sunnj87 2010-05-01
  • 打赏
  • 举报
回复
从头看到尾,感觉有点乱
没看大明白
皇城龙三 2010-05-01
  • 打赏
  • 举报
回复
恩,看看思路
nosuchtracter 2010-05-01
  • 打赏
  • 举报
回复
太长了
中间段落还那么宽,复制过来的?
dzpzds 2010-05-01
  • 打赏
  • 举报
回复
g关注中
xiaowang1026 2010-05-01
  • 打赏
  • 举报
回复
继续观察
bancxc 2010-05-01
  • 打赏
  • 举报
回复
人齐结贴.

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧