LINUX.ORG.RU

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

 ,


1

4

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

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

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

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

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

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

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

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

Везде это где? Вот я удаленно по ssh в vim редактирую какую-то python-лапшу, которая размечена такими «комментариями». Кто будет запускать линтер? Я не буду.

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

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

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

Лучшего комментария, объясняющего почему питон-говно и не придумать :)

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

В vscode чтобы все заработало надо поставить в систему pylint, black и pyright. Это как раз и будет «автоматически». Для обезьян сложно даже погуглить рпз по ссылкам в документации они походить не могут. Я уж за прошедшим временем и запамятовал, vscode сам все эти библиотеки предлагает поставить (он их в виртуальную среду ставит) В виме оно тоже все настраивается, но там нужно больше чем по двум ссылкам пройтись и тонны манов вычитать

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

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

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

В удалённом vim без плагинов? Ну да, там ничего этого нет, это очевидно. С другой стороны, если это какая-то лапша, которая правится прямо на месте, то там и хинтов этих наверняка нет.

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

Математики еще как правило ужасные какие-то программисты

Не знаю, как это связано с моим комментарием, но вообще это нормально. Не только математики, вообще учёные. Им нужно, чтобы код работал правильно. Производительность, читаемость, простота поддержки, соответствие каким-то там кодстайлам, стандартам и прочее такое — это дело десятое.

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

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

Ага! А какими, простите, тестами? Повторю пример:

def create_key(metrics):
   """
      :type metrics: tuple(str, str, str) 
   """
   return "".join(get_metric_key(m) for m in metrics)

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

def create_instance(self):
    metrics = self.get_metrics()
    key = create_key(metrics[0]) # this is a mistake!
    instance = cache.get_instance(key)
    if instance is None:
       instance = self._create_instance()
       self.cache.set_instance(key, instance)
    return instance  

Юнит-тест для create_instance тестирует логику вызывающего кода, в этом тесте мы полагаем, что функции create_key и get_instance корректны и вообще в праве замокать кеш. Интеграционный тест тоже не выявит проблем, потому что необходимый сайд-эффект - даже если мы его протестируем - достигается, объект застревает в кеше, и при следующем вызове create_instance объект будет получен из кеша.

Итак, что вы предлагаете, уважаемый самбист?

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

В Typescript, например, бывают совершенно издевательскіе ошибкиnode_modules/path/to/type!=node_modules/another/path/to/this/type.

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

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

Юнит-тест для create_instance тестирует логику вызывающего кода

Теоретически может быть тест на кэширование экземпляра.

test_clear_cache(o.cache)
o.metrics = test_metrics
o.create_instance()
test_check(o.cache, test_metrics_key, o.create_instance())
monk ★★★★★
()
Ответ на: комментарий от lovesan

А что тут понимать? Все очень просто. Вот например, на bash сделано больше полезного чем на lisp, очевидно что из этого является мертворожденным недоязычком.

Работают ли сейчас в образе? Нет. Если бы это было удобно, то уже появилось бы в Java.

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

Везде, это где? Примеры, пожалуйста, где конкретно. В тех компаниях, где я работал и где продолжаю, к автотестам относятся крайне серьезно. Мой код тупо не пройдет ревью, если он не покрыт тестами. И никакой скрам не имеет никакого отношения к CI/CD, прям вообще от слова совсем

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

Была тут секта штангистов лет 10 назад, громко кричала, что в хаскелле если программа скомпилировалась, значит она корректно работает. Что-то про них давно ничего не слышно.

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

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

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

И типы надо именовать,

Это отлично работает, когда программа уже написана. А в процессе «попробую сделать вот так, посмотрю что получится» только добавляет писанины. Ну, всё равно что вместо x = sin(0.5) заставлять писать

arg = 0.5
x = sin(arg)

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

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

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

Ехал пайпа через пайпу, видит пайпа в пайпе пайп. Но тм еще и не нравится осознавать, что их маргинальщина никому не нужна хоть и красива. А мне печально, что рериодически приходится искать какой пакет притянул за собой rust с потрохами или хачкель.

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

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

тип - это не только структура данных, но и абстракция объекта предметной области. Условные Airport { id: integer, title: string } и TomatoSpecies { id: integer, title: string } структурно идентичны, но при попытке сунуть сорт помидора в запрос билетов компилятор таки должен спросить «а ты точно хотел именно этого»? Если да, то явно скажи об этом, кастанув помидор к аэропорту; если нет - отлично, компилятор выполнил свою задачу, предотвратив косяк в логике.

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

тут компилятор/чекер правы

Они здесь не для того, чтобы быть правы. Они здесь, чтобы помогать мне делать работу. Ну или хотя бы не мешать.

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

Да пожалуйста:

Prelude> let x = sin 0.5
Prelude> x
0.479425538604203

От отсутствия «писанины» программа не перестала быть написанной на языке с сильной статической типизацией, и всё ещё не позволяет брать синусы от json и конкатенировать результат со строкой.

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

это проблемы тайпскрипта и пейсателей на нем. В сишке вон тоже void * - обычное дело. А в жабе, к примеру, изобилия Object в целом не наблюдается.

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

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

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

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

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

ugoday ★★★★★
()

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

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

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

А в жабе, к примеру, изобилия Object в целом не наблюдается.

Зато там любят обмазываться километровыми аннотациями и программировать логику на XML.

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

идти крестовым походом на типизацию

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

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

А в процессе «попробую сделать вот так, посмотрю что получится» только добавляет писанины.

В Хаскеле пока «попробую сделать вот так» типы вообще не обязательны.

Опять же, от смены арности не помогает

Смена арности = новая функция с новым именем.

«я хочу поменять не всю функцию целиком, а только одну ветку оператора case». При этом все остальные ветки поломаются

Не понял. В разных ветках case аргумент разного типа? Опять же, кто мешает остальные ветки закомментировать?

Но хочется, чтобы её в принципе не было.

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

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

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

В этой его братья по разуму пытаются идти крестовым походом на [динамическую] типизацию, потому что она им говнокодить мешает.

Напоминает паскакальщиков которых в ярость приводил оператор =, и они доказывали, что погромисты постоянно присваивание путают с сравнением, поэтому паскакальщики на яваскрипте и похапе писали что-то типа:

if (42 == answer) {
  ...
}
rtxtxtrx ★★
()
Ответ на: комментарий от wandrien

Ну поверни

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

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

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

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

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

Говнокода везде хватает.

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

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

обмазываться километровыми аннотациями

вы так говорите, как будто это что-то плохое(с). Аннотации - годная штука.

любят … программировать логику на XML

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

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

Ну, да, чтобы понять аналогию надо Сервантеса прочитать

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

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

Ну вот ты же сам себя клоуном выставляешь. Тебя кто-то принуждает что ли? Вроде нет.

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

В Хаскеле пока «попробую сделать вот так» типы вообще не обязательны.

Большую часть времени программа пребывает в состоянии «что-то уже сделано, а что-то ещё нет». А ваши рецепты подходят к вариантам «всё (все типы заданы и прописаны) или ничего (открыли REPL и творим с чистого листа).

Смена арности = новая функция с новым именем.

А в Go я вместо repl’а могу создать новый файл main.go скопировать туда нужные функции и быстро скомпилировать.

Опять же, кто мешает остальные ветки закомментировать?

А кто мешает сразу выбрать другой язык?

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

Ну, да, но она какая-то человечная что ли. В отличие от.

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