刚在看一个 uniapp 项目,里面有一个文件是对 storage 的封装,感觉有点过度封装的样子。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
go522000
V2EX    前端开发

刚在看一个 uniapp 项目,里面有一个文件是对 storage 的封装,感觉有点过度封装的样子。

  •  
  •   go522000 2024-08-05 16:46:14 +08:00 2131 次点击
    这是一个创建于 431 天前的主题,其中的信息可能已经有所发展或是发生改变。

    11111.png

    看代码,觉得没必要再去封装一次。

    或许?是我功力还不够,还没有认识到这种写法的好处?

    第 1 条附言    2024-08-06 14:11:41 +08:00
    非常感谢各位的指点,我还需要再多多学习。
    15 条回复    2024-08-06 14:09:08 +08:00
    linshuizhaoying
        1
    linshuizhaoying  
       2024-08-05 16:50:52 +08:00
    你还是多学习吧。。。
    icanfork
        2
    icanfork  
       2024-08-05 16:53:12 +08:00
    你直接业务层操作 uni.storage 不妥吧
    cvooc
        3
    cvooc  
       2024-08-05 16:55:48 +08:00
    封装一下, 便于打 log 和序列化呀, 你没看把 json 单独拎出来做了非空校验了吗
    7gugu
        4
    7gugu  
       2024-08-05 16:56:16 +08:00   1
    这样子是为了能够把底层的操作接口跟业务逻辑抽离开,假设未来需要更换底层的接口或者需要增加额外的逻辑,就不用在跳到每个调用 localstorage 的地方来修改,只要统一修改一次,过一遍业务逻辑的测试就可以了,节约了开发的工作量。
    dumbass
        5
    dumbass  
       2024-08-05 17:19:15 +08:00

    这里建议 try catch 一下,JSON.parse 有报错风险
    CSM
        6
    CSM  
       2024-08-05 17:32:12 +08:00   1
    这就是过度封装了,“假设未来 XX”属于典型的过度设计。先不说这个假设有多大可能会实现(应该几乎不会遇到要更换 localStorage 为其他存储类型吧),就算未来要修改,那个时候再考虑封装也不迟,因为那个时候有更多的信息。修改起来就是个查找替换罢了。

    `JSON.parse()` 也完全不用 try...catch, 原因是 catch 住然后呢,再原样抛出还是返回 null ? localStorage 里是自己之前保存的数据,如果这里出问题那说明逻辑上有问题,比如不是 JSON 却用了 `getJson()` 来获取。
    haihaishuaige
        7
    haihaishuaige  
       2024-08-05 17:58:28 +08:00   1
    很有必要,公司有一个本地修改数据保存的 demo 项目,之前都是在单个页面用 localStorage 的,现在太多了想换别的缓存方案,由于页面太多一直没改,如果是封装的话只需要改一个地方就行
    Niphor
        8
    Niphor  
       2024-08-05 21:56:17 +08:00
    如果是一次性项目 那没啥必要

    如果是常用的公共代码,起码 在这里 你可能统一加 prefix 、ttl 处理,更换实现等等而不必担心哪里漏了...
    renmu
        9
    renmu  
       2024-08-05 22:00:21 +08:00 via Android
    减少读取写入 json 的样板代码而已
    k9982874
        10
    k9982874  
       2024-08-05 22:22:16 +08:00 via Android
    屏蔽底层实现细节,留出了足够的扩展空间,同时涉及到的代码量不大,是个好设计
    7gugu
        11
    7gugu  
       2024-08-06 00:51:47 +08:00
    @CSM 你没遇到过,不代表这就是过度封装。
    1. 首先逐个替换永远存在遗漏的可能性。其次,等到需要用的时候再替换,这里就已经存在额外的开发成本了,提前设计好,改一次全局就能生效的,非要额外花人力去单独调整,这就是在浪费自己的时间。如果你热爱加班,确实是可以这么做的。
    2. JSON.pase 肯定是要加 try...catch 的,出错你可以增加上报,可以加重试逻辑,可以返回默认值,也可以继续抛出异常。而不是等到外网爆炸了卡住了,才跑过来修复问题。
    toesbieya
        12
    toesbieya  
       2024-08-06 09:08:48 +08:00
    就代码而言写的确实不行,uni storge 自己就做了序列化和反序列化,根本不需要自己写 JSON 序列化
    一般都是记录做了存储的键名,或者单独给某个数据做封装
    iv8d
        13
    iv8d  
       2024-08-06 09:20:23 +08:00
    方便切换,挺好的,建议回炉
    lichuyi
        14
    lichuyi  
       2024-08-06 09:26:47 +08:00
    封装的太简单了
    csl123
        15
    csl123  
       2024-08-06 14:09:08 +08:00
    @Niphor #8 确实,之前写微信小程序也做过类似的封装。主要还是微信小程序太坑了,读取 storage 有时候会耗时几百毫秒。体验版开发版正式版共用 storage ,导致必须要给 key 手动加前缀。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3723 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 10:17 PVG 18:17 LAX 03:17 JFK 06:17
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86