Как я узнаю, что объект может что-то сделать - PullRequest
0 голосов
/ 28 мая 2018

Одной из парадигм функционального программирования является составление объекта, которое следует отдавать предпочтение перед наследованием классов.

При работе с объектом вам часто нужно знать, доступен ли определенный метод для объекта.В то время как класс использует подход is a, композиция объектов имеет подход can do.

С наследованием класса вы должны выполнить простую проверку obj instanceof class, чтобы удовлетворить подход is a.

Однако мой вопрос заключается в том, как сделать правильное can do?

Конечно, я могу проверить, присутствует ли что-либо на объекте с помощью if(obj.method != null), но чтоВы делаете, когда вы получаете врученные объекты, если вы не можете быть уверены, что кто-то добавил свои собственные вещи к нему (возможно, случайно добавив метод с тем же именем)?.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Я скажу это снова здесь, в моем ответе: вы спрашиваете о функциональном программировании, но все, что вы описываете, происходит от ООП.

В общем, вы не спрашиваете, какие объекты может сделать в функциональном программировании.Вместо этого у вас есть известные функции, которые способны работать с известными типами ввода и возвращать известные типы вывода.

Некоторые функции первого порядка

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

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

Абстракция данных первого порядка, число rationalmodule

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)

Я рекомендую Структура и интерпретация компьютерных программ, 2-е издание Джеральдом Джеем Суссманом и Гарольдом Абельсоном.Он научит вас, что важнее всего для функционального программирования, функции .Эта книга даст вам прочную основу для прохождения более продвинутых концепций на любом функциональном языке.

0 голосов
/ 28 мая 2018

Интересный вопрос.Простым решением было бы добавить свойство __composedOf__ (аналогично свойству __proto__), которое будет хранить массив функций, которые принимали участие в создании объекта.Как то так

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...