LINUX.ORG.RU

Зачем нужна статическая типизация?, или Вы всё врете!

 ,


1

4

В теме "Питонячьи радости " на последних страницах между мной и @rtxtxtrx внезапно разгорелся спор, из которого я понял, что есть еще люди, которые не считают динамическую типизацию (в том виде, в котором она представлена в Питоне, а именно строгая динамическая типизация) серьезным недостатком при работе с большим объемом кода, особенно при рефакторинге. Вообще изначально разговор завязался вокруг назначения type hints введенных в Питон 3: я утверждал, что они нужны для создания семантических связей в коде, которые будут препятствовать внесению деструктивных изменений в код в результате опечатки или иной ошибки кодера (изменил код, в результате которого какое-либо выражение получило некорректное значение, которое тем не менее обладает схожим с корректным значением типовым контрактом, поэтому при запуске код не «упадет» сразу, указав на проблему); оппонент заявил, что они нужны для (само)документации и не более того.
Но потом выяснилось, что и царь-то ненастоящий (читай, статическая типизация). Не нужна она, просто именуй сущности понятно и уповай на строгую типизацию. А если типизация не строгая, то сами виноваты, у нас в Питоне всё ОК.
Поскольку тема большая и вкусная, я предлагаю всем обсудить этот очень важный вопрос в меру скромных сил и познаний каждого желающего. Обсуждение вторичных вопросов, как-то «статическая типизация нужна для генерации эффективного кода», «при динамической типизации тип только один, object» etc. не предусмотрено — спорим только о том, дает ли статическая типизация выигрыш, если надо перекраивать несметные тыщи kloc. Если есть вообще о чем спорить 😅.

★★★★★

Ответ на: комментарий от wandrien

был язык CLU - ща его принято относить к ООП - но тогда не было хайпа ООП

хайп ООП был современником массового проникновения GUI в офисы

ваще ООП в компилируемом языке с прикручиванием разделения «живой» сущности ака объект на прототип-шаблон-ака-КЛАСС_с набором методов общих для всех объектов этого класса - где обьект это набор данных отличающих один объект одного класса от другого объекта этого же класса своим адресом либо ещё каким хэндлом в глобальной таблице - это прекрасный пример разных идей скрещенных с нуждой реализации в компилируемость(иначе очень очень медленно)

а что такое компилируемость как не сверхранее разЫменование ибо всё равно одно и тоже

ну и вот....

qulinxao3
()
Ответ на: комментарий от alysnix

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

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

alysnix ★★★
()

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

самый распространенный вариант - имплементация интерфейса.

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

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

olelookoe ★★★
()
Ответ на: комментарий от olelookoe

дык совместимость по интерфейсам ужо в Адке было

ещё до хайпа ООП

ООП было купленно одноточечными менеджерами ибо позволяло экономить(т.е тратить только на новое) на разработке путём повторного использования через наследование

qulinxao3
()
Ответ на: комментарий от alysnix

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

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

wandrien ★★
()
Ответ на: комментарий от olelookoe

Типы описывают сущности, а контракты отношения между сущностями?

тип это разновидность контракта

Всё, что ты написал, это всё касается сущности «сложновыдуманнный int». А ты попробуй описать треугольник, как три отрезка, у которых попарно есть по одному общему концу. Как это отобразить в системе типов?

Virtuos86 ★★★★★
() автор топика
Ответ на: комментарий от qulinxao3

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

alysnix ★★★
()
Ответ на: комментарий от wandrien

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

эти концепции взаимно протекающие

и в зависимости где проходит линия разделения что мы всё таки заинкапсулировали и того что доступно всё таки через наследование - и получается весь спектр вариантов ООП

по факту ООП ещё явней структурного программирования показал к чему приводит религиозность масс в деле обучения программированию

qulinxao3
()
Ответ на: комментарий от Virtuos86

треугольник это выпуклый многоугольник с тремя вершинами. я пятиугольник - с пятью. и все правила выпуклых многоугольников распространяются на все мыслимые тругольники и прочие угольники.

alysnix ★★★
()
Ответ на: комментарий от wandrien

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

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

wandrien ★★
()
Ответ на: комментарий от alysnix

компитятор это деталь реализации как общность методов у классического(скорее ветви С++) варианта реализации объектов через «хэндл типа» и сразу же прикручивание виртуальных таблиц для перегрузки - всё это обусловлено дорогой(относительно) памятью и требованием быть компилируемым

