我怎么知道一个物体是否可以做到"某物

时间:2018-05-28 17:28:46

标签: javascript functional-programming

函数式编程的范式之一是对象组合,它应该优于类继承。

当对某个对象进行操作时,您通常需要知道对象上是否有某种方法可用。当一个类使用can do方法时,对象组合具有obj instanceof class方法。

使用类继承,您可以执行简单的is a检查以满足can do方法。

但是,我的问题是如何正确if(obj.method != null)

当然我可以通过static void Main(string[] args) { string result = ""; var res = "abc".Anagrams(); foreach(var anagram in res) { if(anagram.Count() == 3) { Console.Write(anagram.MergeToStr()); } } } public static string MergeToStr(this IEnumerable<char> chars) { return new string (chars.ToArray()); } 来检查对象上是否存在某些内容,但你做了什么,当你拿到手中的对象时,你无法确定是否有人添加了自己的东西(可能是意外添加)一个同名的方法)?。

2 个答案:

答案 0 :(得分:1)

我在回答中再说一遍:你问的是函数式编程,但你描述的一切都来自OOP。

通常,您不会在函数式编程中询问对象可以做什么。相反,您已知具有能够对已知输入类型进行操作并返回已知输出类型的已知函数。

一些首阶函数

const add = (x, y) =>
  x + y

const mult = (x, y) => 
  x * y

第一顺序数据抽象,rational数字模块

const rational = (numer, denom) =>
  [ numer, denom ]

const numerator = r =>
  r [0]

const denominator = r =>
  r [1]

我们可以为模块添加功能

const string_of_rational = r =>
  `(${numerator (r)} / ${denominator (r)})` 

const add_rational = (r1, r2) =>
  rational
    ( add ( mult ( numerator (r1)
                 , denominator (r2)
                 )
          , mult ( numerator (r2)
                 , denominator (r1)
                 )
          )
    , mult ( denominator (r1)
           , denominator (r2)
           )
    )

使用我们模块的示例程序

const a = rational (1, 2)
const b = rational (1, 4)
const c = add_rational (a, b)
console.log (string_of_rational (c))
// (1 / 2) + (1 / 4) = 
//=> (6 / 8)

数据抽象很重要,因为即使数据的基础表示发生变化,它也会保留我们程序的功能。

上面,我们使用一个简单的数组[]来存储有理数的两个值。如果我们想要的话,我们可以使用不同的实现

const rational = (numer, denom) =>
  ({ numer, denom })

const numerator = r =>
  r.numer

const denominator = r =>
  r.denom

我们的计划仍在运作

const a = rational (1, 2)
const b = rational (1, 4)
const c = add_rational (a, b)
console.log (string_of_rational (c))
// (1 / 2) + (1 / 4) = 
//=> (6 / 8)

由您决定如何打包和实施您的模块。在此示例中,我们在名为rational.js

的文件中包含与有理数相关的所有函数
// import whatever you need from your module,
// and make sure the module exports it!
const { make, add, string_of } = require ('./rational')

// our program works the same
const a = make (1, 2)
const b = make (1, 4)
const c = add (a, b)
console.log (string_of (c))
// (1 / 2) + (1 / 4) = 
//=> (6 / 8)

我推荐Gerald Jay Sussman和Harold Abelson的Structure and Interpretation of Computer Programs, 2nd edition。它将教你什么是函数式编程最重要的,函数。本书将为您提供一个坚实的基础,通过任何功能语言中的更高级概念来学习。

答案 1 :(得分:-1)

有趣的问题。简单的解决方案是添加__composedOf__属性(类似于__proto__属性),该属性将存储参与对象创建的函数数组。像这样的东西

https://codepen.io/grebre0/pen/MXgXYP?editors=0010