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

Важность интерфейсов

Интерфейсы являются важным инструментом в объекте, ориентированном на Wolrd, но есть много разработчиков, которые … помечены с Python, BestPractices, Узорами, твердыми.

Интерфейсы являются важным инструментом в ориентированном объекте Wolrd, но есть много разработчиков, которые не любят его использовать, и не видят преимущества, которые они предлагают.

Чтобы объяснить важность интерфейсов, мы будем следовать за процессом интеграции между большой компанией Smartphone под названием Fuwei и его поставщиком технологий Famsung.

Huawei – Компания Smartphone

Fuawei – одна из самых больших технологических компаний в мире, она производит смартфоны и продает их по всему миру.

Несколько лет назад совет по направлению решил вывести изготовление чипов до Famsung, чтобы позволить компании увеличить производство смартфона.

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

У Huawei есть небольшая технологическая команда, которая отвечала по созданию технологических требований продуктов, именно ОСНОВНАЯ КОМАНДА. Кроме того, чтобы обеспечить успешно интеграцию с Famsung, Fuawei создал другую команду под названием Интеграционная команда.

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

import requests

from fuawei.fuawei_chip import FuaweiChip

class Fuawei:

    def create_phone(self):
        famsung_chip_data = requests.get('http://famsung/web-service').json()
        famsung_specification_parsed = self.parse_famsung_specification(famsung_chip_data)
        return self.create_fuawei_chip(famsung_specification_parsed)

    def parse_fansung_specification(self, data):
        # Many lines to parse from fansum format to any more friendly format
        return {}

    def create_fuawei_chip(self, data) -> FuaweiChip:
        # Many lines to build from our friendly format to FuaweiChip
        return FuaweiChip()

Этот код совместно используется между основной командой, а команда интеграции.

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

Сейчас в настоящем, отношение Famsung и Fuawei неопределенно, политика из их соответствующих стран не в хороших условиях, и они запрещены работать вместе. Наконец, генеральный директор Fuawei решил взять на себя производство чипа в своих собственных фабриках.

Для того, чтобы заменить поставщику Famsung, Fuawei создает Компоненты Команда. Они решили использовать GRPC Технология как метод связи, потому что оно более эффективно.

Но команда интеграции уже использует API Famsung Read API, во многих частях продукта Refaktor весь продукт может стоить им слишком много времени.

Что может сделать команда технологии интеграции?

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

Опасность

  • Логика не изолирована
  • Слишком связан с библиотеками сторонних
  • Команды не могут работать уверенно
  • Так легко создавать ошибки

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

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

Важность интерфейсов

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

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

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

Для того, чтобы координировать обе команды, они решили создать интерфейс под названием Техпровидер с order_chip Метод, и он будет отвечать за основную команду, чтобы предотвратить ошибку в основной логике.

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

Эти изменения добавит много преимуществ компании.

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

  • Команды смогут работать без конфликтов
  • Они могут создать новую интеграцию с новым провайдером без особых усилий
  • Они не полагаются на конкретные технологии (которые могут измениться и быть устаревшими)
  • Конкретная бизнес-логика изолирована, избегая генерирующих нежелательных зависимостей.

Через несколько месяцев они достигли задания со следующим результатом.

Код

Основная команда область

from fuawei.phone import Phone
from fuawei.tech_provider import TechProvider

class Fuawei:

    def __init__(self, provider: TechProvider):
        self.provider = provider

    def create_phone(self) -> Phone:
        chip = self.provider.ask_chip()
        return Phone(chip=chip)
import abc

from fuawei.fuawei_chip import FuaweiChip

class TechProvider(abc.ABC):

    @abc.abstractmethod
    def ask_chip(self) -> FuaweiChip:
        pass

Интеграционная команда

import requests

from fuawei.fuawei_chip import FuaweiChip
from fuawei.tech_provider import TechProvider

class FamsungTechProvider(TechProvider):

    def ask_chip(self) -> FuaweiChip:
        return self._build_fuawei_chip(requests.get('http://fuawei-chips/web-service').json())

    def _build_fuawei_chip(self, data) -> FuaweiChip:
        # On these lines you would have a lot of parse work in order to extract all the necessary information to
        # build your fuawei chip

        return FuaweiChip()
import grpc

from fuawei.fuawei_chip import FuaweiChip
from fuawei.tech_provider import TechProvider

class FuaweiTechProvider(TechProvider):

    def ask_chip(self) -> FuaweiChip:
        fuawei_service = grpc.insecure_channel('fuawei/web-service')
        # Communication to the gRPC service of the Fuawei Provider
        return FuaweiChip()

Из-за того, что они знают, что этот код может помочь другим разработчикам, они решили протолкнуть весь репозиторий в Github Отказ

Вывод

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

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

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

В примере я использовал еще один принципы ООП, я бы порекомендовал проверить Твердое Принципы, если вы этого не знаете.

Ресурсы

https://github.com/juanbenitopr/fuawei

https://en.wikipedia.org/wiki/SOLID

Оригинал: “https://dev.to/juanbenitopr/the-importance-of-the-interfaces-3on8”