美文网首页每天写500字
函数式版的Class

函数式版的Class

作者: 业翔 | 来源:发表于2019-11-20 15:35 被阅读0次

我在写程序的时候,打算定义数据类型时,经常碰到一个疑惑,到底应该使用基本数据结构封装它,还是使用函数来封装它。

例如封装一个类型Student:

数据版本

function makeStudent(name, age)
{
   return {name: name, age: age};
}

function getName(student)
{
   return student.name;
}

function getAge(student)
{
   return student.age;
}

函数版本

function makeStudent(name, age)
{
    return function(method)
    {
        if (method == "getName") {
            return name;
        }
        else if (method == "getAge") {
            return age;
        }
    }
}

function getName(student) {
    return student("getName");
}

function getAge(student) {
    return student("getAge");
}

第一个小例子中,makeStudent使用一个Map来封装对象。第二个小例子中,使用函数来封装对象。
这两个小例子都能完成任务,且对于上层使用者来说是完全透明的。然而它们各自的优势,以及使用场景在哪里呢?

首先可以直观看到的是,而且数据版的student的内部数据是全部公开的,任何人都可以看到它的所有字段内容。

而且使用数据版的student有被修改的风险。例如以下程序:

let student = makeStudent("zhangsan", 20);
student.name = "lisi";

上面的例子中,原本student的名字是zhangsan,却可以被改名为lisi。

而使用函数版的student,却没有这些担忧。事实上,函数版的student更接近OOP中的class,因此能做到很多class能做到的事情。

比如我们可以实现多态。

如何理解呢?假设需要再定义一个Teacher类型。

function makeTeacher(name, sex)
{
    return function(method)
    {
        if (method == "getName") {
            return "teacher:" + name;
        }
        else if (method == "getSex") {
            return sex;
        }
    }
}

function getSex(teacher)
{
    return teacher("getSex");
}

这个例子中多态的特性主要表现在getName这个函数上:

let teacher = makeTeacher("老师A", 1);
let student = makeStudent("学生A", 20);

let name1 = getName(teacher);
let name2 = getName(student);

调用同样的函数,teacher和student的行为是不一样的。这或许就是函数式的多态吧。

而上面的各种make函数,其实就是函数式版本的class,但更加轻量,更加灵活。

相关文章

  • 函数式版的Class

    我在写程序的时候,打算定义数据类型时,经常碰到一个疑惑,到底应该使用基本数据结构封装它,还是使用函数来封装它。 例...

  • 笔记-React-Hooks

    一、矛与盾的问题?(Class组件与函数式组件)   在 React 中 Class 组件好用还是函数式组件好用呢...

  • 面向对象的扭曲

    我最近终于悟到了函数式编程跟class的精髓,原来函数式编程跟class(也就是所谓的面向对象)是完全不冲突的,而...

  • React Hooks

    前言 React中组件分为两大类:Class类式组件、函数式组件 React v16.8以前: Class类式组件...

  • useState原理以及其它react-hook的使用

    前言 自react16.8发布了正式版hook用法以来,我们公司组件的写法逐渐由class向函数式组件+hook的...

  • React 如何区别class和function?

    React定义组件的方式有两种,class和function。如下: 函数式定义: class方式定义: 当我们需...

  • React Hook

    React 声明组件的方式 Class声明和函数式声明(无状态组件)。Class声明可以操作state、生命周期等...

  • Functor, Applicative, Monad片面理解

    导读 判断一个语言原生是否支持函数式编程,主要看它的函数是否first-class function,函数作为第一...

  • ES6之Class跟普通构造函数

    构造函数 Class构造函数 class的本质还是函数 Class 继承 总结 class更加贴近于面向对象的写法...

  • React创建组件的两种方式

    1.创建组件两种方式 方式1.函数式组件 方式2.函数式组件--使用ES6的class来定义一个组件 本文目的仅仅...

网友评论

    本文标题:函数式版的Class

    本文链接:https://www.haomeiwen.com/subject/ioeoictx.html