Рубрики
Без рубрики

Является ли JS Язык ООП?

JS поддерживает как ООП, так и функциональные стили программирования Резюме Эта статья не превозносит oop t … Tagged с помощью TypeScript, JavaScript.

JS поддерживает как ООП, так и функциональные стили программирования

Резюме

Эта статья не превышает ООП, чтобы быть лучше, чем стили функционального программирования. Оно делает; Тем не менее, покажите, как быстро OOP может пойти не так, если одно простое правило не соблюдается при разговоре о наследовании. Это также показывает, как ООП и функциональные стили могут сосуществовать.

Затем он обсуждает композицию; который, позволяет получить полиморфные признаки, используя свойства.

Наконец, в нем обсуждается принцип единственной ответственности, где встречаются ООП и функциональные стили. На этом слое нет никакой разницы в двух стилях, потому что в любом случае, хороший OOP наносится в функциональных стилях.

Синтаксис JS OOP является точным 1 То же, что и C#, C ++ и Java

Поскольку ES6, JavaScript OOP Syntax является точно таким же синтаксисом, как C ++, Java и C#. Я знаю, что это может удивить некоторых людей JavaScript, особенно тех, у кого более 4 лет.

1 JavaScript не имеет типов, поэтому синтаксис OOP является точно такой же шаблоном (минус типы). Для TypeScript это тот же синтаксис.

Шаблон JavaScript для наследования

  class Parent extends BaseClass

Шаблон C#

  class Parent:BaseClass

Класс JavaScript

class Person{
  lastName;
  firstName;
}
// typescript equivalent with type checking
class Person{
  lastName:string;
  firstName:string;
}

ПРИМЕЧАНИЕ. Точно так же поведение, что и выше, возможно с использованием только функций в JavaScript. Фактически, после сборки класса, он наверняка как функция. 2 -я статья в этой серии будет охватывать это.

Оба класса примера человека имеют свойство и первое имен. Мы используем их так:

let thom = new Person();
thom.firstName = 'Thomas';
thom.lastName = 'Edison';

Новое требование Нам нужен класс сотрудников, у сотрудников будет только удостоверение личности. Сотрудники – это люди Что означает, что мы можем использовать наследование.

Класс JavaScript наследует базовый класс

// works only because employee
// strictly (is-a) a person
class Employee extends Person{
 empId;
}
...

let emp = new Employee();
emp.empId = 1;
emp.firstName = 'Joseph';
emp.lastName = 'Edison';

Эй, подождите минуту, где это сделал EMP Получить свойства и фамилию? Ответ: от расширения человека.

Эта концепция известна как подклассия. Вот огромный секрет добиться успеха с подклассионным или тем, что мы называем «классическим наследством»

Никогда не подкладывает и не пытайтесь подкласс что-то, что не имеет строгих «это» отношения . Например; Автомобиль имеет шины, но машина-это не шина, или шина-машина! Класс шин никогда не должен быть подкладом автомобиля Анкет

Это кардинальное правило, которое не может быть нарушено, и, вероятно, является корнем многих реализации ООП.

Подкласс

Правильный подкласс означает, что подкласс ‘-это что-то из родительского класса. Сотрудник-это человек. Так что для работы сотрудника можно расширить класс человека. Суб классификация всегда носит вертикальный характер, если увидеть на графике объектов.

Композиция В отличие от подкласса, существует еще один способ неотъемлемых внутренних типов JavaScript, а также наших собственных сложных типов. Композиция-это отношения «есть». У машины есть шины, или у автомобиля есть двигатель. Свойства или параметры выполняют композицию.

// with no constructor, 
// this is a model
class Car{
 // properties are compositional
 // they are has-a relationships
 tires;
 engine;
}
// with a constructor taking parms.
class Car{
 constructor(tires,engine){

   // this.engine and this.tires
   // are implicitly defined in ES6

   this.engine = engine;
   this.tires = tires;

   // in traditional OOP 
   // this is the same syntax
   // to implement data-hiding
 }
}

// compose the car like this
let ford = new Car("GoodYear MX100", "EcoBoost 8");
// or compose like this:
let ford = new Car();
ford.tires = "GoodYear MX100";
ford.engine = "EcoBoost 8";

// It's safe to say that class or function
// properties are compositional

Автомобили имеют шины, автомобили имеют двигатели. Автомобили Составлен свойств. Любое свойство класса или функции является композицией. Это обладает этими свойствами.

Теперь мы понимаем «классическое наследование» как вертикальное по своей природе, где подкласс расширяют свойства и функции родителя.

Композиция показывает график объекта Has-A Summents ‘горизонтально’ Мы могли бы назвать это «горизонтальным наследством». Объекты могут содержать (как в свойстве) или разрешено принять параметр, который будет содержал или используется Анкет

В следующий раз, когда вы услышите «благоприятный состав над наследством», это просто означает предпочтение «HAS-A» реализации. Свойства и параметры с простыми или сложными типами достигают этого.

Что это не значит, так это то, что подклассия в любом случае-что-то, чего следует избегать. Когда подкласс действительно IS-A Часть его родительского класса работает просто отлично.

Единственная ответственность

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

Это немного отличается от C#, Java или C ++, где интерфейс Filltire может находиться в классе шин. Это связано с тем, что функции (методы) должны существовать в классе.

Причина, по которой мы не делаем этого в JS, заключается в том, что функции являются первоклассными гражданами. Они равны классу в иерархии JavaScript. Функции не должны содержаться в классе.

В JavaScript функция Filltire будет содержаться в модуле Tire.js.

ООП и функциональные стили встречаются

Вот где функциональное программирование и ООП встречаются, принцип единственной ответственности (SRP).

Но, но, но Класс – это просто синтаксический сахар для производственной функции времени выполнения. Правда, но кого это волнует, как это делает компилятор времени? Увольнение концепций ООП, потому что «мы только функциональные программисты, а ООП никогда не нуждались»-это немного наивен и старая школа.

Не поймите меня неправильно, функция в жизни больше, чем синтаксис метода C#, Java или C ++ из-за его истинного первоклассного гражданства. Если все сделано правильно, функция является самой мощной конструкцией в JavaScript.

Использование классовых конструкций является работоспособным решением, когда это сделано правильно. Подкаптация в порядке, но только с истинными отношениями. Композиция предназначена для «has-a», и функции предназначены для единой ответственности в качестве основного направления. Функции могут содержать несколько функций, но только после того, как мы сначала создали наши функции SRP.

Архитектура OOP в C ++ на 11 лет старше изобретения JavaScript. Многое было изучено за 25 лет. Все это применимо к JavaScript, но только если приведенные выше понятия полностью понятны.

Оригинал: “https://dev.to/jwp/is-js-an-oop-language-512f”