zoukankan      html  css  js  c++  java
  • javascript 中的类型

    javascript 中的类型

    js 是一门弱语言,各式各样的错误多种多样,特别是确定返回值有问题的时候,你会用什么来进行表示错误?

    我一般有三个选择:

    1. null
    2. ''
    3. error
    4. {}

    第一个选择 null 如果结果是空,倒底是什么意思,是正确还是错误,你在写代码时会很疑惑.
    第二个选择 '' 空字符串,结果更糟,因为1. 可能弄混了返回值的类型,2. 想提供一些有用的信息也带不回来。
    第三个选择 error ,可以,但是你需要去判断类型
    第四个选择 {} 空对象,跟1. 2 没有什么区别

    都不是一个很好的选择,因为 js 没有像 c 中的连合类型: union。

    随着 es6 的普级,对像的解构语法,给了我很大的启发,用他来进行一个复合类型的表达是可行的。

    我的类的设计是如下:

    class Result {
        constructor(error,data) {
            this.error = error;
            this.result = data;
        }
    
        isFaulted() {
            return !!this.error;
        }
    
        getResult() {
            return this.result;
        }
    
        getError() {
            return this.error;
        }
    
        map(fn) {
            if (this.isFaulted()) {
                return Result.ofError(this.getError());
            } else {
                return Result.ofResult(fn && fn(this.getResult()));
            }
        }
    
        asCallback(cb) {
            return cb && cb(this.getError(), this.getResult());
        }
    
        asAsync() {
            if (this.isFaulted()) {
                return new Promise.reject(this.getError());
            } else {
                return new Promise.resolve(this.getResult());
            }
        }
    
        static ofResult (data) {
            return new Result(null, data);
        }
    
        static ofError(err) {
            return new Result(err, null);
        }
    
        static of(data, error) {
            return new Result(error, data);
        }
    }
    

    设计的特点:

    1. 分成两个部分,一个部分是结果数据,另一个部分是错误,这样就可以分开判断,而不用去判断数据的类型
    2. 结合对像的解构语法,let {result, error} = result ,就能很快知道是否是错误,语意更清晰。
    3. 结合函数式的思想,能进行链式调用如 map。
    4. 也整合了 promise 能进行异步的处理,对 async/await 也很合适

    最重要的是减轻思想负担,不用去管返回结果什么情况下是对的,什么情况下的错的,这跟 golang 风格很像。

    唯一会有问题的地方就是会传染,多了一些代码的调用, 不过写多了业务代码,我觉得这些都是小问题。

    在万不得以的情况下,最外面再使用 try - catch 更好。

  • 相关阅读:
    一个有趣的.net程序死锁问题
    腾讯2013年实习生笔试题目(附答案)
    C#函数式程序设计初探基础理论篇
    IE的BUG?
    OpenPetra 以及CentOS Mono 3.0 部署包
    自己封装的内存缓存类DotNet.Caches.Bytecached
    Windows Azure Services安装及故障排查
    接口
    利用SQL Server的扩展属性自动生成数据字典
    CentOS配置ssh无密码登录的注意点
  • 原文地址:https://www.cnblogs.com/htoooth/p/8677705.html
Copyright © 2011-2022 走看看