Você já deve ter ouvido falar da chamada programação "funcional". Talvez você esteja pensando que deveria tentar de alguma forma.
Em nenhum caso, faça isso!

A programação funcional é cheia de falhas, não é adequada para projetos reais. Sua aplicação levará a uma queda acentuada na produtividade do trabalho. Por que isso é assim? Vamos descobrir.
▍ →
Parte 2A programação funcional não pode atender aos requisitos corporativos multifacetados
Para criar software de classe empresarial real, é necessário um conjunto complexo de requisitos rígidos e vinculativos relacionados ao número esperado de abstrações incorporadas na solução de software. A programação orientada a objetos permite que o desenvolvedor use muitos mecanismos de abstração, capazes de satisfazer totalmente os requisitos das organizações para sistemas de software.Eu acredito que o texto acima não parece particularmente claro. Mas muito em breve tudo se encaixará.
A chamada programação "funcional" não possui um mecanismo normal para criar abstrações. O fato é que é baseado em regras matemáticas (essas regras, que é bastante compreensível, não encontram aplicação no mundo real, localizado fora dos muros das instituições de ensino). Diferentemente da OOP, a programação funcional não tenta atender a todos os inúmeros, difíceis e complexos requisitos de software que as organizações fazem.
O seguinte trecho de código demonstra os problemas que são comuns onde a programação funcional é usada:
import { filter, first, get } from 'lodash/fp';
const filterByType = type =>
filter( x => x.type === type );
const fruits = [
{ type: 'apple', price: 1.99 },
{ type: 'orange', price: 2.99 },
{ type: 'grape', price: 44.95 }
];
const getFruitPrice = type => fruits =>
fruits
|> filterByType(type)
|> first
|> get('price');
const getApplePrice = getFruitPrice('apple');
console.log('apple price', getApplePrice(fruits));
, , !
, .
! - , , , . , , , .
, , , .
, . , , . , , :
class Fruit {
constructor(type, price) {
this.type = type;
this.price = price;
}
}
class AbstractFruitFactory {
make(type, price) {
return new Fruit(type, price);
}
}
class AppleFactory extends AbstractFruitFactory {
make(price) {
return super.make("apple", price);
}
}
class OrangeFactory extends AbstractFruitFactory {
make(price) {
return super.make("orange", price);
}
}
class GrapeFactory extends AbstractFruitFactory {
make(price) {
return super.make("grape", price);
}
}
class FruitRepository {
constructor() {
this.fruitList = [];
}
locate(strategy) {
return strategy.locate(this.fruitList);
}
put(fruit) {
this.fruitList.push(fruit);
}
}
class FruitLocationStrategy {
constructor(fruitType) {
this.fruitType = fruitType;
}
locate(list) {
return list.find(x => x.type === this.fruitType);
}
}
class FruitPriceLocator {
constructor(fruitRepository, locationStrategy) {
this.fruitRepository = fruitRepository;
this.locationStrategy = locationStrategy;
}
locatePrice() {
return this.fruitRepository.locate(this.locationStrategy).price;
}
}
const appleFactory = new AppleFactory();
const orangeFactory = new OrangeFactory();
const grapeFactory = new GrapeFactory();
const fruitRepository = new FruitRepository();
fruitRepository.put(appleFactory.make(1.99));
fruitRepository.put(orangeFactory.make(2.99));
fruitRepository.put(grapeFactory.make(44.95));
const appleLocationStrategy = new FruitLocationStrategy("apple");
const applePriceLocator = new FruitPriceLocator(
fruitRepository,
appleLocationStrategy
);
const applePrice = applePriceLocator.locatePrice();
console.log("apple", applePrice);
, . — .
. - , .
. , , .
, , . , -.
-, , .
, .
, «» . , . , , . , .
. :
// :
// calculator.js:
const isValidInput = text => true;
const btnAddClick = (aText, bText) => {
if (!isValidInput(aText) || !isValidInput(bText)) {
return;
}
}
// :
// inputValidator.js:
export const isValidInput = text => true;
// calculator.js:
import { isValidInput } from './inputValidator';
const btnAddClick = (aText, bText, _isValidInput = isValidInput) => {
if (!_isValidInput(aText) || !_isValidInput(bText)) {
return;
}
}
— , . , ? — ?
- :
// :
public class CalculatorForm {
private string aText, bText;
private bool IsValidInput(string text) => true;
private void btnAddClick(object sender, EventArgs e) {
if ( !IsValidInput(bText) || !IsValidInput(aText) ) {
return;
}
}
}
// :
public class CalculatorForm {
private string aText, bText;
private readonly IInputValidator _inputValidator;
public CalculatorForm(IInputValidator inputValidator) {
_inputValidator = inputValidator;
}
private void btnAddClick(object sender, EventArgs e) {
if ( !_inputValidator.IsValidInput(bText)
|| !_inputValidator.IsValidInput(aText) ) {
return;
}
}
}
public interface IInputValidator {
bool IsValidInput(string text);
}
public class InputValidator : IInputValidator {
public bool IsValidInput(string text) => true;
}
public class InputValidatorFactory {
public IInputValidator CreateInputValidator() => new InputValidator();
}
! , 22. . , , , .
«» - , . — .
- (, , ).
- :
class CountryUserSelectionStrategy {
constructor(country) {
this.country = country;
}
isMatch(user) {
return user.country === this.country;
}
}
class UserSelector {
constructor(repository, userSelectionStrategy) {
this.repository = repository;
this.userSelectionStrategy = userSelectionStrategy;
}
selectUser() {
let user = null;
for (const u in users) {
if ( this.userSelectionStrategy.isMatch(u) ) {
user = u;
break;
}
}
return user;
}
}
const userRepository = new UserRepository();
const userInitializer = new UserInitializer();
userInitializer.initialize(userRepository);
const americanSelectionStrategy = new CountryUserSelectionStrategy('USA');
const americanUserSelector = new UserSelector(userRepository, americanSelectionStrategy);
const american = americanUserSelector.selectUser();
console.log('American', american);
for (const u in users)
. - , . , , .
, , , , , -. , , «» :
SELECT * FROM Users WHERE Country=’USA’;
, SQL-, - . SQL? - ? , . — , .
- — . «» . , , , .
. , . , , . . ( ) . , - ,
garfield.fishHead
— , . , ,
garfield.swim()
()
garfield.layCaviar()
(). ,
! , , . , , !
. , . — .
, , . , , . «». , - . , . —
.eat(veggies)
, ,
.doHomework()
, . — . , , ? , !
, , .
Manager
. , , , , , , « Netflix ».
, , ? , , .
- , , ,
Factory
. , , —
MonaLisaFactory
,
WallFactory
.
, — «» , . , .
, , , .
, , , . .
-, - , , . ( «») . 30 , . - .
— Domain-Driven Design, , . , Resharper, - — .
20-30 . , , 30 , . - . - , , . ?
? , . JavaScript. . , . ? .
…
! ?
