【设计】一个有意思的服务方法入参设计

本文详细讨论了在远程服务场景中,针对一个大型业务对象的入参设计问题,提出了从简单POJO模型到使用枚举和泛型约束的改进方案,最终采用自定义泛型映射来实现更安全、高效的数据同步流程。

今天晚上和项目组的几个同学讨论一个服务方法的入参设计,觉得挺有意思的,在此记录一下!

 

背景

我们的场景需要对外暴露一个远程服务写入接口,用于给几个外部同步数据的场景。

由于历史的原因,需要被写入的这个业务对象很大,字段很多(100多个字段,也会涉及多个表)。

以下是场景提取出来的一些要求:

1.这个场景只需要同步更新几个字段到该主表里。为了数据安全和方便理解,不希望把整个业务对象暴露出来,希望只暴露几个该场景可以写入的字段。

2.外部场景都是能拿到该业务对象的唯一外键的,所以为了交互友好,不希望流程是"远程读取数据-->修改数据-->远程更新数据",而希望是"拼装需要同步的数据-->远程同步"的流程。

 

注:用的是公司内部应用的的java远程调用服务框架,只在java语言内部调用。只考虑java 语言层面的设计,不考虑soap这些重量级的方案。

入参的设计方案

方案一

一开始想得是设计一个只包含可更新字段的pojo model类作为入参。如:

public class WritableModel {
	String property1;
	String peoperty2;
	public String getProperty1() {
		return property1;
	}
	public void setProperty1(String property1) {
		this.property1 = property1;
	}
	public String getPeoperty2() {
		return peoperty2;
	}
	public void setPeoperty2(String peoperty2) {
		this.peoperty2 = peoperty2;
	}
	
}

 这个model强类型固然好,但是有一个很难避免的问题就是二义性。

在property1为null的时候,是说明不更新这个字段还是要清空这个字段呢?(注意:在这里的写场景里这两种情况都需要支持!)

强类型虽然约束了可更新范围,这个时候pojo里的null是没办法去理解。

 

方案二

由于方案一的缺陷根本就没办法满足需求,于是想了下用map来作为入参,但是map是弱类型,我们必须定义一些key,并让调用方只用这个key。于是想到了将key用一个枚举来表示,然后入参用java map泛型来约束.

如下:

key的枚举类设计如下:

public enum WritablePropertyType {
	PROPERTY1_NAME//属性1的名字
	, PROPERTY2_NAME//属性2的名字
}

 服务方法入参设计如下:

	/**
	 * 
	 * @param map  需要被同步的字段
	 * @return 是否成功
	 */
	public boolean sync(Map<WritablePropertyType,Object> map);

以上虽然很简洁,对于调用者只需要将自己需要更新的字段拼装成map,同时key使用WritablePropertyType 泛型约束。如果需要对某个字段清空,只需要put一个null值进来就行了。

但是泛型约束并不那么强,对于不遵循泛型的map的入参虽会有警告但是没办法做到强类型的约束,还是存在一些风险。难道在服务端进行key类型检查,不规范的抛异常吗?为了更好的约束,又有了方案三。

 

方案三

方案二随能很好满足需求,但是泛型毕竟约束是不够的,于是想了方案三。基本是延续方案二的思路,用map。也是由自己设计的WritablePropertyType 枚举作为map的key。但是要对map做一些改造,使得map只能放进来以WritablePropertyType作为key的map。于是想到对HashMap做一个扩展,只是简单的复写put方法,并在put方法里强制检查。

复写的map如下:

import java.util.HashMap;

public class WritableMap<K, V> extends HashMap<K, V> {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public V put(K key, V value) {
		if (key instanceof WritablePropertyType) {//强制检查
			super.put(key, value);
			return value;
		} else {
			throw new IllegalArgumentException(
					"key type must be WritablePropertyType");
		}
	}
}
 

 服务方法入参设计如下:

	/**
	 * 
	 * @param map  需要被同步的字段
	 * @return 是否成功
	 */
	public boolean sync(WritableMap<WritablePropertyType,Object> map);

 

 

 

 

以上方案三是最后定下来一个折中的方案,相信这还不是最优方案,不知道大家有没有更好的方案?说说你的观点吧,:)

