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

Концепции кодирования – дженерики

Что такое дженерики, и почему мы должны их использовать?. Tagged с WebDev, TypeScript, Beginters, JavaScript.

Так что это немного длинное и красивое не описательное определение, полученное из Википедии. Я был очарован дженериками какое -то время, их может быть довольно трудно понять, понимая, почему и где их следует использовать. Основная мотивация для использования дженериков заключается в том, чтобы обеспечить значимые ограничения типа между членами, генериками или параметрическим полиморфизмом, используются в большинстве языков программирования, и, хотя они могут быть труднее понять, есть 5 основных преимуществ для их использования.

Преимущества

  • Процедуры более сильных типов во время компиляции.
  • Исправление ошибок времени компиляции проще, чем исправление ошибок времени выполнения
  • Устранение актеров. Что, в свою очередь, быстрее.
  • Позволяет кодерам реализовать общие решения, которые можно использовать повторно для нескольких целей.
  • Будущее подтверждение для данных завтрашнего дня.

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

По сути, дженерики просто означают, что вы можете назначить тип классу. Отсюда и «T», мы увидим на протяжении всего этого примера.

Итак, давайте запустим простой пример TypeScript, чтобы показать, что я имею в виду.

Пример стандартного класса

Мы начнем с не Общий список и переключите его в общий список!

class Stack
{
private stack: any[];
  pushItem(item){
  this.stack.push(item);
  }
}

Этот пример выше представляет собой базовый класс, который содержит Массив называется стеком. Все может быть добавлено в этот массив! Давайте добавим строку, номер и новый объект человека.

var newStack = Stack();
var aString = "A String";
var aNumber = 100;
var aPerson = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
newStack.pushItem(aString);
newStack.pushItem(aNumber);
newStack.pushItem(aPerson);

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

В то время как с общим списком не позволит вам добавлять типы в стек, с которым он не может иметь дело.

Это на самом деле довольно просто, давайте посмотрим на пример сверху, но на этот раз давайте сделаем 2 отдельных случая нашего массива, тот, который может удерживать числа, и тот, который может удерживать строки. Во -первых, нам нужно создать общий класс.

Общий путь

class GenericStack;
{
  private stack: T[]; 
  function pushItem(item: T) { 
  this.stack.push(item); 
  }
}

Как видите, код в значительной степени идентичен нашему примеру выше! Так о чем все? Какое преимущество это приносит нам? Ну, давайте посмотрим на этот пример при инициализации этого нового класса.

var numberStack = GenericStack(); 
var stringStack = GenericStack(); 
var aString = "A String"; 
var aNumber = 100; 
var aPerson = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};

// These will pass the typescript compiler
stringStack.pushItem(aString); 
numberStack.pushItem(aNumber);

// But these would all fail.
numberStack.pushItem(aPerson);
numberStack.pushItem(aString);
stringStack.pushItem(aPerson);
stringStack.pushItem(aNumber);

Так что все это значит? По сути, мы создали только один класс, но изменили поведение его в зависимости от упомянутого типа.   По сути, это контракт между классом и типом. Да, мы могли бы только что создать 2 отдельных класса, но тогда мы будем дублировать код.

Представьте себе, что если бы мы создадили класс человека, а не просто Jobject, мы могли бы создать GeneicStack ()

Теперь это довольно тривиальный пример, но безопасность типа очень важно, особенно в JavaScript. Поскольку JavaScript не является скомпилированным языковым типовым, предлагает нам преимущества безопасности типа и предварительной компиляции, чтобы поймать такие ошибки.

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

Но разве это не ограничивает то, что вы можете делать с дженериками?

Ну, когда вы работаете с примитивными типами, такими как строки и цифры и даже массивы, вы будете знакомы с определенными доступными вам методами, такими как: .Нанизывать () или .length () или .size () или .заменять ()

Они требуют, чтобы компилятор знал тип переменных, к сожалению, при использовании дженериков это будет означать, что их нельзя использовать. Тип числа не содержит Заменить () Так что вы не сможете его использовать. И T тип Не содержит ни одного из перечисленных выше! Многие люди будут пытаться внедрить дженерики в свой код, просто чтобы сказать, что они используют их. Убедиться в том, что для них есть вариант использования. Generics вступают в игру, когда вы начинаете уходить от использования примитивных типов данных (доступны основные типы данных: числа, строка и т. Д.) И работая с пользовательскими объектами и классами.

Рефакторинг

Generics полезны при рефактории вашего кода, можете ли вы увидеть экземпляры в своем коде, где вы можете абстрагировать тип данных из структуры данных?

Если ответ да Тогда вы должны рассматривать общие дженерики!

У дженериков есть гораздо больше, и я не собираюсь пытаться объяснять все это здесь, если вы заинтересованы в прочтении больше о Generic, я связал дополнительные ресурсы ниже, которые должны нарисовать более четкую картину.

Я пропустил что -то полезное? У тебя есть что -нибудь дополнительное, чтобы добавить? Вы использовали дженерики интересным образом? Если это так, поделитесь ниже!

Спасибо за чтение.

Крис

Официальная документация по типографии – дженерики

Dzone – Понимание случаев использования дженериков

Git Books – Generics

Code.tutsplus. – Учебники- TypeScript-For-Beginners

Оригинал: “https://dev.to/designpuddle/coding-concepts—generics-34cf”