今天晚上和项目组的几个同学讨论一个服务方法的入参设计,觉得挺有意思的,在此记录一下!
背景
我们的场景需要对外暴露一个远程服务写入接口,用于给几个外部同步数据的场景。
由于历史的原因,需要被写入的这个业务对象很大,字段很多(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);
以上方案三是最后定下来一个折中的方案,相信这还不是最优方案,不知道大家有没有更好的方案?说说你的观点吧,:)
分享到:
相关推荐
综上所述,“一个有意思的钟”不仅展示了C++的基本编程技巧,还可能涉及到了图形用户界面设计、事件处理和时间显示的高级概念。这个项目为学习者提供了一个有趣的练习,帮助他们巩固C++编程和MFC应用开发的知识。
标题中的“一个有意思的闹钟程序源码”表明这是一个与编程相关的项目,具体是关于创建一个闹钟应用的源代码。这个程序可能具有独特的设计或功能,使得它在众多闹钟程序中显得有趣或与众不同。 描述中的“这是本人一...
"一个有意思的jQuery动画移动特效"这个主题,显然涉及到如何利用jQuery来创建吸引人的、动态的视觉体验。以下是对这个主题的详细说明: 1. **jQuery基础**:首先,了解jQuery的基础是必要的。jQuery通过简洁的API...
综上所述,面对一个有意思的React问题,我们需要分析HTML结构、理解Babel的作用、掌握React核心API的使用以及深入学习React的最佳实践,以解决可能出现的各种挑战。通过不断学习和实践,我们能够更好地理解和解决...
一个有意思的竖直菜单,JS+CSS 一个有意思的竖直菜单,JS+CSS,美化的相当漂亮,鼠标放到小图标上,会出现菜单,类似鼠标提示的效果,不过作者大胆创新,没想到这种效果也真的很棒,希望大家也喜欢。菜单所用到的...
在这个"一个有意思的py程序.7z"压缩包中,包含了一个利用Turtle库实现的自动画智慧树的程序,即`test01.exe`。这个程序展示了如何通过编程来创造艺术,同时也体现了Python Turtle库的强大功能。 Turtle库源自早期的...
一个简单且有意思的内存取证 很好玩特别好玩 轻易不建议下载 一个简单且有意思的内存取证 很好玩特别好玩 轻易不建议下载 一个简单且有意思的内存取证 很好玩特别好玩 轻易不建议下载 一个简单且有意思的内存取证 很...
一个有意思的圣诞节专属动画,主要技术为CSS、JavaScript、HTML,该动画包含多张图片,还有可以播放音乐!
一个有意思的自动关机脚本 利用shutdown编写的vb脚本 没有什么实际意义,只是好玩 在cmd中运行 shutdown -a即可取消自动关机
中秋节快到啦,想做一个有意思的贺卡分享小程序
标题中的“一个有意思的获得每天全球各地地震的软件”指的是一个应用程序或者系统,它能够实时获取并展示全球范围内的地震信息。这个软件可能是基于特定的数据源,如美国地质调查局(USGS)或国际地震学和地球内部...
"FunWithGravity"是一个基于C# WinForm的有趣程序,通过这个程序,我们可以深入学习C#编程语言、WinForm设计以及物理模拟的相关知识。 1. **C#语言基础** C#是.NET框架的核心编程语言,以其简洁、类型安全和面向...
该方法接受一个字符串`s`作为参数,并将其转换为小写。接下来,如果该字符串等于`"yes"`、`"y"`或`"t"`中的任何一个,则将其值更改为`"true"`。之后,调用`Boolean.getBoolean(s)`返回一个布尔值。 `Boolean....
"几个有意思的.NET"这个主题涵盖了几个特定的开发技术,包括3D图形处理、模拟QQ风格的交互设计以及日历控件的使用。这些技术在ASP.NET开发中尤为常见,用于提升用户体验和界面美观性。 首先,让我们探讨3D图层技术...
标题提到的“一个非常有意思的悬浮球源码”显然是一个实现了类似360助手功能的悬浮小球组件,带有动画效果,能够方便地集成到其他应用程序中。这个源码项目,名为“mtFloatBall”,很可能是为开发者提供了一个自定义...
IDL 文件中的结构体(struct)定义了数据模型,这些结构体中的每个字段都有一个唯一的数字编号,用于标识该字段。 当使用 Thrift 进行序列化时,它会将结构体转换为二进制格式。在这个过程中,每个字段都会根据其...
这个项目旨在创建一个具有类似豆瓣网用户体验的清新风格网站,适用于文学、情感、新鲜事等内容的分享。 1. PHP基础:PHP是一种广泛使用的服务器端脚本语言,用于动态网页开发。在这个项目中,PHP被用来处理用户请求...
标题中的“精品--有意思的一个布局(号称是一个简历模板)”表明这是一个设计独特的简历模板,可能包含创新的排版和视觉效果,旨在吸引潜在雇主的注意。这个压缩包文件可能包含一个或多个文档,如`.doc`、`.docx`或者`...
标题和描述中提到的是一个毕业设计或课设项目,它涉及到地图信息展示小程序的开发以及一个创新的同学录功能。这个小程序旨在提供一个美观且用户体验良好的平台,用户可以在其中查看地图信息,同时也能浏览班级同学的...
这里为你收集整理了关于毕业设计、课程设计可参考借鉴的资料一份,质量非常高,如果你投入时间去研究几天相信肯定对你有很大的帮助。到时候你会回来感谢我的。 本资源是经过本地编译测试、可打开、可运行的项目、...