2012-06-20 3 views
-1

Мне любопытно, как моя игра будет выглядеть в функциональном стиле вместо ООП.Как преобразовать ООП JavaScript в функционал

Вот основные строки кода в Node.js:

if (!player.owns(flag) && player.near(flag) && flag.isUnlocked()) { 
    player.capture(flag); 
} 

Мое предположение было, это может выглядеть следующим образом:

var canCapture = [not(owns), isNear, canUnlock].every(function(cond) { 
    return cond(playerData, flagData); 
}); 

if(canCapture) { 
    // how to capture? 
} 

Но не уверен, так как не опытный функциональный кодер. Меня интересует каждый ответ, близкий к теме (это может быть даже в другом стиле программирования).

+1

Я не уверен, где часть ООП находится в вашем коде? Или даже то, что вы понимаете под этим термином. –

+0

У вас есть экземпляр класса Player с методами: «owns», «near», «capture». У вас также есть экземпляр класса Flag с методами «isUnlocked». – Kasztan

+0

Но эти объекты все равно останутся. Поэтому они не будут преобразованы из ООП в функциональные ...Действительно ли вы на самом деле: ** Как я могу написать предикат 'All', где я мог бы предоставить массив функций/значений, и он должен возвращать' true', когда все являются «истинными»? ** –

ответ

1

Это может выглядеть примерно так:

if (!player.owns(flag) && player.near(flag) && flag.isUnlocked()) { 
    capturingPlayer = player.capture(flag); 
} 

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

Если вы предпочитаете «не-ОО» синтаксис (что бы это могло означать)

if (!owns(player, flag) && near(player, flag) && isUnlocked(flag)) { 
    capturingPlayer = capture(player, flag); 
} 

Для расширения и мы надеемся прояснить немного:

Функциональное программирование, в том смысле, используемой сообщество функционального программирования, делает не просто означает, что «функции/процедуры являются первоклассными объектами».

Что делает означает, что функции являются функциями математической смысле, т.е.

  • Все функции возвращают значение.
  • Каждая функция возвращает одно и то же значение каждый раз, когда ему передаются одни и те же аргументы.
  • Функция не имеет побочных эффектов - нет никаких изменяемых объектов или назначений.

Итак, до тех пор, пока ни один из методов вашего объекта не изменяет объект, вам действительно не нужно сильно изменять программу в «функциональном стиле».


Редактировать:

К сожалению, как "функциональный" и "объектно-ориентированный" (в частности) имеют очень плохо определены понятия.
Попробуйте найти определение «объектно-ориентированное» - существует как минимум столько определений, сколько есть людей, пытающихся его определить.
Чтобы получить представление о функциональном программировании, прочитайте Why functional programming matters от Джона Хьюза, по крайней мере, дважды.

+0

О, спасибо за разъяснения! Так значит ли это, что функциональное программирование часто является OO-программированием, ограниченным неизменяемыми объектами (в общем)? Может быть: 'if (! Player.owns (flag) && player.near (flag) && flag.isUnlocked()) {player = player.capture (флаг); } ' – Kasztan

+1

@ Kasztan: Нет, это не так. Я имел в виду, что синтаксис не является существенным, и что * возможно * писать в «функциональном стиле» с использованием точечных обозначений и неизменных «объектов». Однако это не очень распространено. – molbdnilo

Смежные вопросы