Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Collapse
exlends
Категории
  1. Home
  2. Categories
  3. Языки программирования
  4. TypeScript
  5. Паттерны проектирования в TypeScript

Паттерны проектирования в TypeScript

Scheduled Pinned Locked Moved TypeScript
typescriptpatternoop
2 Posts 2 Posters 134 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • kirilljsxK Offline
    kirilljsxK Offline
    kirilljsx
    js
    wrote on last edited by Jspi
    #1

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

    Начнем!

    Паттерн фабрики

    Паттерн фабрики - это способ создания объекта, на основе которого можно сформировать объекты схожего типа.

    Для примера попробуем построить фабрику погромистов, начнем с определения тип Programmer:

    type Programmer = {
      grade: string
    }
    
    class Junior implements Programmer {
      grade: 'junior'
    }
    
    class Middle implements Programmer {
      grade: 'middle'
    }
    
    class Senior implements Programmer {
      grade: 'senior'
    }
    

    В этом примере мы используем type, хотя с тем же успехом могли воспользоваться и interface.

    Теперь приступим к созданию самой фабрики:

    let Programmer = {
      create(type: 'junior' | 'middle' | 'senior'): Programmer {
        switch (type) {
          case 'junior':  retrun new Junior
          case 'midle':  retrun new Middle
          case 'Senior ':  retrun new Senior 
        }
      }
    }
    

    Важное что хочется отметить:

    • Использование объединения типов позволяет обеспечить максимальную безопасность метода .create, тем самым избегая ошибок из-за некорректного типа данных, передаваемого пользователями во время компиляции.
    • Использование type в TypeScript позволяет гарантировать, что каждый тип Programmer был учтен.

    В данном случае мы применили паттерн “объект-компаньон” для создания типа Programmer и значения Programmer с совпадающим именем, что позволяет TypeScript различать пространства имен для типов и значений. Таким образом, мы определили, что данное значение предоставляет методы, работающие с этим типом. Процесс начинается с вызова метода .create:

    Programmer.create('junior') //Junior
    

    Хуяк-хуяк - Мы здесь используем паттерн “фабрика”. Можно дополнительно настроить сигнатуру метода Programmer.create, чтобы, например, передача параметра 'junior'возвращала объект типа Junior, а 'middle' — Middle. Однако такой подход мог бы подорвать целостность абстракции, которую предлагает паттерн: пользователи не должны заботиться о том, какой именно класс им вернется, главное — что он соответствует ожидаемому интерфейсу.

    Паттерн строитель

    Едем дальше и переходим к паттерну строителю. Строитель - это некий способ отделить конструкцию объекта от его фактической реализации. Если ты пользовался когда либо JQuery (Лучше него ничего еще не придумал) или структуру ES6 Map или Set, то этот стиль API должен быть знаком почти каждому:

    new RequestBuilder()
      .setURL('/users')
      .setMethod('get')
      .setData({firstName: 'Lox'})
      .send()
    

    И как же мы реализуем это очече спросишь ты ? - ИЗИ, начнем все с читенького класса:

    class RequestBuilder {}
    

    Для начала добавим .setURL

    class RequestBuilder {
      private url: string | null = null
      
      setURL(url: string): this {
        this.url = url
        return this
      }
    }
    

    Смотрим что у нас тут происходит:

    • Первое - отслеживаем URL, установленный юзером в переменной приватного экземпляра url, которую мы инициализируем с null.
    • Возвращаем setURL который будет типом this, который является конкретным экземпляром RequestBuilder, в котором пользователь вызвал setURL.

    А теперь добавим другие методы:

    class RequestBuilder {
      private data: object | null = null
      private method: 'get' | 'post' | null = null
      private url: string | null = null
    
      setMethod(method: 'get' | 'post'): this {
        this.method = method
        return this
      }
    
      setData(data: object): this {
        this.data = data
        return this
      }
     
      setURL(url: string): this {
        this.url = url
        return this
      }
    
      send() {
        // ... крутим вертим
      }
    }
    

    Ну и в принципе все )))))))))

    А вообще традиционный паттерн строитель небезопасен, потому что - мы можем вызвать .send до того, как установим метод, урл или другие данные тем самым вызвав исключение в среде выполнения.

    На этом про паттерны на TS все, обнял, поднял, поцеловал ❤

    ManulM 1 Reply Last reply
    😊
    0
    • kirilljsxK kirilljsx

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

      Начнем!

      Паттерн фабрики

      Паттерн фабрики - это способ создания объекта, на основе которого можно сформировать объекты схожего типа.

      Для примера попробуем построить фабрику погромистов, начнем с определения тип Programmer:

      type Programmer = {
        grade: string
      }
      
      class Junior implements Programmer {
        grade: 'junior'
      }
      
      class Middle implements Programmer {
        grade: 'middle'
      }
      
      class Senior implements Programmer {
        grade: 'senior'
      }
      

      В этом примере мы используем type, хотя с тем же успехом могли воспользоваться и interface.

      Теперь приступим к созданию самой фабрики:

      let Programmer = {
        create(type: 'junior' | 'middle' | 'senior'): Programmer {
          switch (type) {
            case 'junior':  retrun new Junior
            case 'midle':  retrun new Middle
            case 'Senior ':  retrun new Senior 
          }
        }
      }
      

      Важное что хочется отметить:

      • Использование объединения типов позволяет обеспечить максимальную безопасность метода .create, тем самым избегая ошибок из-за некорректного типа данных, передаваемого пользователями во время компиляции.
      • Использование type в TypeScript позволяет гарантировать, что каждый тип Programmer был учтен.

      В данном случае мы применили паттерн “объект-компаньон” для создания типа Programmer и значения Programmer с совпадающим именем, что позволяет TypeScript различать пространства имен для типов и значений. Таким образом, мы определили, что данное значение предоставляет методы, работающие с этим типом. Процесс начинается с вызова метода .create:

      Programmer.create('junior') //Junior
      

      Хуяк-хуяк - Мы здесь используем паттерн “фабрика”. Можно дополнительно настроить сигнатуру метода Programmer.create, чтобы, например, передача параметра 'junior'возвращала объект типа Junior, а 'middle' — Middle. Однако такой подход мог бы подорвать целостность абстракции, которую предлагает паттерн: пользователи не должны заботиться о том, какой именно класс им вернется, главное — что он соответствует ожидаемому интерфейсу.

      Паттерн строитель

      Едем дальше и переходим к паттерну строителю. Строитель - это некий способ отделить конструкцию объекта от его фактической реализации. Если ты пользовался когда либо JQuery (Лучше него ничего еще не придумал) или структуру ES6 Map или Set, то этот стиль API должен быть знаком почти каждому:

      new RequestBuilder()
        .setURL('/users')
        .setMethod('get')
        .setData({firstName: 'Lox'})
        .send()
      

      И как же мы реализуем это очече спросишь ты ? - ИЗИ, начнем все с читенького класса:

      class RequestBuilder {}
      

      Для начала добавим .setURL

      class RequestBuilder {
        private url: string | null = null
        
        setURL(url: string): this {
          this.url = url
          return this
        }
      }
      

      Смотрим что у нас тут происходит:

      • Первое - отслеживаем URL, установленный юзером в переменной приватного экземпляра url, которую мы инициализируем с null.
      • Возвращаем setURL который будет типом this, который является конкретным экземпляром RequestBuilder, в котором пользователь вызвал setURL.

      А теперь добавим другие методы:

      class RequestBuilder {
        private data: object | null = null
        private method: 'get' | 'post' | null = null
        private url: string | null = null
      
        setMethod(method: 'get' | 'post'): this {
          this.method = method
          return this
        }
      
        setData(data: object): this {
          this.data = data
          return this
        }
       
        setURL(url: string): this {
          this.url = url
          return this
        }
      
        send() {
          // ... крутим вертим
        }
      }
      

      Ну и в принципе все )))))))))

      А вообще традиционный паттерн строитель небезопасен, потому что - мы можем вызвать .send до того, как установим метод, урл или другие данные тем самым вызвав исключение в среде выполнения.

      На этом про паттерны на TS все, обнял, поднял, поцеловал ❤

      ManulM Offline
      ManulM Offline
      Manul
      wrote on last edited by
      #2

      Пользователь @kirilljs написал в Паттерны проектирования в TypeScript:

      .setData({firstName: ‘Lox’})

      Кек

      1 Reply Last reply
      0

      Категории

      • Главная
      • Новости
      • Фронтенд
      • Бекенд
      • Языки программирования

      Контакты

      • Сотрудничество
      • info@exlends.com
      • Наш чат
      • Наш ТГ канал

      © 2024 - 2025 ExLends, Inc. Все права защищены.

      Политика конфиденциальности
      • Login

      • Don't have an account? Register

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups