三层架构与养猪
为了更好地让初学者轻松入门,这里仍然采用趣味性的方式聊一些常用技术点,致力于.NET新手们的快速提高!知识都是普通的,关键是学习的思路。技术源于生活,技术原来可以这样学。抛砖引玉而已。
层次结构在现实社会里随处可见。记得有个笑话讲有个村长得意地向他老婆吹牛:“全中国只有四个人比我官大,乡长、县长、省长和国务院总理”。这个笑话也体现了真实社会中分层的现象。社会人群会分层,公司人员结构也会分层,楼房是分层的,甚至做包子的笼屉都是分层的。虽然分层的目的各有不同,但都是为解决某一问题而产生的。所以,分层架构其实是为了解决某一问题而产生的一种解决方案。
常用的三层架构设计
软件系统最常用的一般会讲到三层架构,其实就是将整个业务应用划分为表示层、业务逻辑层、数据访问层等,有的还要细一些,通过分解业务细节,将不同的功能代码分散开来,更利于系统的设计和开发,同时为可能的变更提供了更小的单元,十分有利于系统的维护和扩展。
常见的三层架构基本包括如下几个部分,如图1所示。
图1 常见的三层架构
数据访问层DAL:用于实现与数据库的交互和访问,从数据库获取数据或保存数据到数据库的部分。
业务逻辑层BLL:业务逻辑层承上启下,用于对上下交互的数据进行逻辑处理,实现业务目标。
表示层Web:主要实现和用户的交互,接收用户请求或返回用户请求的数据结果的展现,而具体的数据处理则交给业务逻辑层和数据访问层去处理。
日常开发的很多情况下为了复用一些共同的东西,会把一些各层都用的东西抽象出来。如我们将数据对象实体和方法分离,以便在多个层中传递,例如称为Model。一些共性的通用辅助类和工具方法,如数据校验、缓存处理、加解密处理等,为了让各个层之间复用,也单独分离出来,作为独立的模块使用,例如称为Common。
此时,三层架构会演变为如图2所示的情况。
图2 三层架构演变结果
业务实体Model:用于封装实体类数据结构,一般用于映射数据库的数据表或视图,用以描述业务中客观存在的对象。Model分离出来是为了更好地解耦,为了更好地发挥分层的作用,更好地进行复用和扩展,增强灵活性。
通用类库Common:通用的辅助工具类。
我们可以将对数据库的共性操作抽象封装成数据操作类(例如DbHelperSQL),以便更好地复用和使代码简洁。数据层底层使用通用数据库操作类来访问数据库,最后完整的三层架构如图3 所示。
图3 最后完整的三层架构
数据库访问类是对ADO.NET的封装,封装了一些常用的重复的数据库操作。如微软的企业库SQLHelper.cs,动软的DBUtility/DbHelperSQL等,为DAL提供访问数据库的辅助工具类。
通过以上分析,我们知道如今常用的三层架构是个什么样子,同时,我们也知道了三层架构在使用过程中的一些演化过程。那么,为什么要这样分层,每层结构到底又起什么作用呢?我们继续往下看。
趣味理解:三层架构与养猪
猪肉价格一路高涨,据说有人养猪都发财致富奔小康了,程序员都说写代码没前途了,还不如去养猪,不过,可别认为养猪没有技术含量,比写代码容易,其实养猪也大有学问。为了更好地理解三层架构,就拿养猪来做个例子吧。俗话说:“没吃过猪肉,还没见过猪跑啊!”。
图4 是三层架构化的养猪产业流水线趣味对此图。
图4 三层结构与养猪
对比图3与图4,我们可以看出:
数据库好比猪圈,所有的猪有序地按区域或编号,存放在不同的猪栏里。
DAL好比是屠宰场,把猪从猪圈取出来进行(处理)屠杀,按要求取出相应的部位(字段),或者进行归类整理(统计),形成整箱的猪肉(数据集),传送给食品加工厂(BLL)。本来这里都是同一伙人既管抓猪,又管杀猪的,后来觉得效率太低了,就让一部分人出来专管抓猪了(DBUtility),根据要求来抓取指定的猪。
BLL好比食品加工厂,将猪肉深加工成各种可以食用的食品(业务处理)。
Web好比商场,将食品包装成漂亮的可以销售的产品,展现给顾客(UI表现层)。
猪肉好比Model,无论是哪个厂(层),各个环节传递的本质都是猪肉,猪肉贯穿整个过程。
通用类库Common相当于工人使用的各种工具,为各个厂(层)提供诸如杀猪刀、绳子、剪刀、包装箱、工具车等共用的常用工具(类)。其实,每个部门本来是可以自己制作自己的工具的,但是那样会使效率比较低,而且也不专业,并且很多工作都会是重复的。因此,就专门有人开了这样的工厂来制作这些工具,提供给各个工厂,有了这样的分工,工厂就可以专心做自己的事情了。
当然,这里只是形象的比喻,目的是为了让大家更好地理解,实际的情况在细节上会有所不同。这个例子也只是说明了从猪圈到商场的单向过程,而实际三层开发中的数据交互是双向的,可取可存。不过,据说有一种机器,把猪从这头赶进去,另一头就噗噗噜噜地出火腿肠了。如果火腿肠卖不了了,从那头再放进去,这头猪又原原本本出来了,科幻的机器吧,没想到也可以和三层结构联系上。以上只是笑谈,不过也使三层架构的基本概念更容易理解了。
上面谈了那么多,有人会问,我直接从数据库取出内容直接操作不可以吗?为什么要这么麻烦地用三层架构呢?三层架构到底有什么好处呢?
不分层,当然可以,就好比整个过程不分屠宰场、加工场之类的,都在同一个场所(工厂)完成所有的活(屠杀、加工、销售)。但为什么要加工厂和商场呢?因为当规模比较大的时候,管理起来就会变得非常复杂,这样的养殖方式已经无法满足规模化的需要了。并且,从社会的发展来看,社会分工是人类进步的表现。社会分工的优势就是让适合的人做自己擅长的事情,使平均社会劳动时间大大缩短,生产效率显著提高。能够提供优质高效劳动产品的人才能在市场竞争中获得高利润和高价值。人尽其才,物尽其用最深刻的含义就是由社会分工得出的。软件开发也一样,做小项目的时候,分不分层确实看不出什么差别,并且显得更麻烦啰嗦了。但当项目变大和变复杂时,分层就显示出它的优势来了。所以分不分层要根据项目的实际情况而定,不能一概而论。
相关文档:分层开发思想与小笼包
以上是三层架构与养猪的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在 C 语言中,char 类型在字符串中用于:1. 存储单个字符;2. 使用数组表示字符串并以 null 终止符结束;3. 通过字符串操作函数进行操作;4. 从键盘读取或输出字符串。

