metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2013-01-09 10:14 pm
Entry tags:

reference types vs value types

Очередной раз посрались с артурегом за типизацию. Его огорчает существование value-types (или примитивных типов в жабе) из-за того, что они накладывают более жесткие ограничения на получение значений этих типов извне.
Например при загрузке из БД с полем, разрешающим null - придется либо сдыхать с исключением, либо устанавливать некое "значение-по-умолчанию", которое потом не отличишь от такого же значения, но введенного явно.
По моему - это какие-то проблемы, не то уровня начинающих, а вообще детсадовские, т.е. проблемы реально не существует.
Либо предметная область разрешает "отсутствие данных" и мы таскаем всюду Option[T] или жабьи объектные врапперы или C# Nullable<T>, либо предметная область разрешает использовать некое значение по умолчанию и нам его отличать от отсутствия данных не нужно, либо данные обязаны присутствовать и мы таскаем value-type, в базе делаем поле not null и в прочих протоколах делаем поле обязательным и дохнем с исключением (возвращаем код ошибки) при его отсутствии.
Если требования не зафиксированы заранее - пользуемся логикой и выбираем один из трех вышеописанных вариантов. Если требования в процессе разработки меняются - рефакторим. Если требования противоречивы - доводим до заинтересованных лиц и дальше либо делаем требования непротиворечивыми, либо ослабляем строгость ограничений (убираем not null и рефакторим все из value-types в reference-types или Option[T]/Nullable<T>)

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

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

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

[identity profile] artureg.livejournal.com 2013-01-10 06:39 am (UTC)(link)
чота ржу)

[identity profile] metaclass.livejournal.com 2013-01-10 07:05 am (UTC)(link)
Кстати, в скале подобного рода значения имеют свои типы - http://www.scala-lang.org/api/current/scala/Null.html
Это не странно, вместе с наследованием и совместимостью null с любыми ссылками - система типов получается весьма красивой.

[identity profile] metaclass.livejournal.com 2013-01-10 07:07 am (UTC)(link)
В вашем жабоскрипте ужас :)
В обычных языках строка является субтипом объекта, а в js?

[identity profile] artureg.livejournal.com 2013-01-10 07:11 am (UTC)(link)
ветер правильно ответил, в первом случае тайпоф вернйт стринг во втором обжект

[identity profile] veter-r-r.livejournal.com 2013-01-10 07:19 am (UTC)(link)
Значит в джаваскрипте красивая система типов? :)

[identity profile] metaclass.livejournal.com 2013-01-10 07:28 am (UTC)(link)
См. выше про строки и объекты. Зачем так жить?

[identity profile] veter-r-r.livejournal.com 2013-01-10 07:40 am (UTC)(link)
Ребе, я вам больше скажу, если взять typeof от того, что в джаваскрипте называется null, он вернет... "object"!

[identity profile] norian.livejournal.com 2013-01-10 11:06 am (UTC)(link)
статическая позволяет отловить многие ошибки при компиляции, плюс меньше оверхед на проверки совместимости типов в рантайме

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

[identity profile] metaclass.livejournal.com 2013-01-10 11:22 am (UTC)(link)
Да. Но вот товарищи в лице артурега и айседа не желают с этим соглашаться :)

[identity profile] vp.livejournal.com 2013-01-10 11:23 am (UTC)(link)
Вот когда у тебя приложения будут состоять из трех формочек ввода фамилии, имении с общим числом строк кода в 200, тогда ты их поймешь !

[identity profile] vit-r.livejournal.com 2013-01-10 11:51 am (UTC)(link)
либо устанавливать некое "значение-по-умолчанию", которое потом не отличишь от такого же значения, но введенного явно.

Эта техника называется "заметём ошибки под ковёр". Очень эффективна для создания кривого софта, когда пользователь, разделив пирог на три части, получает одну из долей в 140%. Главное, что он не знает, отчего так происходит, и проникается к программистам мистическим благоговением.

[identity profile] thinker8086.livejournal.com 2013-01-10 02:09 pm (UTC)(link)
>> Я пытаюсь особо не айседствовать

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

Ребе не айседствует, ребе культурный, да.

[identity profile] r-yankovsky.livejournal.com 2013-01-10 03:23 pm (UTC)(link)
Повышению полезности программного компонента, такого как библиотечная процедура или структура данных, способствует его разработка не в терминах конкретных типов, а в терминах требований к типам, выраженных как синтаксические и семантические свойства. ("Начала программирования". Степанов, Мак-Джоунс)

[identity profile] metaclass.livejournal.com 2013-01-10 03:39 pm (UTC)(link)
Требования к типам (а иногда и частично реализацию) можно оформить в виде трейтов/тайпклассов/интерфейсов), некоторые - в виде пре- и пост-условий.
Но для любителей отсутствия типов это вообще будет высший пилотаж и академическая наука.

[identity profile] nivanych.livejournal.com 2013-01-10 05:59 pm (UTC)(link)
Не думай о зелёной типизации!!

[identity profile] nivanych.livejournal.com 2013-01-10 06:06 pm (UTC)(link)
Так, для справки. Система типов = логика.
В большинстве используемых сейчас языков со статической типизацией, эта логика довольно примитивна и не очень выразительна.
Даже в том же хацкёле, и то, с этим туговато — научиться им выражать свою задачу довольно непросто.
Не стану спорить, стоит ли этому учиться для того же хацкеля, но факт такой —
говорить о заведомой полной ненужности типов, это показывать свою невежественность...
Есличо, я даже и не говорю так, как будто в этой невежественности есть что-то плохое — мне лично почти пофигу.

Page 3 of 3