`
singleant
  • 浏览: 378213 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

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

 

背景

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

由于历史的原因,需要被写入的这个业务对象很大,字段很多(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);

 

 

 

 

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

1
1
分享到:
评论

相关推荐

    一个有意思的钟

    综上所述,“一个有意思的钟”不仅展示了C++的基本编程技巧,还可能涉及到了图形用户界面设计、事件处理和时间显示的高级概念。这个项目为学习者提供了一个有趣的练习,帮助他们巩固C++编程和MFC应用开发的知识。

    一个有意思的闹钟程序源码

    标题中的“一个有意思的闹钟程序源码”表明这是一个与编程相关的项目,具体是关于创建一个闹钟应用的源代码。这个程序可能具有独特的设计或功能,使得它在众多闹钟程序中显得有趣或与众不同。 描述中的“这是本人一...

    一个有意思的jQuery动画移动特效

    "一个有意思的jQuery动画移动特效"这个主题,显然涉及到如何利用jQuery来创建吸引人的、动态的视觉体验。以下是对这个主题的详细说明: 1. **jQuery基础**:首先,了解jQuery的基础是必要的。jQuery通过简洁的API...

    一个有意思的react问题

    综上所述,面对一个有意思的React问题,我们需要分析HTML结构、理解Babel的作用、掌握React核心API的使用以及深入学习React的最佳实践,以解决可能出现的各种挑战。通过不断学习和实践,我们能够更好地理解和解决...

    一个有意思的竖直菜单,JS+CSS

    一个有意思的竖直菜单,JS+CSS 一个有意思的竖直菜单,JS+CSS,美化的相当漂亮,鼠标放到小图标上,会出现菜单,类似鼠标提示的效果,不过作者大胆创新,没想到这种效果也真的很棒,希望大家也喜欢。菜单所用到的...

    一个有意思的py程序.7z

    在这个"一个有意思的py程序.7z"压缩包中,包含了一个利用Turtle库实现的自动画智慧树的程序,即`test01.exe`。这个程序展示了如何通过编程来创造艺术,同时也体现了Python Turtle库的强大功能。 Turtle库源自早期的...

    一个简单且有意思的内存取证 很好玩特别好玩 轻易不建议下载 内存取证B8

    一个简单且有意思的内存取证 很好玩特别好玩 轻易不建议下载 一个简单且有意思的内存取证 很好玩特别好玩 轻易不建议下载 一个简单且有意思的内存取证 很好玩特别好玩 轻易不建议下载 一个简单且有意思的内存取证 很...

    一个有意思的圣诞节专属动画

    一个有意思的圣诞节专属动画,主要技术为CSS、JavaScript、HTML,该动画包含多张图片,还有可以播放音乐!

    一个有意思的自动关机的脚本

    一个有意思的自动关机脚本 利用shutdown编写的vb脚本 没有什么实际意义,只是好玩 在cmd中运行 shutdown -a即可取消自动关机

    中秋节快到啦,想做一个有意思的贺卡分享小程序

    中秋节快到啦,想做一个有意思的贺卡分享小程序

    一个有意思的获得每天全球各地地震的软件

    标题中的“一个有意思的获得每天全球各地地震的软件”指的是一个应用程序或者系统,它能够实时获取并展示全球范围内的地震信息。这个软件可能是基于特定的数据源,如美国地质调查局(USGS)或国际地震学和地球内部...

    C# winform 一个很有意思的程序 FunWithGravity

    "FunWithGravity"是一个基于C# WinForm的有趣程序,通过这个程序,我们可以深入学习C#编程语言、WinForm设计以及物理模拟的相关知识。 1. **C#语言基础** C#是.NET框架的核心编程语言,以其简洁、类型安全和面向...

    几个有意思的java程序,考考你的java功底

    该方法接受一个字符串`s`作为参数,并将其转换为小写。接下来,如果该字符串等于`"yes"`、`"y"`或`"t"`中的任何一个,则将其值更改为`"true"`。之后,调用`Boolean.getBoolean(s)`返回一个布尔值。 `Boolean....

    几个有意思的.NET

    "几个有意思的.NET"这个主题涵盖了几个特定的开发技术,包括3D图形处理、模拟QQ风格的交互设计以及日历控件的使用。这些技术在ASP.NET开发中尤为常见,用于提升用户体验和界面美观性。 首先,让我们探讨3D图层技术...

    一个非常有意思的悬浮球源码

    标题提到的“一个非常有意思的悬浮球源码”显然是一个实现了类似360助手功能的悬浮小球组件,带有动画效果,能够方便地集成到其他应用程序中。这个源码项目,名为“mtFloatBall”,很可能是为开发者提供了一个自定义...

    thrift 一个有意思的特性:Class名称无关性

    IDL 文件中的结构体(struct)定义了数据模型,这些结构体中的每个字段都有一个唯一的数字编号,用于标识该字段。 当使用 Thrift 进行序列化时,它会将结构体转换为二进制格式。在这个过程中,每个字段都会根据其...

    精仿有意思吧PHP源码(类豆瓣清新风格)

    这个项目旨在创建一个具有类似豆瓣网用户体验的清新风格网站,适用于文学、情感、新鲜事等内容的分享。 1. PHP基础:PHP是一种广泛使用的服务器端脚本语言,用于动态网页开发。在这个项目中,PHP被用来处理用户请求...

    精品--有意思的一个布局(号称是一个简历模板).zip

    标题中的“精品--有意思的一个布局(号称是一个简历模板)”表明这是一个设计独特的简历模板,可能包含创新的排版和视觉效果,旨在吸引潜在雇主的注意。这个压缩包文件可能包含一个或多个文档,如`.doc`、`.docx`或者`...

    毕业设计&课设--一款设计精美、体验优良的地图信息展示小程序,一个更有意思的同学录,可以在小程序中查看班级同学的毕业.zip

    标题和描述中提到的是一个毕业设计或课设项目,它涉及到地图信息展示小程序的开发以及一个创新的同学录功能。这个小程序旨在提供一个美观且用户体验良好的平台,用户可以在其中查看地图信息,同时也能浏览班级同学的...

    毕业设计- 一款设计精美体验优良的地图信息展示小程序一个更有意思的同学录可以在小程序中查看班级同学的毕业去向以及.zip

    这里为你收集整理了关于毕业设计、课程设计可参考借鉴的资料一份,质量非常高,如果你投入时间去研究几天相信肯定对你有很大的帮助。到时候你会回来感谢我的。 本资源是经过本地编译测试、可打开、可运行的项目、...

Global site tag (gtag.js) - Google Analytics