<think>嗯,用户这次的需求很明确,是要做一个基于TEC的温控系统实训项目。从用户提到的关键词来看,这应该是自动化或电子专业的学生在做课程设计,需要兼顾理论和实践。用户引用的两篇资料很有意思,第一篇似乎是某个简易框架的流程图,提到了DS18B20、LM75A、数码管、PID等关键词;第二篇则更详细,涉及ADC采集、PID算法、显示模块等技术点。不过用户特意强调这些引用不是真实需求,说明ta更希望得到系统性的设计方案。注意到用户在上次对话中系统要求生成相关问题,但这次直接跳过了提问环节,可能是急于获取具体实施方案。作为专业助手,我需要把自动控制原理和工程实践结合起来讲解。整个系统设计可以拆解为几个核心模块:温度采集部分建议选择高精度数字传感器,因为实训项目需要采集数据;控制算法必须重点解释PID数整定,这是实训难点;功率驱动电路要强调H桥设计,避免学生烧毁TEC模块;显示单元可以简化处理,LCD1602足够实训使用。特别要考虑学生的实操安全性:在硬件电路设计部分必须强调过流保护和热插拔保护,实验室里经常发生学生反接电源导致模块烧毁的事故。另外建议加手动调模式,这样调试时更直观。实训项目的关键是要让学生理解温度控制从开环到闭环的完整过程,所以方案中加了状态流程图和工作模式转换机制。软件设计特意采用模块化伪代码,方便不同编程水平的学生实现。最后补充的扩展优化都来自真实项目经验:温度场均匀性是多传感器布置的核心问题,非线性补偿能提升高档位控制精度,上位机监控则是现代工业的必备功能。这些内容可以作为优秀学生的加分项。</think> 基于半导体制冷(TEC)模块的温度控制系统设计方案如下,结合自动控制实训需求,重点突出PID算法实践和硬件实现: ### 一、系统总体设计 ```mermaid graph TB A[温度传感器] --> B[信号调理电路] B --> C[单片机ADC采集] C --> D[PID控制算法] D --> E[驱动电路] E --> F[TEC模块] F --> A G[显示模块] <--> C H[按键输] --> D ``` ### 二、核心硬件设计 1. **温度采集单元** - 传感器:高精度数字传感器(如DS18B20,±0.5℃)配合模拟传感器(PT100+运放调理)双路冗余 - ADC转换:单片机内置12位ADC(如STM32F103),采样率1kHz - **电路要点**:传感器需加电磁屏蔽罩,走线避开功率线路 2. **TEC驱动电路** ```mermaid circuit LR A[单片机PWM] --> B[半桥驱动器IR2110] B --> C[全桥MOSFET电路] C --> D[TEC模块] ``` - MOSFET选型:耐压30V以上,电流≥5A(如IRF540N) - **保护电路**: - 过流保护:ACS712电流检测+比较器硬件关断 - 反压保护:快恢复二极管并联TEC 3. **供电系统** - 主电源:12V/8A开关电源(需预留30%余量) - 辅助电源:LDO降压至5V/3.3V供控制电路 ### 三、控制系统实现 1. **PID算法设计** - 位置式PID公式: $$u(k) = K_p e(k) + K_i \sum_{i=0}^k e(i)T + K_d \frac{e(k)-e(k-1)}{T}$$ $T$:采样周期(建议100ms) - **数整定流程**: ```mermaid graph LR A[手动调试] --> B[临界比例法] B --> C[Ziegler-Nichols整定] C --> D[微调优化] ``` 2. **程序流程图** ```plaintext 开始 ├─ 初始化:ADC/PWM/定时器 ├─ 主循环: ├─ 读取温度(数字+模拟双通道校验) ├─ 温差计算:ΔT = T_实际 - T_设定 ├─ PID计算输出PWM占空比 ├─ 驱动TEC(冷/热模式切换) ├─ LCD显示实时温度曲线 └─ 监测温差过高报警 ``` ### 四、实训操作要点 1. **开环测试**(1学时) - 手动设置PWM占空比(10%~90%阶跃) - 记录温度响应曲线,分析TEC热惯性 2. **PID闭环整定**(3学时) - 先整定$K_p$使系统出现等幅振荡 - 记录临界增益$K_u$和振荡周期$T_u$ - 按Z-N规则设置数: $K_p=0.6K_u$, $K_i=2K_p/T_u$, $K_d=K_pT_u/8$ 3. **性能验证**(2学时) - 阶跃响应测试:设定温度跳变5℃,记录调节时间 - 抗干扰测试:用吹风机施加温度扰动 ### 五、关键器件清单 | 器件 | 型号 | 备注 | |------|------|------| | 主控 | STM32F103C8T6 | 带12位ADC | | TEC模块 | TEC1-12705 | 最大电流5A | | 温度传感器1 | DS18B20 | 数字接口 | | 温度传感器2 | PT100+LM358 | 模拟量备用 | | 驱动器 | IR2110+IRF540N×4 | H桥配置 | ### 六、安全规范 1. **热管理** - TEC热端必须安装散热器(≥50×50mm铝鳍片) - 强制风冷:4010风扇(风量≥5CFM) 2. **电气安全** - 控制板与功率板物理隔离 - 所有功率线采用16AWG硅胶线 > **设计难点突破**:解决TEC非线性问题可采用双PID分段控制——低温区加大$K_i$抑制静差,高温区增强$K_d$改善响应速度[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值