Gulp if: robrich/gulp-if: Conditionally run a task

Содержание

SavePearlHarbor

В Python ужасный ООП. Кликбейтный тезис, который имеет право на существование. Есть много языков, где ООП представлен не в самом классическом виде, ну или так принято считать. Прототипные JavaScript и Lua, Golang с прикреплением методов и прочие. Но «не такой как все» всегда ли синоним слова «неправильный»?  С чего мы вообще вязли, что ООП в Python не такой каким должен быть ООП? Что вообще является точкой отсчёта «правильности» ООП? Smalltalk или Simula 67? Вроде бы объектно-ориентированное программирование – это просто парадигма.. или уже догма?

В этом статье мы попробуем понять:

  • что не так с ООП в Python;

  • чем его ООП отличается от языков с эталонной по мнению многих реализацией ООП: Java, C# и С++;

  • почему разработчики языка Python решили сделать всё именно так.

Реализует этот текст автор YouTube-канала PyLounge Макс. Поехали!

Дисклеймер

: В этой статье я хочу высказать свои «рассуждения на тему» и подчёркиваю, что не обладаю монополией на истину. Буду рад осудить альтернативное мнение в комментариях.

Для начала необходимо понять. Чем ООП в Python отличается от классической концепции и реализации в других ЯП.

Парадигма ООП появилась ещё 60-70-х годах XX века. ООП или Объектно-ориентированное программирование — это методология программирования, которая основана представлении программы в виде набора взаимодействующих объектов, каждый из которых является экземпляром класса, а классы образуют иерархию наследования.

Ключевыми особенностями ООП является понятия:

  • абстракция; 

  • инкапсуляция; 

  • наследование; 

  • полиморфизм.

Алан Кэй, создателя языка Smalltalk, одним из «отцов-основателей» ООП, говорил, что ООП подход заключается в следующем наборе принципов:

  1. Всё является объектом.

  2. Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие.

  3. Каждый объект имеет независимую память, которая состоит из других объектов.

  4. Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки).

  5. В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.

  6. Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.

 «ООП для меня означает лишь обмен сообщениями, локальное сохранение, и защита, и скрытие состояния, и крайне позднее связывание». (c) Алан Кэй

  • Другими словами, в соответствии с идеями Алана Кэйя, самыми важными ингредиентами ООП являются следующие:

    1. Передача сообщений (то есть взаимодействие).

    2. Инкапсуляция.

    3. Динамическое связывание.

Другими словами, в соответствии с идеями Алана Кэя, самыми важными ингредиентами ООП является:

  1. Передача сообщений (то есть взаимодействие).

  2. Инкапсуляция.

  3. Динамическое связывание.

Интересно, что указывается именно термин

связывание, а терминов наследование и полиморфизм нет. Ведь полиморфизм бывает статический (ранее связывание) – это перегрузки и дженерики (шаблоны).  То есть Кэй, человек, который считается изобретателем термина «ООП» не считал важными частями ООП наследование и полиморфизм. Получается пропорции условны, а границы размыты.

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

Все остальное же было определено, когда появились объектно-ориентированные языки. Языки OO были разработаны, чтобы упростить подход к программированию. И они реализовали инструменты и функции для поддержки ООП — классы были одним из таких инструментов.

Под инкапсуляцией стали подразумевать возможность классов содержать данные и методы в себе, которые непосредственно связана с этим классом по смыслу.  При этом одни языки соотносят инкапсуляцию с сокрытием этой информации, а другие (Smalltalk, Eiffel, OCaml) различают эти понятия.

Например, в Java можно определить поле как приватное, и тогда оно будет видно только членам этого класса. Также работает и С++, однако там есть концепция друзей (friend), которые могут видеть приватные поля других классов, что сильно критикуется.

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

Полиморфизм — это возможность обработки разных типов данных, т. е. принадлежащих к разным классам, с помощью

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

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

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

В центре ООП находится понятие объекта.

 Объект — это сущность, которой можно посылать сообщения и которая может на них реагировать, используя свои данные. Объект — это экземпляр класса. Данные объекта содержатся в объекте, а не просто лежат внутри программы. Инкапсуляция включает в себя сокрытие (но им не является!).

ООП пытается сделать программное обеспечение похожим на «реальный мир», как его может понять обычный человек.

Современная идея ООП — это синтез всех их идей, а также идей Голдберга, Барбары Лисков, Дэвида Парнаса, Бертрана Мейера, Гюля Ага и других. Но никто из них не может утверждать, что же такое «ООП». Термины развиваются, как и задачи, которые изначально эти инструменты должны были решать.

