Понятие типа, как и, собственно, переменной и ее значения актуально для любого языка программирования, системы управления базами данных, программируемых оболочек, и применяются в различных системных службах и сервисах. Многие разработчики приложений и веб-ресурсов вводят свои описатели для типов переменных. Представления о базовых типах актуальны, позволяют избежать ошибок и построить эффективный алгоритм.
Естественные информационные элементы
В мире реальной информации нет переменных, но существуют, образно говоря, описания объектов. Что понимать под объектом, часто зависит не от его описания, а от ситуации, в которой произошла «концентрация» информации и появился ее потребитель.
Школьная тетрадка в руках ученика – это место, в которое можно поместить различную информацию. При этом в тетрадку поместятся не только числа, строки, рисунки, но и интеллектуальный уровень хозяина, просочится информация об его увлечениях, грамотности, настроении, возможно, станет известно, кто его родители и где он учится.
- для продавца – это стоимость, количество и учет продаж;
- для покупателя – это качество бумаги, изготовитель и возможности: для математики или для письма.
Математики оперируют формулами. Особого значения функции и типы переменных не имеют, но подразумеваются. Комплексное число никогда не бывает целым или дробным – оно бывает только комплексным. Его две части – это совсем другое. Бесконечно малая величина или величина, стремящаяся к бесконечности, – тоже абстракции естественного типа.
Любая бухгалтерская или управленческая задача в естественном мире ставится предельно четко и понимается как постановщиком, так и исполнителем. Вопрос, что уровень понимания может различаться – деталь. Задача есть, и как ее поставить - вопрос не сложный. Но вот как запрограммировать задачу? Тут действительно есть над чем подумать.
Формализация данных: «Паскаль»
Программирование сегодня – это по-прежнему жесткие конструкции. Во многих современных языках совершенно не обязательно описывать типы переменных, а если и описать, то можно всегда автоматом преобразовать их в другой тип.
Когда программирование только формировалось как область обработки информации, считалось правильным обратное: каждая переменная должна быть описана заранее, и менять ее тип было никак нельзя.
Как описание, так и обработка данных – это требование предельной точности и никакой неопределенности. Профессиональные и популярные языки имели кроме очевидных вариантов представления естественных данных, вымышленные, но удобные для обработки.
Например, «Паскаль» предлагал:
- byte – целое (0..255);
- boolean – логическое (по сути, фикция, но размером в 1 байт);
- word – целое (0..65535);
- integer – целое число (-32768..32767);
- real, single, double - вещественное число;
- char - символ и др.
Кроме того, программист мог использовать перечислимые, интервальные и структурные типы переменных.
Собственно понятно, что byte и boolean – это абстракции формального мира, в естественном применении их нет: логические выражения можно обозначить сотней способов, и это делали задолго до появления компьютеров, а отличать byte от integer – излишество.
Формализация данных: С/С++
Разработчики С/С++ пошли значительно дальше. Здесь не только вариантов описания одного типа integer ровно столько, сколько в «Паскале» всего описаний, но и операции с указателями (адресами на переменные) гораздо сложнее.
Синтаксис конструкций описаний и обработки, выделение кода и описаний в разные файлы – все это говорит о том, что начальный этап в программировании был поглощен решением задачи: максимально точно формализовать предметную область.
По описаниям: тип, значения, переменная. По каждой конструкции обработки, например, циклов было ровно столько, сколько есть вариантов проверки условия выхода. Операторы условий (if) и ветвления (switch/case) были жестко определены.
В конечном счете все это привело к кардинально разным противоположностям:
- C# - одна идея: точно описано, правильно исполнено;
- JavaScript & PHP (и им подобные) – вторая идея: «полная» свобода описаний.
Обе идеи прекрасно уживаются в современном динамичном мире и имеют достаточное количество благодарных разработчиков.
Байты, слова и указатели
Типы переменных с самого начала делились на вымышленные и реальные. Программирование, как самоуверенный ребенок, с самого рождения думало сначала о себе и о том, как все обустроить. Как помочь человеку решать его задачи – это всегда было на втором плане.
Описатели byte & boolean – близнецы братья. Очень выгодно при кодировании работать с байтами. Причем есть шикарные операции сдвига влево и вправо, а байт состоит из восьми бит. Это очень практичные описания типов данных. Переменные могли свободно управлять ветвлениями, циклами, счетчиками.
Перемещение единички по позициям в байте – очень востребованный метод управления исполнением кода.
Указатели – это первая реальная возможность сделать код динамичным. Это призрачная динамика: посредством указателя можно было перемещаться по переменным, не обращая внимания на их описанный тип.
Можно сказать, что период жесткой формализации позволил понять, что и как хотят сделать разработчики С#, чего и зачем добиваются сторонники JavaScript & PHP.
Базы данных: запрос – это строка символов
Любая база данных это конструкция описаний запросов. По сути, это не переменная, но логика вещей – это строка символов. Система управления базами данных предлагает набор востребованных типов и все что осталось от прошлых реализаций.
В любой базе данных есть:
- целое число;
- вещественное число;
- логический тип;
- строка фиксированная;
- строка переменная.
К этому джентльменскому набору добавляется, как правило, все, что было сделано в конкретной СУБД с момента ее создания.
Самый востребованный тип – строка, но самое неприемлемое в этом типе переменной – длина. На современном этапе программирования объем строки не имеет значения, то есть требование соблюдать фиксированную длину ограничивает программиста и создает прецеденты для ошибок.
Базы данных: запрос - это смысл и совокупность типов
Если рассматривать запрос (на PHP), то в некотором смысле это переменная целого типа. Когда запрос уходит на исполнение он дает целочисленное значение, по которому можно получить выборку или результат операции.
В некоторых реализациях запрос выдает логическое значение. В большинстве случаев результаты запроса получаются совершенно иными механизмами.
- $cQuery = "delete from `ex_owners`"
- $cMySQL = mysqli_query($this->iConnectId, $cQuery)
Первая строка – это текст запроса, вторая исполнение запроса. Какое значение получит переменная $cMySQL, или какой будет у нее тип - мало интересно.
- $cQuery = "create table if not exists sc_bees_1990 (";
- $cQuery .= " oj_owner char (20), "; // код владельца
- $cQuery .= " oj_code char (20), "; // код экземпляра
- $cQuery .= " oj_name char (244), "; // имя объекта
- $cQuery .= " oj_line int (3), "; // номер строки объекта или 0
- $cQuery .= " oj_store varchar (18000),"; // тело объекта
- $cQuery .= " oj_status char (200)) "; // статус,
- $cMySQL = mysqli_query($this->iConnectId, $cQuery);
Это более практичный запрос – создание таблицы. Но здесь также не интересно ни значение, ни тип $cMySQL.
В строке запроса указан важный смысл: создание таблицы определенной структуры и указаны типы переменных, то есть типы полей. Любая ошибка в этом описании приведет к созданию неправильной таблицы.
В данном случае (на PHP), совершенно не важно, как и когда была описана переменная $cQuery, но крайне важно описание типов внутри нее. PHP очень тесно связан с базой данных MySQL, и посредством запросов могут создаваться таблицы просто как списки переменных, потом удаляться или читаться.
Так что где, что и как описал программист – это вопрос алгоритма и решаемой задачи.
Кодировка строк
Современное программирование вынуждено считаться со всеми естественными языками и использовать все кодировки, которые удовлетворяют обычные требования локализации.
Как текст кода программы может быть записан в конкретной кодировке, так и строка базы данных может быть закодирована иначе. Правильно определить тип переменной, важно не только с этой точки зрения. Как правило, не типизированные предоставляют программисту возможность создавать переменные на лету.
Например, идет заполнение товаром интернет-магазина. Бухгалтер может ошибиться, или программист может предусмотреть переход из одного режима ввода в другой по изменению типа переменной. Закончился ввод цен, и пришла команда на ввод изображений товара, но ввод осуществлялся в одном поле на стороне клиента.
Обработчик JavaScript в браузере работает в одной кодировке, механизм AJAX имеет свои ограничения, декодирование на стороне сервера может привести к интерпретации числа строкой, а строки числом. В любом случае, прежде чем сдавать код в промышленную эксплуатацию, важно очень внимательно отнестись к кодировке. Это не тип переменной, но это крайне важно.
Идеальная переменная
Современный мир программирования многообразен, но удивительно стабильно развивается. Интересен путь С# и идея JavaScript & PHP. Со всей определенностью нельзя сказать, что самая удобная и эффективная переменная – это последовательность информации, но строки импонируют многим, а используют их все.
Такой же, как и речь (человек говорит и его понимают), должна быть и строка – она пришла и ее прочитали.
Что делать, есть проблемы кодировки и пока строка – это только символы и коды. Но быть может завтра будет строка – звук или видео. От современных технологий можно ждать неожиданностей.