ООП не обязано быть компилируемым

а вот реализация и рассказывание некритически мыслящими(если такое вообще не оксюморон) ООП в обязательной сцепке с компиляцией и создаёт тот вполне религиозный фанатизм:

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

qulinxao3
()
Ответ на: комментарий от qulinxao3

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

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

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

alysnix ★★★
()
Ответ на: комментарий от wandrien

отличное соломенное чучело

чел который неадекват причислят к противникам «единственно верного учения»

тем самым показывать что среди сторонников «единственно верного учения» неадекваты другие

qulinxao3
()
Ответ на: комментарий от alysnix

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

я пятиугольник - с пятью.

хорошо, я запомню

Virtuos86 ★★★★★
() автор топика
Ответ на: комментарий от alysnix

да блина сама оппозиция класс vs объект есть мелочь реализации распухшая до ....

сори за кривую цитату:

Мир(да и многие его части в отдельности) как правило не описываються односортными алгебрами

qulinxao3
()
Ответ на: комментарий от Virtuos86

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

а потом читать лекции о вреде треугольников.

alysnix ★★★
()
Ответ на: комментарий от alysnix

Так разговор не о треугольниках, что ж ты не поймешь-то никак, мне капслоком написать, что ли?

Virtuos86 ★★★★★
() автор топика
Ответ на: комментарий от alysnix

у Алана Кея эталонное объяснение ООП через клетки - он по первости биолух

появление классов в ООП это симулянт Страус

qulinxao3
()
Ответ на: комментарий от Virtuos86

мое хорошее настроение перебивает все ваши капслоки. и не надо мне его портить

alysnix ★★★
()
Ответ на: комментарий от qulinxao3

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

Virtuos86 ★★★★★
() автор топика
Ответ на: комментарий от Virtuos86

хз

факт того что плюсы как инструмент вполне

а вот массовый хайп ООП (как и хайп структурного программированияТМ) - это реально симптомы специфичности того общества в которых такие хайпы как возможны так и хронически случаются

как в том анеке

Дити сол и мол с мягким а тарелька и вилька без. этого не понят это нада просто запомнить

qulinxao3
()
Ответ на: комментарий от wandrien

преамбула: https://habr.com/ru/companies/vk/articles/411307/

кода : https://www.joelonsoftware.com/2005/12/29/the-perils-of-javaschools-2/

правильные питонисты в курсах какие части следуют погрузить в си/rust|mojo

java это кровавый Ынтерпрайс с public void class main etc

qulinxao3
()
Ответ на: комментарий от Virtuos86

А ты попробуй описать

ты сначала попробуй описать нахрена оно тебе надо )

а то понапривыкали программировать своих коней сферических в рассуждательном вакууме

olelookoe ★★★
()
Ответ на: комментарий от qulinxao3

https://www.joelonsoftware.com/2005/12/29/the-perils-of-javaschools-2/

2005-й. Ох как неинклюзивненько.

Попробовал бы он опубликовать такое в 2023-м, сожрали бы на месте.

А Питон - это «новая Java». Разница только в том, что Java действительно простая как кирпич. А «простой» Питон швыряет этот кирпич вам в лицо.

wandrien ★★
()
Ответ на: комментарий от arkhnchul

Вон из профессии тогда.

  1. Если так людьми разбрасываться, то некому работать будет.
  2. Подход «а вы не ошибайтесь», конечно, хороший, но вообще-то инструмент должен помогать, а не служить дополнительным препятствием.
ugoday ★★★★★
()
Ответ на: комментарий от ugoday

вообще-то инструмент должен помогать, а не служить дополнительным препятствием.

Именно. Статически типизированный язык помогает рефакторить код и вносить изменения в архитектуру. Вот прямо как в данном примере про селёдку.

Чем мне поможет питон? Стек-трейсами?

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от olelookoe

А ты попробуй описать

ты сначала попробуй описать нахрена оно тебе надо )

а то понапривыкали программировать своих коней сферических в рассуждательном вакууме

Подожду более благодарного собеседника, если Вы не против 😊, которому объяснять не придется.

Virtuos86 ★★★★★
() автор топика
Ответ на: комментарий от wandrien

Питон тем и хорош

что на н>м можно отличить

в отличии от Жабы изначальной которая не могла (ща может) быть использована для классификации пациентов

qulinxao3
()
Ответ на: комментарий от qulinxao3

