探讨三层架构的优缺点分析
我们的系列还在继续,因为我们的项目还没有完成。在上篇文章《目标模型和现实模型》中我们的小组解决的是需求问题,我们的系统要满足的是目标模型,对目标模型的描述就是我们的需求定义。接下来我们需要考虑的是系统的实现。在讨论之前,我们先回顾一下我们这个Team的几个角色:
项目经理:王涛
系统架构师:李帅
高级开发工程师:赵构
开发工程师:若干(我们在后面的章节中将逐步介绍)
系统设计或者架构是技术组来负责的,其组成如下:
组长:系统架构师 李帅
高级开发工程师 赵构
开发工程师,张昊。
李帅是一个资深的开发工程师,在很多项目中做过技术负责人。根据过往的经验,他提出系统应以三层架构为基础进行设计。那么三层架构又是什么呢?
三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。
1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等。
这套架构在过往的项目中采用很多,相对也比较成熟,但问题也很多。代码维护量很大,随着时间的推移,也越来越不经济。所以,李帅就此与王涛进行了深入讨论。
李帅认为采用三层结构有如下:
1、开发人员可以只关注整个结构中的其中某一层;
2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用。
6、扩展性强。不同层负责不同的层面,如PetShop可经过简单的配置实现Sqlserver和oracle之间的转换,当然写好了也可以实现B/S与C/S之间的转换
7、安全性高。用户端只能通过逻辑层来访问数据层,减少了入口点,把很多危险的系统功能都屏蔽了。
8、项目结构更清楚,分工更明确,有利于后期的维护和升级
但王涛需要站在更高的层面来看待这个问题:
三层架构较之于不分层的架构明显是进步了很多,对编程进行了分工,使得程序更加明晰。但这种三层架构仍然是一种面向过程(或者功能)的思维方式(虽然采用了面向对象的编程语言),业务逻辑大多写在静态方法中,这些静态方法挂在一个个伪对象下,很多相同的功能在不同的对象下重复,程序员为了完成某个功能,又难得在各个业务类下找这些方法,就会大量的写一些他自己看得懂的业务方法。如此程序代码程几何级数增长,代码的可维护性变得越来越差。这是程序员常说的“直上直下”。其根本原因是其不是真正的面向对象的思维方式,而只是传统的面向过程方法在现代技术条件下的一个变胎。
本文转自陈革 51CTO博客,原文链接:http://blog.51cto.com/chenge/1061810,如需转载请自行联系原作者
推荐阅读
-
35 岁实现财务*,腾讯程序员手握2300万提前退休?-1000万房产、1000万腾讯股票、加上300万的现金,一共2300万的财产。有网友算了一笔账,假设1000万的房产用于自住,剩下1300万资产按照平均税后20-50万不等进行计算,大约花上26-60年左右的时间才能赚到这笔钱。也就是说,普通人可能奋斗一辈子,才能赚到这笔钱。在很多人还在为中年危机而惶惶不可终日的时候,有的人的35岁,就已经安全着陆,试问哪个打工人不羡慕?但问题是有这样财富积累必然有像样的实力做靠山。没有人可以不劳而获。 看到这里,肯定有人说,那么对于普通人来说,卷可能真就成了唯一的出路。但是卷也有轻松的卷,“偷懒”的卷法,对于程序员而言,刨除掉一时无法改掉的开会传统占用的大部分时间,如何把有限的时间和精力放在真正重要的架构设计、需求设计上,而不是重复的造*,编码、改bug、手动测试。因此在科技改变生活的今天,学会使用AI工具成为程序员们的必备技能。 以全栈式全自动的软件开发工具飞算SoFlu软件机器人为例,作为全球首款面向微服务架构设计和最佳实践的软件机器人,SoFlu软件机器人改变了原来手工编码的作业模式,通过可视化拖拽方式以及参数配置就能实现等同于编写复杂代码的业务逻辑,在设计业务逻辑时就完成了微服务应用开发,做到“业务即图,图即代码”,实现“软件开发,十倍提效”。 而作为飞算SoFlu软件机器人的一个重要组成部分,FuncGPT(慧函数)支持所有类型函数创建。通过自然语言描述Java函数需求,实时生成高质量、高可读性的Java函数代码。生成代码可直接复制到IDEA,或一键导入Java全自动开发工具函数库。 FuncGPT(慧函数)具有五大核心能力: ● 自然语言:通过自然语言即可生成函数,降低软件开发门槛。 ● 秒级函数开发:全自动秒级开发函数,秒级完成,效率千倍提升。 ● 一站式函数开发应用:函数生成即可直接应用,效率、安全有保障。 ● 质量可靠:生成的函数代码符合业界规范、具备良好的可读性,符合最优解。 ● 灵活生成:可以根据开发人员的具体需求生成并支持调整和修改。 以“将文件流转换为File对象”这个需求为例,以下是FuncGPT(慧函数)秒级生成的代码: / 类名:FileConverter // 函数名:convertStreamToFile // 函数功能:将文件流转换为File对象 // POM依赖包:无 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class FileConverter { /** * 将文件流转换为File对象 * @param inputStream 文件流 * @param filePath 文件路径 * @param fileName 文件名 * @return 转换后的File对象 * @throws IOException 如果发生I/O异常 */ public static File convertStreamToFile(InputStream inputStream, String filePath, String fileName) throws IOException { File file = new File(filePath + File.separator + fileName); // 创建File对象 try (FileOutputStream outputStream = new FileOutputStream(file)) { // 创建文件输出流 byte buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { // 从文件流读取数据并写入文件 outputStream.write(buffer, 0, bytesRead); } } return file; // 返回转换后的File对象 } } // 函数示例 // 将文件流转换为File对象示例 // 入参:inputStream,文件流 // 入参:filePath,文件路径 // 入参:fileName,文件名 // 出参:file,转换后的File对象 // 调用示例: // InputStream inputStream = new FileInputStream("example.txt"); // String filePath = "C:\\Users\\User\\Documents"; // String fileName = "example.txt"; // File file = FileConverter.convertStreamToFile(inputStream, filePath, fileName); // System.out.println(file.getAbsolutePath); // 输出结果:例如,将文件流转换为File对象后,文件的绝对路径为:C:\Users\User\Documents\example.txt // 则输出结果为:C:\Users\User\Documents\example.txt 通过分析,不难发现以上代码:
-
苹果电脑的优势,详细分析苹果笔记本电脑的优缺点
-
多播、组播和广播的优缺点分析
-
企业中三种常见数据部门架构的优缺点
-
目前可用的开源 CMDB 及其优缺点分析
-
分布式存储技术(上):HDFS 和 Ceph 架构原理、特点和优缺点分析
-
跨安全域数据钟摆分析中网络网关的优缺点
-
探索计算机网络的奥秘:深入分析网络架构
-
超详细的微服务架构分析,写得太好了!
-
重新定义 OLAP!揭示新的多维分析架构