首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET --如何在不过度工程的情况下有效使用设计模式!

ASP.NET --如何在不过度工程的情况下有效使用设计模式!
EN

Stack Overflow用户
提问于 2009-02-02 19:23:12
回答 10查看 1.5K关注 0票数 17

自从ASP.NET问世以来,我就一直在为一个进退两难的问题而苦苦挣扎,我将非常感谢人们的想法。

在经典的ASP中,代码层非常少。ASP页面包含HTML和脚本的组合。COM组件包含业务逻辑和DAO基础结构。ASP页面本身是杂乱无章的,但一切都在一个地方。

ASP.NET的代码隐藏整理了代码,这很好。这些控件允许我们在表示层上更加面向对象。这些东西都很不错。

这就是我的问题。我接触过的许多项目都是企业web应用程序,但并不都是那么复杂,比如10个左右的网页/用户界面、大量的数据库交互等等。现在,我经常会遇到5到10层代码来创建一个相当简单的网页。这些可能包括ASP,代码隐藏,控制类,DTO类,对象模型对象,以及其他一些被扔进地狱的东西。

除了访问数据库所需的5-10层之外,还有许多专门为存储普通数据而创建的自定义对象,而不是像集合那样使用POCO (普通的旧式对象)。要理解这些对象,通常需要追溯继承层次结构,包括3个或更多级别的对象和接口。

这就是问题的症结所在:以前,我看过1个ASP页面,说1到2个小对象,几个SQL查询,这些就完成了工作,并且维护和理解起来相当简单。

现在,对于同一页面,可能有50个或更多的对象,分布在自定义名称空间中的数百个对象中。

我问你们,代码工匠们,这是进步吗?是不是有些人对他们滑稽有趣的新设计模式的玩具有点过分了?有没有一个令人满意的折衷办法?有没有一种方法可以有效地使用设计模式,而不会创建太多的对象,使其成为比旧的过程范式更糟糕的意大利面代码?

请分享你的想法。

EN

回答 10

Stack Overflow用户

发布于 2009-02-02 19:40:44

有些人是architecture astronauts,他们会坚持认为这些层都是必要的,除非你包含它们,否则设计绝对是垃圾。

在光谱的另一端,人们把这些都放在一边,只是把代码都塞在一起:这很简单,对吧,那么为什么不直接在代码隐藏中将SQL查询填充到一个列表框控件中呢?

你已经发现了宇航员版本的问题,只是做简单的任务太复杂了。

第二种方法的问题是,虽然它在小型应用程序上运行良好,但这些相同的应用程序有成长为大型应用程序的趋势,然后全部崩溃。您会花费大量时间一遍又一遍地修复相同的bug,因为相同的查询或代码已经根据需要进行了复制/粘贴,并进行了略微修改,然后到处传播。

当然,中间立场是存在的。根据你问的是谁,这个问题的确切位置会有所不同..但它就在那里。

构建一个合理的业务层是实现这一目标的良好步骤。这一层应该表示系统中对象的最简单视图,并且不包含任何面向公众的数据库相关内容(可能除了告诉业务层如何访问数据库的Connection对象之外)。这会将您的所有逻辑合并到一个位置,因此项目的ASP部分将只是将抽象的"User.LoadAll()“方法连接到显示用户列表的表。ASP应用程序应该不知道它是从数据库、web服务还是只是一堆虚构的东西中读取数据。它只是与业务层对话。

在业务层下,您可以直接进行查询,您可以使用ORM,您可以构建更深层次的数据访问层来执行这些操作。好消息是,这个决策完全包含在业务层中(如果需要,您可以在以后更改它,而不会影响业务层的公共API )。

现在,所有处理用户的查询都包含在User对象中。如果您在加载权限的方式上有错误,可以在一个地方修复。

我刚刚做了一个如上所述的迁移(ASP和SQL在代码隐藏中,迁移到一个不同的表示-业务-数据源(ORM)层),它非常棒。虽然它确实为获取实际信息添加了几个层,但一旦业务方法起作用,其余的代码就会起作用。修复bug很简单,而且可以在任何地方修复它。在接近尾声时,当您需要获取用户可以运行的报告列表时,有人已经为此编写了一个业务方法(User.GetReports()),而在此之前,如果您已经这样做了,您可能永远也找不到它-如果您幸运的话,它被编写为一个函数,而不仅仅是内联代码。

票数 12
EN

Stack Overflow用户

发布于 2009-02-02 19:34:13

我曾经在相反方向上做过一些糟糕的项目(没有设计模式的200+ MB源码树)。相信我,这也不是正确的解决方案。代码变得不可维护,到处都是旧代码,开发人员会被它们绊倒,等等。

另一方面,为了回答您关于设计模式的问题:

不,这不是进步。是的,有些人走得太远了。可能有一个令人满意的中间结果,但我认为,这需要世界上的设计模式专家们稍微冷静下来。

我试着让我的解决方案尽可能简单。这可能涉及到一个设计模式...也可能不是;这真的无关紧要,只要它能工作,并且易于维护。最重要的是...设计模式不是坏代码的灵丹妙药。仅仅因为一个人使用了设计模式并不意味着他的代码写得很好。不幸的是,太多的开发人员被教导(或相信自己):如果他们使用设计模式,他们的代码质量会更高;这不一定是真的(我认为,甚至在常规基础上也不是这样)。

顺便说一句:如果您想要一个过度设计的优秀示例,请查看CruiseControl.NET托盘应用程序的源代码。这是设计模式失控的一个很好的演示(老实说,Thoughtworks作为一个整体就是一个很好的演示)。

票数 4
EN

Stack Overflow用户

发布于 2009-02-02 19:32:35

我认为您看到的大多数可能是正式的业务层和数据层代码。在这种情况下,代码应该遵循定义良好的模式,这样什么地方和(更重要的)原因是显而易见的。如果不是这样,那么您看到的不是典型的ASP.NET代码。

与您关于易于遵循Classic ASP的论点相反,我发现任何大小的经典ASP站点很快就会变成一个由未记录的包含文件组成的迷宫,这样就很难确定函数的实现位置或声明的变量。

最重要的是,ASP.NET在帮助开发人员安全地重用代码方面比Classic ASP做得更好,所以当他们利用这一点时,不要感到惊讶。

现在,这并没有真正解决您对分层设计过度的担忧。我真的认为这要视情况而定。如果您的网站是访问数据库的唯一系统,并且它不是那么大,那么它可能是过度杀伤力。但是,即使在这种情况下,大部分数据和业务层代码也可以由ORM解决方案编写,这是一件好事,因为这样的代码通常没有bug,可以推到修订系统的某个黑暗角落并被遗忘。然后,当站点(而不是“如果”)成长为可以实际利用构建良好的数据层的东西时,该代码已经到位以支持它,并且只需很少的生产或维护成本。

另一方面,如果您的web站点与企业报告软件共享对数据库的访问,或者与Windows桌面应用程序共享对数据库的访问,或者与几个小型应用程序与同一数据库对话,那么所有这些“额外”代码可能都有一定的用途。编写数据和业务层代码的一个重要原因是,这些代码可以在与数据库通信的每个不同系统之间共享,以便这些代码只在一个位置实现。也许对于一个小网站来说,这是一个很大的代码,但在这种情况下,它不是为该网站编写的。它是为站点和其他几个应用程序运行的环境编写的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/504517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档