update, set, put, patch

写代码的时候,经常会有几个概念容易混淆,即update, set, put, patch。这几个单词在我们编程过程中经常会出现,我们自己在给方法取名字的时候,也常常不知道该用哪一个好。据一个例子,当你想要将用户修改好的个人信息保存到数据库时,应该用哪一个单词呢?现在我就来具体解释一下它们的使用场景。

set:将对象塞入到集合中,无论这个对象是否在集合中已经存在。这里有一个隐藏的风险,如果这个对象在集合中已经存在了,那么当你set的对象比原来的对象少了一些属性的时候,这些属性就丢失了。在这种情况下,set相当于replace。而如果这个对象本身不存在于集合中,那么set就相当于add了。

update:对传入的对象进行更新。首先,它要更新的内容虽然是对象,但你不确定它的个数;其次,它在更新时并不像set一样进行直接替换,而是对传入update中参数中规定的属性进行更新,因此,参数中未规定的属性保持不变;最后,它只是更新,不会附带add操作。update是一个比较高度抽象的词,因此,你实在不知道应该选用哪个词作为更新操作的时候,用update就行了。

put:和set非常接近。从词语本身看,set更多倾向于replace,put更多倾向于add。put的前提是在集合中已经存在一个位置(空位),而put操作准确的将参数对象放入这个位置。但是实际中,大部分规则下,put被赋予replace的功能。因此,在编程时,可以说put和set没有区别。

patch:和update非常接近,但仅对单个对象进行update,而update可以对一组对象进行更新。在restful中patch和put一样也被定义为更新操作。实际上,我认为patch是对但对象的update,而put被大部分人误解。restful中,大部分人将put定义为更新操作,即对但对象的update操作。但我认为,put既不是update,也不是add,而是这两者的整合,也就是上面说的set的逻辑(repalce/add)。但是patch非常明确,就是对单个对象的更新,因此,在restful设计中应该考虑用patch,而非put。

 

写方法的时候,我们常常会有两种方式,一种是set(key, value)的形式,另一种是set({ key: value })的形式。显然,第一种只能一次更新一个属性,而第二种可以同时更新多个属性。但是很明显,这里如果我们把set理解为上文阐述的意义,那么只能选择第一种形式,它代表将一个对象的某个属性整体替换为(如果不存在则添加)新内容。而第二种形式更适合patch,即我在知道我要更新哪一个对象时(常常通过url确定),我只传入我想要更新的属性名和值。但是在不知道我要更新哪个对象时,则不应该使用patch,而应该用update,并且要求在传入的对象中,提供明确的主键值。