А что же касаемо Python. Python полностью удовлетворяет всем перечисленным выше требования, а значит является «полностью объектно-ориентированным». ООП – просто стиль.

Однако дополнительные фишки ООП, которые стали ассоциироваться с ООП за счёт их реализации в других объектных языках, несколько отличаются тем, как они реализованы в Python.

Отсутствие модификаторов доступа

В Python отсутствует деление на публичные, защищённые, приватные свойства и методы.  Многие вещи в Python основаны на соглашениях. Сокрытие данных реализуется чисто конвенционально. За счёт соглашения использовать подчёркивание у свойств и методов (защищённые члены). Да, можно использовать двойное подчёркивание, так называемый манглинг. Чисто технически это запрещает прямой доступ к данным и равносильно модификатору приват, но это скорее придуманный адептами классического ООП «грязный хак». Таким образом, в Python нет классического разделения на группы доступа, потому что Python доверяет разработчику. В этом плане Python ближе к С++.

«Да, я знаю, что ты можешь выстрелить себе в ногу, но я верю, что ты этого не сделаешь. Ведь не даром ты столько узнал, прежде чем приступить к написанию кода». (с) Python

Мне кажется, инкапсуляция не так полезна в языке с динамической типизацией.  Выскажу непопулярное мнение – это не добавляет никакой безопасности, она просто дает ощущение безопасности. Если вы грамотный программист, то так или иначе сделаете всё как надо.

Но почему разработчики языка не добавили такой привычный «предохранитель»? Ответ кроется в философии Python. Гвидо не любит что-то скрывать. Как он выразился в одном интервью: «мы все здесь взрослые по обоюдному согласию. Python доверяет вам. Он говорит: «Эй, если хочешь чтобы ковыряться в темных местах, я надеюсь, что у тебя есть уважительная причина, и вы не создаете проблем». Этого тезиса мы ещё коснёмся ниже. Пока просто запомните.

Вообще инкапсуляция – это не совсем про сокрытие. Инкапсуляция определяется как

«процесс объединения элементов данных и функций в единое целое, называемое классом» или «отделение реализации от описания». Таким образом, номинально в Python всё соблюдается более чем верно.

Отсутствие интерфейсов

В языке Python нет как таковой конструкции как интерфейс (inteface). К слову в С++ их тоже нет. Но что в Python, что в С++, есть механизмы, позволяющие так или иначе использовать интерфейсы.  Абстрактные классы ­– это хоть и немного другое, но функционалу отвечает и допускает некоторое упрощение концепции. На мой взгляд, отсутствие интерфейсов искусственный механизм избежание неоднозначности. Вот у тебя есть абстрактные классы, вот их и используй. С помощью абстрактных классов можно сделать всё тоже что и с интерфейсами, но не надо заморачиваться. Ведь Python идёт по пути простоты и убирает всё лишнее. Создатели языка даже конструкцию switch case выкинули, дабы «место не занимала».

Множественное наследование

Многие современные языки отказываются от множественного наследования, так как оно многое усложняет. Однако Python хоть и идёт по пути упрощения, но старается выкидывать избыточность, а не функциональность, ведь любое упрощение — это потеря гибкости + см. пункт про доверие своему разработчику. Python думаю, что разработчик, который его использует достаточно умён, чтобы не плодить гигантскую иерархию и победить проблему ромба. Не доверился он разве что, при создании GIL. Но спишем это на ошибки молодости. Кстати, С++ также поддерживает множественное наследование. Так что с этим пунктом всё тоже в рамках закона.

Утиная типизация

Она, конечно, к теме относится косвенно. Но тем не менее, рядом с Python всегда всплывает понятие утиной типизации.  

Если что-то выглядит как утка, плавает как утка и крякает как утка, это наверняка и есть утка.

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

Тут во всей красе демонстрируется один из главных принципов Дзена Python«явное лучше, чем неявное». Если что-то выглядит как утка и крякает, то это утка, к чему погружаться в экзистенциальные копания и вопросы самоопределения? Будь проще и посмотри пример.

Поскольку Duck и Human это разные классы, Python повторно вызывает функцию fly_quack() для экземпляра класса Human. И хотя класс Human имеет похожие методы quack и fly , типы объектов были разными и поэтому все работает правильно и вызываются верные методы.

Константные методы

Нет способов предотвратить изменение состояния класса методами класса (константные методы), снова всё полагается на добрую волю программиста.

Вообще докопаться ещё можно много до чего. Например, не совсем стандартное описании статических методов и свойств, ключевое слово self, MRO и многое многое другое.

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

The Zen of Python

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

По мнению многих Smalltalk — самый чистый ООП язык, но что даёт и какова цена этой чистоты? Можно написать очень хороший объектно-ориентированный код как на Smalltalk, так и на Python.

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

