Объектно-ориентированное программирование (ООП) Это одна из самых популярных парадигм, когда речь заходит о строительстве программного обеспечения, тем больше я узнал о JavaScript, я познакомился с Функциональное программирование (FP) , совершенно другой способ мышления. В этой статье я поделюсь с вами тем, что узнал, и я объясню вам, используя свои собственные примеры.
Пример: вы хотите построить игру, где главный герой – студент в Хогвартсе, и он изучает колдовство у своего учителя. Итак, вы создаете Студент Класс, где ваш студенческий объект сможет пройти тесты, и у вас есть еще один класс под названием Учитель , где объект учителя сможет оценить тесты.
Student .takeTest() Teacher .gradeTest()
Предполагая, что вы хотите добавить некоторые функции, такие как еда, сон и ходьба, вы получите что -то, что выглядит так
Student .takeTest() .sleep() .eat() .walk() Teacher .gradeTest() .sleep() .eat() .walk()
Проблема заключается в том, что приведенный выше код не соответствует сухому принципу, который означает (не повторяйте себя), поэтому решение состоит в том, чтобы создать родитель Класс, где мы кладем копшил, едем и ходим. Итак, мы получим что -то вроде этого:
Human
.sleep()
.eat()
.walk()
Student
.takeTest()
Teacher
.takeTest()
Проблема yaaay решила! Все счастливы. Тем не менее, через несколько месяцев, чтобы сделать вашу игру еще более захватывающей, вы решите добавить еще одного персонажа в свою игру, допустим, вы хотите добавить дракона. Это то, что вы в конечном итоге: так что у вас есть что -то вроде этого:
EvilDragon
.breathFire()
.fly()
Human
.sleep()
.eat()
.walk()
Student
.takeTest()
Teacher
.takeTest()
Хотя это здорово, вы не удовлетворены, поэтому вы решите сделать игру более реалистичной, давая своим способностям дракона, как люди, вы хотите, чтобы ваш дракон мог спать и есть, так что вы в конечном итоге получаете что -то вроде этого:
GameObject
.sleep()
.eat()
EvilDragon
.breathFire()
.fly()
Human
.walk()
Student
.takeTest()
Teacher
.takeTest()
Теперь это работает совершенно хорошо, но, предполагая, что в вашей игре учитель, после тщательного изучения колдовства, смог создать плащ, который позволил ему летать. Теперь возникает проблема: Как Вы структурируете свой проект? Вы не можете добавить способность летать в класс человека, потому что не все люди могут летать, и вы не можете заставить учителя унаследовать от класса Evildragon, потому что учитель не может дышать огнем. Существует решение для добавления функций, которые никогда не будут использоваться объектом учителя, чтобы сделать его способным летать, например, дышащий огонь. Тем не менее, это все равно, что просить банановый и получение гориллы с бананом. Итак, теперь вы попали в стену, вы не можете превратить свою игру в реальность. Конечно, вы можете повторить себя, но, поскольку вы отличный разработчик, который заботится о каждой строке кода, который он пишет, вы этого не сделаете. Не волнуйтесь, есть решение: Сочинение
С наследством вы структурируете свои занятия вокруг что они. С функциональным программированием вы структурируете свои классы на Что они делают Анкет
Предпочитая композицию по сравнению с наследством и мышлением с точки зрения того, что вещи сделать скорее, чем Что касается являются , вы освобождаете себя от хрупких и плотно связанных структур наследования.
Вот фрагмент того, как может выглядеть наш код в нашей игре, когда мы думаем с точки зрения объектов:
class Teacher{
constructor(name){
this.name = name;
}
sleep(){
setTimeout(console.log('Damn, that was a great nap'),8000);
}
}
const teacher = new Teacher(Dumbledore);
teacher.sleep();
//outputs 'Damn, that was a great nap' after 8 seconds
Когда мы пишем наш проект, используя функциональный подход, мы в конечном итоге получаем коллекцию автономных функций, каждый из них служит одной цели, которая облегчает обслуживание и облегчает отладку, поскольку мы можем предсказать результат функции. При создании объекта мы просто импортируем все необходимые функции.
//same code rewritten using factory functions
//factory functions are functions that create objects
//we will use
const sleep = () => {
return setTimeout(console.log('Damn, that was a great nap'),8000);
}
Object.assign(
)
Какой победит? Хорошо, обычно вы используете наследство, когда есть отношение Между объектами, как я, Махмуд, я человек, поэтому я унаследовал все вещи, которые есть у человека. С другой стороны, вы будете использовать композицию, например, когда объект имеет Определенная функция, например, у автомобиля будет компонент двигателя.
Тем не менее, это не совсем так, потому что, например, машина – это автомобиль, а я Махмуд, у меня есть руки, и я могу поднять вещи. Итак, на самом деле вы можете следовать любому из этих моделей. Buuuut, композицию легче отлаживать, поддерживать, все инкапсулируется, и в проекте вы можете легко добавить функции.
Оригинал: “https://dev.to/thisismahmoud/composition-over-inheritance-4fn9”