На питоне ща массово пишут еще более хелло-ворлдный мрак без архитектуры, чем на Жаве. Благодаря «хэшмап-ориентированному программированию», которое на Жаве было затруднёно из-за статической природы языка.

А вот при попытке писать на Питоне качественный и надежный код, ты получаешь в лицо кирпич.

Так что отличить благодаря Питону программистов действительно можно:

Грамотный программист никогда при прочих равных не возьмёт для реализации крупного проекта Питон.

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

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 3)
Ответ на: комментарий от olelookoe

Всё же приведенный Вами пример скорее не о типах данных, а о семантике полей.

Forum0888
()
Ответ на: комментарий от ugoday

Если так людьми разбрасываться, то некому работать будет.

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

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

и где в описанном случае ошибка или препятствие?

arkhnchul ★★
()
Ответ на: комментарий от olelookoe

тип это разновидность контракта

Простые контракты можно заменить типом. Чуть посложнее «sort возвращает упорядоченный массив из тех же элементов, что пришли на вход», уже нужны зависимые типы и что-то вроде Agda или Liquid Haskell. Ещё чуть сложнее «f : функция от вещественного числа x, которая возвращает функцию от вещественного числа, возвращающую числа не меньше x». Такое вроде как типами уже никак не выразить.

monk ★★★★★
()
Ответ на: комментарий от wandrien

вы не знаете?

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

Упреждая ваши следующие вопросы отвечу:

  1. Выделяйте в системах независимые части и позволяйте им обмениваться через интерфейсы.

  2. У ООП, естественно, нет монополии на этот подход, а уж статическая типизация тут и вовсе не при делах.

ugoday ★★★★★
()
Ответ на: комментарий от wandrien

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

Ты не веришь в нашу Тумбу-Юмбу!

Борьба с ООП сильно напоминает борьбу с

лысенковщиной. Хотя на самом деле с ООП никто не борется. Просто мода прошла и сейчас применяют другие подходы. Вы немножко отстали от жизни, но это ничего. Некоторые вообще до сих пор на Коболе пишут с Фортраном и отлично себя чувствуют.

ugoday ★★★★★
()
Ответ на: комментарий от Virtuos86

ладно, вторая попытка )

Как это отобразить в системе типов?

нет никаких «типов», есть «контракты».

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

центральный момент - контракт, а не «ООП», «процедурное, структурное, функциональное, какое-еще-там программирование».

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

Контрактно Ориентированное Программирование - вот к чему все пришло, просто это (пока еще) громко и отчетливо не произнесено вслух.

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

olelookoe ★★★
()
Ответ на: комментарий от ugoday

И опять вместо того, чтобы просто спросить, вы предпочли сделать неявное предположение, что собеседник — необразованный идиот

У вас что-то где-то болит - это не мои проблемы.

Упреждая ваши следующие вопросы отвечу:

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

ООП это практическая реализация такой методологии.

Говорить «мы за всё хорошее против всего плохого» - это НЕ методология.

wandrien ★★
()
Ответ на: комментарий от ugoday

Ты не веришь в нашу Тумбу-Юмбу!

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

Следующим шагом будет утверждение, что программирование это не индустрия, а искусство?

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

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

wandrien ★★
()
Ответ на: комментарий от qulinxao3

а вот массовый хайп ООП (как и хайп структурного программированияТМ) - это реально симптомы специфичности того общества в которых такие хайпы как возможны так и хронически случаются

Всё же нужно сделать скидку на возраст. Раннерелигиозные общества то джихад устроят, то крестовый поход в ответ замутят. А старые — ко всему относятся спокойно: можно так, а можно и эдак, а можно и вообще никак. Программирование — новая специальность, нужно, чтобы все основательно перебесились и приобрели определённый иммунитет.

ugoday ★★★★★
()
Ответ на: комментарий от wandrien

Именно. Статически типизированный язык помогает рефакторить код и вносить изменения в архитектуру. Вот прямо как в данном примере про селёдку.

- Ты, я слышал, машину купил? Ну, как?
- Отлично. Сегодня с утра съездил за запчастями, потом заправился, потом - в гараж договориться о покраске, потом в ГАИ... Представляешь, как бы я все это успел без машины?
ugoday ★★★★★
()
Ответ на: комментарий от monk

«sort возвращает упорядоченный массив из тех же элементов, что пришли на вход»

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

Такое вроде как типами уже никак не выразить.

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

olelookoe ★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)