当前位置: 首页 > news >正文

解决数据兼容性问题

数据兼容性问题解决

问题说明

最近经常遇到新老数据兼容性的问题:某些新同事更改代码后,没有兼容旧数据,已有用户的数据显示不全或者错误,很麻烦。

技术层面,就是某个数据或者字段,存储在服务器上,版本迭代后,数据类型变化,前端需要兼容已有的数据类型。

例如一个用户对象:

例如第一版中,包括了姓名(字符串),年龄(数字),性别(布尔值)

let user1 = {
  version: 1,
  name: 'Michael',
  age: 20,
  isFemale: true,
};

第二版中

产品改了需求,针对国外用户,姓名改成了姓,名两个字段

性别改成了字符串,有的用户选择不显示性别

let user2 = {
  version: 2,
  first_name: 'Michael',
  last_name: 'An',
  age: 20,
  gender: 'male' or 'female' or ''
}

第三版中,增加了地址(字符串)

let user3 = {
  version: 3,
  first_name: 'Michael',
  last_name: 'An',
  age: 20,
  address: 'Beijing',
  gender: 'male',
}

第四版中,可能有多个住址,地址字段改成数组

let use4 = {
  version: 4,
  first_name: 'Michael',
  last_name: 'An',
  age: 20,
  address: ['Beijing', 'Shanghai'],
  gender: 'male' or 'female',
}

后端返回的数据中,有这些情况,那么前端使用时,需要兼容这多个版本的数据。

解决思路

可以添加 version 字段,数据预处理代码如下:

const preprocess = function(user) {
  if (typeof user !== 'object') {
    console.log('用户无效');
    return null;
  }
  if (user.version === 1) {
    const { age } = user;
    return {
      version: 4,
      first_name: user.name,
      last_name: '',
      age,
      address: [],
      gender: user.isFemale ? 'female' : 'male',
    };
  }
  else if (user.version === 2) {
    const { first_name, last_name, age, gender } = user;
    return {
      version: 4,
      first_name,
      last_name,
      age,
      address: [],
      gender,
    }
  }
  else if (user.version === 3) {
    const { first_name, last_name, age, gender, address } = user;
    return {
      version: 4,
      first_name,
      last_name,
      age,
      address: [address],
      gender,
    }
  }
  else if (user.version === 4) {
    return user;
  }
}

如果未来新增其他属性,那么根据新属性继续兼容。

也可以写一个 model user 类处理属性,优化代码,代码如下。

class User {
  constructor(obj) {
    this.version = obj.version || 4;
    this.first_name = obj.first_name || '';
    this.last_name = obj.last_name || '';
    this.age = obj.age || 0;
    this.address = obj.address || [];
    this.gender = obj.gender || '';
  }
}

最佳实践

最好的解决办法,还是在初期设计考虑各种情况,考虑后续的兼容性。

实际上,前端数据兼容比较容易,后端数据兼容处理的就比较复杂,还需要处理脏数据和大量数据的情况等,根据实际情况分析。
在这里插入图片描述

相关文章:

  • myBaits Target Capture Kits;myBaits 靶向捕获试剂盒,快速捕获富集目标序列
  • 百度、字节终于不再相互“抄袭”
  • 20230202英语学习
  • TypeScript类
  • this作用全解(全局this 、函数this、全局函数 this call apply bind……)
  • k8s核心资源ingress
  • 【MySQL】《狂飙》电视剧火了,如果程序一直狂飙,扛不住了,怎么办呢?
  • golang 协程关闭——谁敢说没踩过坑
  • 熵值法原理及python实现 附指标编制案例
  • Small RTOS51 学习笔记(10)Small RTOS51 的移植
  • CentOS7 LVM 逻辑卷2种读写策略(磁盘IO性能优化)—— 筑梦之路
  • 湫湫系列故事——减肥记Ⅰ(Python)
  • 分享158个ASP源码,总有一款适合您
  • 机器学习常见面试问题汇总
  • 低代码:让企业“活”起来,赋能企业数字转型
  • SAP IFRS 17 面向服务架构详细解析(包含分类账规则)
  • JavaWeb:过滤器与监听器
  • SpringBoot Log4j2日志
  • 导致商标注册失败的四大原因?
  • Arx遍历块内实体
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