Есть языки, которые идут по одному из двух векторов развития: доверяют разработчику, дают средства и возможности, за что он может заплатить неправильностью своих решений. И языки, которые по максимуму всё запрещают, чтобы писать было просто и топорно. Все решения давно приняты за тебя, всем известно как делать правильно, например, Golang. С такой точки зрения «Почти все «фичи» — это сахарная кола, а программирование — это толстяк с диабетом»».

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

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

Он дает вам свободный доступ к свойствам класса, даже если они должны быть частными или константными, потому что вы уже взрослый.

Это извечная дилемма: что лучше авторитарная стабильность или нестабильная свобода? Каждый человек отвечает на этот вопрос сам. Так же, как и выбирает подходящий для себя инструмент – язык программирования.

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

Проблема в том, что люди пытаются перенять подходы из других языков, а не учатся использовать уникальные сильные стороны Python. У Python довольно надежная объектная модель, но это объектная модель Python, а не C++, Java или…кого-то другого.

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

А Python просто сейчас очень популярен. Он своего рода фронтмен, а тот кто на передовой, того обычно и критикуют. И да, я понимаю, что Python стремится быть как можно более простым, как завещал Эйнштейн: «все должно быть настолько простым, насколько это возможно, но не проще». Однако иногда Python всё же попадает в это «проще» чем надо, что может выливаться в проблемы.

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

Дизайн языка потихоньку меняется. Аннотации типов, разного рода оптимизации говорят о том, что язык и сообщество взрослеют и зреют. Python со времён 2 версии уже сильно изменился и будет продолжать меняться. Как молодой бунтарь контркультуртурщик под призмой времени превращается в консерватора и прагматика, также и Python превратится просто в стабильный качественный инструмент. А на смену ему придёт новая рок-звезда, которая будет вертеть устои инженерной культуры и привлекать школьников.

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

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


Закончу мысль довольно известной фразой: «Есть всего два типа языков программирования: те, на которые люди всё время ругаются, и те, которые никто не использует».

StackBlitz | Instant Dev Environments

Оставайтесь в потоке с мгновенными возможностями разработки. Больше не нужно часами копать/извлекать/устанавливать локально — просто нажмите и начните программировать.

Загрузка новой среды за

миллисекунд.

Ежемесячно любим миллионами разработчиков


в крупнейших компаниях мира
Мгновенный опыт разработки

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

Мгновенные отчеты об ошибках

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

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

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

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

Быстрое прототипирование

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

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

«Возможность мгновенного открытия и обмена средами

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

Стивен Флуин Ведущий специалист по связям с разработчиками в Google

Bleeding Edge

Работает на WebContainers, первая операционная система на основе WebAssembly , которая загружает полных сред разработки за миллисекунд, безопасно на вкладке браузера .

А как насчет других сетевых IDE?

В отличие от StackBlitz, устаревшие онлайновые IDE работают на удаленных серверах и передают результаты обратно в ваш браузер. Такой подход дает мало преимуществ с точки зрения безопасности и почти во всех отношениях обеспечивает худший опыт по сравнению с вашей локальной машиной.

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

Устаревшие сетевые IDE
Время загрузки
Миллисекунды

Минуты
Нулевая задержка сети
Работа в автономном режиме
Легкая отладка
сломанных контейнеров
Сброс разбитых контейнеров
Обновление страницы

Невозможно

«StackBlitz — первая онлайн-среда IDE

, модель вычислений которой мне понятна.

Том Престон-Вернер основатель GitHub и инвестор в StackBlitz

Используйте сеть

для создания сети.

Полная отладка Node.js с помощью Chrome Dev Tools

Отлаживайте внутренние приложения так же легко, как и внешние, используя мощные инструменты , уже поставляемые в ваш браузер.

Запуск серверной части во внешнем интерфейсе

Если он может работать на Node.js, он может работать и в веб-контейнерах StackBlitz, включая внутренние функции и библиотеки, что означает, что вы можете запускать серверов. В вашем браузере.

Свежая и быстрая среда при загрузке каждой страницы.

Переустановить node_modules так же просто, как обновить страницу, а поскольку установка пакетов StackBlitz выполняется на несколько порядков быстрее, чем локальная, установка пакетов теперь является тривиальной задачей.

Нулевая задержка.

Работать оффлайн.

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

«Это, безусловно, лишь вопрос времени, когда локально установленные IDE

пойти по пути Walkman. »

Рич Харрис Создатель Svelte и SvelteKit

Инвестиции в будущее

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