C 语言中符号的使用方法涵盖算术、赋值、条件、逻辑、位运算符等。算术运算符用于基本数学运算,赋值运算符用于赋值和加减乘除赋值,条件运算符用于根据条件执行不同操作,逻辑运算符用于逻辑操作,位运算符用于位级操作,特殊常量用于表示空指针、文件结束标记和非数字值。

C语言中通过转义序列处理特殊字符,如:\n表示换行符。\t表示制表符。使用转义序列或字符常量表示特殊字符,如char c = '\n'。注意,反斜杠需要转义两次。不同平台和编译器可能有不同的转义序列,请查阅文档。

在 C 语言中,char 和 wchar_t 的主要区别在于字符编码:char 使用 ASCII 或扩展 ASCII,wchar_t 使用 Unicode;char 占用 1-2 个字节,wchar_t 占用 2-4 个字节;char 适用于英语文本,wchar_t 适用于多语言文本;char 广泛支持,wchar_t 依赖于编译器和操作系统是否支持 Unicode;char 的字符范围受限,wchar_t 的字符范围更大,并使用专门的函数进行算术运算。

多线程和异步的区别在于,多线程同时执行多个线程,而异步在不阻塞当前线程的情况下执行操作。多线程用于计算密集型任务,而异步用于用户交互操作。多线程的优势是提高计算性能,异步的优势是不阻塞 UI 线程。选择多线程还是异步取决于任务性质:计算密集型任务使用多线程,与外部资源交互且需要保持 UI 响应的任务使用异步。

在 C 语言中,char 类型转换可以通过:强制类型转换:使用强制类型转换符将一种类型的数据直接转换为另一种类型。自动类型转换:当一种类型的数据可以容纳另一种类型的值时,编译器自动进行转换。

C语言中没有内置求和函数,需自行编写。可通过遍历数组并累加元素实现求和:循环版本:使用for循环和数组长度计算求和。指针版本:使用指针指向数组元素,通过自增指针遍历高效求和。动态分配数组版本:动态分配数组并自行管理内存,确保释放已分配内存以防止内存泄漏。

char 数组在 C 语言中存储字符序列,声明为 char array_name[size]。访问元素通过下标运算符,元素以空终止符 '\0' 结尾,用于表示字符串终点。C 语言提供多种字符串操作函数,如 strlen()、strcpy()、strcat() 和 strcmp()。
