V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
banxi1988

优雅的 JavaScript 之 编写优雅的 Settings 类

  •  
  •   banxi1988 ·
    banxi1988 · Jun 4, 2018 · 2475 views
    This topic created in 2887 days ago, the information mentioned may be changed or developed.
    4 replies    2018-06-15 13:58:22 +08:00
    mfhh
        1
    mfhh  
       Jun 13, 2018
    有点啰嗦啊。
    我宁愿写成
    const storage={};

    function loadSettings(){
    let strSettings=storage["settings"]||"{}";
    return JSON.parse(strSettings)
    }
    function saveSettings(settings){
    storage["settings"]=JSON.stringify(settings)
    }

    var settings=loadSettings();
    settings.username = "banxi";
    settings.age=10;
    settings.autoLogin=true;
    saveSettings(settings);
    banxi1988
        2
    banxi1988  
    OP
       Jun 14, 2018
    @mfhh 不过你这样的话,失去了类型安全和自动补全了。
    mfhh
        3
    mfhh  
       Jun 15, 2018
    @banxi1988
    你不是用了 Typescript 么?写个 var settings:ISettings; 就有类型安全和自动补全了。

    上文是参照你的风格写的代码。我实际代码一般直接写成这样:

    //类型定义,在编辑器中有类型安全和自动补全
    interface ISettings {
    autoLogin: boolean;
    username: string;
    age: number;
    }

    //数据尽量使用 plain json
    const settings:ISettings ={
    autoLogin:true,
    username: "banxi"
    age: 10
    }

    //持久化操作单独拿出,以便性能优化
    storage["settings"]=JSON.stringify(settings)
    banxi1988
        4
    banxi1988  
    OP
       Jun 15, 2018
    @mfhh 嗯通过 ISettings 是可以做到这一点,我项目把所有接口的返回都增加了对应 Interface 声明。我也是我很喜欢 TS 的一个方面。
    不过用在这个配置上还是不太理想呢。 比如上面你是把整个 settings 一同取出和存入。
    当这个 settings 中的某些值比较大的时,会造成不心要的存取开销。
    而我的的这种设计是不会影响其他键值的存取的。

    另外相比定义一个 `Interface` ,我的这种做法只是增加了一个 `@asSettings` 的声明。 所以我这种做法,我感觉还是有可取之处的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2724 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 14:29 · PVG 22:29 · LAX 07:29 · JFK 10:29
    ♥ Do have faith in what you're doing.