Я постараюсь привести простой пример. Предположим, вы хотите сделать Animal
, и животное может иметь функциональность eat
, sleep
и make noise
. Теперь вы создаете Dog
путем расширения животных (классическая модель наследования). Dog
переопределит функцию make noise
на bark
, eat
на carnivores
и т. Д. Корова переопределит функцию make noise
на Moo
, eat
на herbivores
. Это все хорошо, но затем наступает момент, когда Mountain Dog
даже не make noise
. Мы должны выбрать функцию make noise
и поместить ее в Cow
, а для Dog
у нас есть различные функции в классах для make noise
. Это был простой пример, когда классическое наследование делает код подверженным немасштабируемости, потому что требования постоянно меняются, и именно тогда функциональное программирование приходит на помощь с шаблоном decorator
. Для приведенного выше примера, я не буду заботиться о type
животных. У меня будут разные функции для каждой функции.
function eat(type) {
//I'm carnivores, herbivores
console.log(`I'm ${type}`);
}
function makeNoise(noise){
//bark, Moo
console.log(`I ${noise}`);
}
function sleep(sleepingWay){
console.log(`I ${sleepingWay}`);
}
Now, we can define animals as by decorating empty `Animal` as:
cow = compose(eat('herbivores'), makeNoise('Moo'))(Animal)
dog = compose(eat('carnivores'), makeNoise('Bhu'), sleep('at day'))(Animal)
mountainDog = compose(eat('carnivores'), sleep('at day'))(Animal) //I don't make noise
Я не пишу реальный код. Я просто даю представление о том, почему мы должны это использовать.
Другое преимущество использования функционального программирования заключается в том, что тестирование становится очень простым, потому что вы должны тестировать отдельные функции, и, в то время как кодирование реагирует, это экономит много вашего времени и энергии. Я использую пересобрать все время и даже не использую ключевое слово class
.
Вы должны позаботиться о том, чтобы все функции были pure
, а состояние было immutable
. Надеюсь это поможет. Дайте мне знать, если вам нужно дальнейшее понимание