我发现,在项目的早期阶段,服务器返回的数据结构可能会随着数据模型的变化而频繁变化。
例如,如果我正在构建一个绘制本地感兴趣点位置的应用程序,我可能首先返回如下所示的json:
[{"name" : "Odeon", "poiType" : "cinema", "lat" : 34.4, "lon" : 10.3}, 
 {"name" : "McDonalds", "poiType" : "restaurant", "lat" : 34.5", "lon" : "10.5"}, ...]在客户机上,我可能有几个需要lat/lon信息的组件,它们通常按如下方式访问数据:
function showPointsOfInterest(pois) {
    pois.forEach(function (poi) {
         var icon = getIcon(poi.poiType); 
         addToMap(poi.lon, poi.lat, icon);
     })
}
function listPointsOfInterest(pois) {
     pois.forEach(function (poi) { 
         var icon = getIcon(poi.poiType); 
         addToList(poi.lon, poi.lat, icon);
     })
}然后,我决定要更改数据结构,使其现在看起来像
[
{
    "name": "Odeon",
    "type": "cinema",
    "location": {
        "coordinates": {
            "lat": 34.4,
            "lon": 10.3
        },
        "address": "Main St, 54"
    }
},
{
    "name": "McDonalds",
    "type": "restaurant",
    "location": {
        "coordinates": {
            "lat": 34.5,
            "lon": 10.5
        },
        "address": "Main St, 154"
    }
}, ... ]现在的变化是poiType现在是type,lat和lon现在是location.coordinates的子代。
我现在需要将我的客户端代码更改为
function showPointsOfInterest(pois) {
    pois.forEach(function (poi) {
     var icon = getIcon(poi.type);
      var coords = poi.location.coordinates; 
      addToMap(coords.lon, coords.lat, icon);
   })
}
function listPointsOfInterest(pois) {
    pois.forEach(function (poi) { 
        var icon = getIcon(poi.type);
        var coords = poi.location.coordinates;  
        addToList(coords.lon, coords.lat, icon);
    })
}必须遍历代码并找到我访问poiType、lat和lon的位置可能会很痛苦。
所以我想知道创建一些实用函数是否是一个好的实践,比如
function getLon(poi) {
    return poi.location.coordinates.lon;
}
function getLat(poi) {
    return poi.location.coordinates.lat;
}
function getType(poi) {
    return poi.type;
}然后拥有
function showPointsOfInterest(pois) {
    pois.forEach(function (poi) {
     var icon = getIcon(getType(poi)); 
     addToMap(getLon(poi), getLat(poi), icon);
   })
}
function listPointsOfInterest(pois) {
    pois.forEach(function (poi) { 
        var icon = getIcon(getType(poi)); 
        addToList(getLon(poi), getLat(poi), icon);
    })
}这种方法的优点是,如果数据模型发生变化,我只需要对实用程序函数进行更改。
这是最好的办法吗?这样做有什么坏处吗?
发布于 2015-10-05 15:38:36
通常的方法是对API进行版本化。您的API仍然使用旧URI上的旧数据结构进行响应。然后,使用新的数据结构向API添加另一个URI。然后,客户端代码仍然继续在旧数据上工作,直到您有时间更改它。这是当您有外部客户时,根据您的API所必须做的事情。
如果您只是一个完美主义者,然后保持客户端代码与更改同步,那么您可以使用任何适合您的策略。请记住,您从API返回的数据不必是数据的规范版本。它可以表示最适合用例的数据。在这种情况下,平面对象似乎与更有组织的版本一样好,如果不是更好的话。
https://softwareengineering.stackexchange.com/questions/299022
复制相似问题