StackBlitz открывает возможности запуска в один клик с полным стеком, работающим в браузере — это меняет правила игры. »

Илья Григорик Главный инженер Shopify

Смотрите сами.
Загрузите новую среду за миллисекунд. Create a new project

Gulp Definition & Meaning — Merriam-Webster

ˈgəlp 

transitive verb

1

: to swallow hurriedly or greedily or in one swallow

2

: to keep back as если проглотить

проглотить всхлип

3

: с готовностью проглатывать

проглотить знание

непереходный глагол

: отдышаться, как будто делая большой глоток

глоток сущ.

глоток сущ.

Синонимы

  • ремень (вниз)
  • напиток
  • жрать
  • подъемник
  • впитывать
  • отбросить назад
  • фунтов (вниз)
  • напиток
  • глоток
  • пуля (вниз)
  • чавкать
  • суп
  • глоток
  • пойло
  • toss (down или off)

Просмотреть все синонимы и антонимы в тезаурусе 

Примеры предложений

Она сказала ему не глотать его еду. Измученные гонщики лежали на земле, глотая воздуха. Измученных гонщиков было глотает воздух. Я нервно сглотнул , ​​прежде чем начать свою речь. — Это большие деньги, — проглотила она . Он проглотил слез, когда благодарил спасателей. Узнать больше

Недавние примеры в Интернете Не глотать глубокими вдохами холодного воздуха и говорить как можно меньше. Форрест Браун, CNN , ​​30 октября 2021 г. Этого достаточно, чтобы ракеты-носители USC проглотили 90 306 глотков 90 307, если Мейер взорвется на своем выступлении в НФЛ. Том Красович, 9 лет0306 Сан-Диего Юнион-Трибьюн , 13 сентября 2021 г. Хищники, рыбы, пауки, змеи и черепахи проглотят их, когда им представится шанс. Джиллиан Мок, Scientific American , 9 апреля 2021 г. Писатель Пол Салопек и фотограф Джон Стэнмейер пытались осознать один ошеломляющий факт: примерно 100 миллионов человек в Индии могут 90 306 проглотить 90 307 своих последних грунтовых вод, которые высохнут к концу года. Джон Стэнмейер, 9 лет0306 National Geographic , 17 июля 2020 г. Когда голосование заканчивается, женщина-член актерского отделения Академии, получившая анонимность, чтобы свободно говорить, делится тем, какие фильмы заслужили ее драгоценный голос (и — глоток — почему). The Hollywood Reporter , 4 февраля 2020 г. В конце концов, как и любая другая внутренняя каменистая планета в нашей Солнечной системе, Венера будет 90 306 поглощена солнцем. Дженнифер Леман, 9 лет0306 Популярная механика , 5 января 2020 г. Джин идет вторым, проглатывает огромный стакан апельсинового сока. Сара Дельгадо, Teen Vogue , ​​31 марта 2020 г. Для мамы, которая проглатывает смузи: надежный и трудолюбивый блендер Блендер, достаточно универсальный, чтобы смешивать фрукты и йогурт для коктейлей или измельчать орехи для домашнего арахисового масла, является основным продуктом на кухне. Джессика Каспарян, 9 лет0306 USA TODAY , 10 апреля 2020 г. Узнать больше

Эти примеры предложений автоматически выбираются из различных онлайн-источников новостей, чтобы отразить текущее использование слова «глоток». Мнения, выраженные в примерах, не отражают точку зрения Merriam-Webster или ее редакторов. Отправьте нам отзыв.

История слов

Этимология

Среднеанглийское, от среднеголландского или средненижненемецкого слова, родственного голландскому и фризскому gulpen бурлить, пить глубоко; сродни староанглийскому gielpan хвастаться — больше при визге

Первое известное употребление

14 век, в значении, определенном в переходном смысле 1

Путешественник во времени

Первое известное использование глоток был в 14 веке

Посмотреть другие слова из того же века прожорливость

глоток

залив

Посмотреть другие записи поблизости

Процитировать эту запись0003

«Глоток. » Словарь Merriam-Webster.com , Merriam-Webster, https://www.merriam-webster.com/dictionary/gulp. Доступ 12 ноября 2022 года.

Копия цитирования

Определение детей

ˈGəlp

1

: , чтобы глотать или жадно или на одну ласточку

2

:

глоток всхлипнуть

3

: отдышаться, как при большом глотке

глоток сущ.

глоток существительное

Больше от Merriam-Webster на

gulp

Нглиш: Перевод gulp для говорящих на испанском языке

Britannica English: Перевод gulp для говорящих на арабском языке

расширенный поиск — без рекламы!

Merriam-Webster без сокращений

опьянять

См.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *