Это может выглядеть примерно так:
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 от Джона Хьюза, по крайней мере, дважды.
Я не уверен, где часть ООП находится в вашем коде? Или даже то, что вы понимаете под этим термином. –
У вас есть экземпляр класса Player с методами: «owns», «near», «capture». У вас также есть экземпляр класса Flag с методами «isUnlocked». – Kasztan
Но эти объекты все равно останутся. Поэтому они не будут преобразованы из ООП в функциональные ...Действительно ли вы на самом деле: ** Как я могу написать предикат 'All', где я мог бы предоставить массив функций/значений, и он должен возвращать' true', когда все являются «истинными»? ** –