牛人都喜欢一些复杂的业务逻辑,如大型的医疗系统,银行金融系统,企业OA等系统所涉及的业务。(越复杂的业务越能体现技术???)暂且不考虑这些了,任何一个业务都免不了需要对用户输入的数据进行验证吧?请大家回想一下,你所涉及的系统,有哪个业务不需要与数据打交道?
软件系统是以数据为核心的,那么操作数据的是什么?就是业务逻辑。那么一个相当重要的操作——数据验证,它属不属于业务逻辑?
我们暂且也不考虑其是不是业务逻辑,我们将从软件开发的架构上来思考一下应该把数据验证放在哪个合适的位置,是放在控制层,还是放在业务逻辑层?
假设有这样一个需求,民政部门的结婚登记——只有符合要求的男人和女人才能结婚吧?这是不可质疑的,所以我们抽象出这样几个要点:
1、只有异性才能结婚,同性不能结婚;
2、男性必须达到22周岁,女性必须达到20周岁;
3、已婚男性不能再结婚,已婚女性不能再结婚(符合一夫一妻制);离异当然是未婚处理。
在这里,我们先假定这是一个WEB应用程序,使用了Struts2,需要定义Action类。同样先假定把数据验证放到 Service业务逻辑层,所以有如下代码:
package com.wgs.service;
import com.wgs.pojo.Person;
public class PersonService {
/**
* 结婚登记业务
* @param p1
* @param p2
* @return 符合结婚条件则返回true,否则返回false
*/
public boolean marry(Person p1, Person p2) {
if (canMarry(p1) && canMarry(p2) && p1.getGender() != p2.getGender()) {
p1.setMarried(true);
p1.setPartner(p2);
p2.setPartner(p1);
p2.setMarried(true);
return true;
}
return false;
}
/**
* 判断是否符合结婚条件
* @param p
* @return 符合结婚条件返回true,否则返回false
*/
public boolean canMarry(Person p) {
if (!p.isMarried()) {
return marriedInfo(p);
} else {
return married(p);
}
}
/**
* 相应的结婚判断信息
* @param p
* @return
*/
public boolean marriedInfo(Person p) {
String name = p.getName();
boolean flag = false;
if (p.getGender() == 'M') {
if (p.getAge() >= 22) {
System.out.println(name + "男士,您好,您的年龄达到结婚要求");
flag = true;
} else {
System.out.println(name + "男士,您好,您的年龄未达到结婚要求");
}
} else if (p.getGender() == 'F') {
if (p.getAge() >= 20) {
System.out.println(name + "女士,您好,您的年龄达到结婚要求");
flag = true;
} else {
System.out.println(name + "女士,您好,您的年龄未达到结婚要求");
}
}
return flag;
}
/**
* 已经结婚信息
* @param p
* @return
*/
public boolean married(Person p) {
String name = p.getName();
if (p.getGender() == 'M') {
System.out.println(name + "男士,您好,您已经结婚啦!");
} else if (p.getGender() == 'F') {
System.out.println(name + "男士,您好,您已经结婚啦!");
}
return false;
}
}
这样,我们在控制层(Struts的Action中)就可以直接调用此业务逻辑了。为什么要这样做呢?
假定有这样一个需求,现在我们需要把这个WEB应用程序能够让Android手机客户端访问,那么我们是不是要在Android平台上设计一套具有良好用户体验的客户端界面?如果我们的数据验证代码放在Action中,那么,我们得花多少心思从Action中抽取数据验证代码放到Android平台上!而将数据验证单独作为业务逻辑后,只要Android平台上做好界面,设置相应的控制器直接调用数据验证业务逻辑就可以了。这是很方便的一件事,程序员都喜欢这样干吧?
总结来说,这样的架构具有灵活性,可维护性,可扩展性。
所以,我们应该考虑把数据验证放到业务逻辑层。想想Spring的AOP,也是同样的道理。这里就不深究啦,去吃午饭吧。
- 大小: 171.8 KB
分享到:
相关推荐
业务逻辑层是系统的核心,实现具体业务规则,如计算折扣、验证用户权限等;数据访问层则处理与数据库的交互,提供抽象的接口,隐藏数据库操作细节。 在实际开发过程中,开发人员可能还需要考虑安全性问题,比如使用...
在运动会管理系统中,Servlet主要负责接收JSP传递的请求,处理业务逻辑,如数据验证、数据库操作等,然后返回响应给JSP,更新用户界面。 接下来,我们谈谈SQLServer2000,这是微软公司的一款关系型数据库管理系统。...
5. 请求进入Context的Pipeline,这里的Valves进行具体Web应用的业务逻辑处理。 6. 最后,响应会反向通过Pipeline,每个Valve对响应进行后处理,如添加响应头或记录日志。 理解Tomcat的Engine、Host、Context和...
数据验证功能允许设置单元格输入规则,防止错误数据的录入。而表格(Table)功能可以将普通数据转换为动态表格,自动扩展公式,方便数据管理和分析。另外,Power Query和Power Pivot是Excel的进阶功能,它们用于导入...
文件"simulate"可能是仿真工程文件,包含配置信息和编译后的程序,用于在仿真环境中运行和验证电子秒表的逻辑。 在电子秒表的设计中,定时器是核心部分。单片机内部的定时器/计数器可以周期性地产生中断,用于计时...
在"Empire CMS"中,开发者可以利用ASP进行后台逻辑处理,比如用户登录验证、内容发布、评论管理等。系统提供的API和函数库使得这些操作变得更加简便。此外,Empire CMS还支持自定义模块开发,这为满足不同网站需求...
此外,Struts2还支持拦截器,可以添加自定义的拦截逻辑,如权限验证、日志记录等,大大增强了系统的可扩展性。 其次,Hibernate作为ORM(对象关系映射)框架,使得Java对象可以直接与数据库中的表进行交互。在图书...
标题中的“PROTEUS——电子线路设计、制版与仿真、keil及其它”揭示了本次讨论的主题,涉及两个核心工具:Proteus和Keil,以及它们在电子工程领域中的应用。Proteus是一款强大的电子设计自动化(EDA)软件,而Keil则...
DHT22的数据包包含一个校验和,用于验证接收到的数据的正确性。 在集成这两个传感器时,你需要考虑以下几点: 1. **电源管理**:确保两个传感器都得到正确的电源电压和电流,通常SDS011和DHT22都需要3.3V或5V电源...
8. 验收测试:在产品发布前进行的最后一轮测试,验证产品是否满足业务需求和用户期望。 9. 维护测试:产品上线后,持续进行测试,监控性能,及时发现并处理新出现的问题。 接下来,我们讨论测试方法: 1. 黑盒...
在这个系统中,Servlet扮演着控制器的角色,接收客户端的请求,进行业务逻辑处理,并将结果传递给JSP页面进行展示。JSP(Java Server Pages)是一种动态网页技术,它允许开发者在HTML中嵌入Java代码,从而实现了视图...
在"宝宝套"项目中,登录操作的实现可能涉及到Controller接收请求,Service层处理业务逻辑(如验证用户名和密码),最后由DAO层与数据库交互。整个过程可以通过Spring的依赖注入(DI)和面向切面编程(AOP)进行解耦...
1. **Servlet的生命周期**:Servlet有三个主要阶段——初始化、服务和销毁。初始化时,Servlet被加载并实例化;服务阶段,Servlet处理客户端请求;当Web应用关闭或Servlet不再需要时,销毁阶段执行。 2. **Servlet...
基于JAVA的Web开发框架Struts是这个系统的核心,它是MVC(Model-View-Controller)设计模式的典型实现,能有效地分离业务逻辑、数据模型和用户界面,使得代码更易于维护和扩展。JSP(JavaServer Pages)则用于构建...
触发器可以用于实现复杂的业务规则,比如在数据插入或更新时进行额外的验证,或者在删除数据时自动更新相关的关联记录。创建触发器通常涉及`CREATE TRIGGER`语句,定义触发事件、操作时机以及触发时要执行的代码。 ...
首先,让我们来看看图书借阅管理系统的核心——登录验证。登录验证是系统的第一道防线,确保只有合法用户可以访问系统资源。在MFC中,通常会创建一个对话框类,包含用户名和密码输入字段,以及登录按钮。当用户点击...
《数字集成电路设计——PLD与Verilog深度解析》 在当今的数字系统设计领域,Verilog HDL(硬件描述语言)和可编程逻辑器件(PLD)扮演着至关重要的角色。本篇将深入探讨这两者的概念及其在数字集成电路设计中的应用...
在系统设计层面,我们可以采用MVC(Model-View-Controller)或MVVM(Model-View-ViewModel)设计模式,分离业务逻辑、用户界面和数据模型,提高代码的可维护性和可扩展性。C#的强类型特性使得这种分层设计更为容易...
接下来,我们谈谈Struts2的配置文件——struts.xml。这是整个系统的核心配置,定义了Action类、结果页面、拦截器等。例如,为了实现员工删除功能,struts.xml文件中可能有如下配置: ```xml ...
2. **成绩录入**:教师可以输入或批量导入学生的课程成绩,系统应能验证数据的合法性并自动计算平均分等统计信息。 3. **成绩查询**:支持按学生姓名、课程名等条件查询成绩,展示成绩列表。 4. **成绩修改与删除**...