Найти в Дзене

Зачем нужны переменные?

Технически, компьютер может работать и без переменных, и без функций. Они нужны лишь людям, чтобы организовать и структурировать большую кодовую базу Многие программисты, которые пишут в объектно ориентированном стиле, знают, что такое классы. И я тоже знаю и успешно применяю их в работе. Но дать какое-то внятное объяснение этому не так просто. Нет, не то, что вы рассказываете на собеседовании, а вот так, чтобы понял пятилетний ребёнок. Статья на тему классов у меня уже есть, но есть ещё одна тема. Даже более фундаментальная – переменные. Итак, представьте себе плашку Kingston на 8gb. У многих такие были или есть сейчас. Что значит 8 гигабайт? Ответ простой – это 8 миллиардов байт, с каждым из которых можно работать по-отдельности. Зачем давать имена участкам памяти? Я думаю так: ресурс человеческой памяти ограничен, поэтому с ростом объема программного кода, растёт трудность работы с ним. Как минимум, в виду того, что очень много нужно помнить. Например, какой байт (участок памяти) з
Оглавление

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

Многие программисты, которые пишут в объектно ориентированном стиле, знают, что такое классы. И я тоже знаю и успешно применяю их в работе. Но дать какое-то внятное объяснение этому не так просто. Нет, не то, что вы рассказываете на собеседовании, а вот так, чтобы понял пятилетний ребёнок. Статья на тему классов у меня уже есть, но есть ещё одна тема. Даже более фундаментальная – переменные.

Итак, представьте себе плашку Kingston на 8gb. У многих такие были или есть сейчас. Что значит 8 гигабайт? Ответ простой – это 8 миллиардов байт, с каждым из которых можно работать по-отдельности.

Зачем давать имена участкам памяти?

Я думаю так: ресурс человеческой памяти ограничен, поэтому с ростом объема программного кода, растёт трудность работы с ним. Как минимум, в виду того, что очень много нужно помнить. Например, какой байт (участок памяти) за что отвечает в вашей программе. Поэтому, программисты стали давать имена участкам памяти в программе. Например, если известно, что нужно хранить имя пользователя, то нужно создать участок памяти, который будет хранить переменный объём данных (тк имена бывают разные, разное количество букв) и дать ему имя name, например. Мы сделали переменную для хранения имени!

Переменная — это именованная область оперативной памяти.

Теперь все программисты будут знать, для чего мы её сделали. Может показаться, что пример надуманный. Но в программе могут быть десятки тысяч переменных. Если не знать их имени или назначения, работать с кодом в несколько раз сложнее. Спросите реверсеров, если не верите.

Какие бывают переменные?

Так как в современных операционных системах активно используется многозадачность, нужна необходимость какого-то менеджмента этой всей памяти. Почему? В процессе работы, каждый процесс в компьютере использует оперативную память. Обычно, там хранятся данные, переодически считываться в регистры процессора. Их есть достаточно много. Кто помнит курс информатики знает, что один байт состоит из восьми битов. Но минимальная адресуемая единица в оперативная памяти – это байт. Соответсвенно, можно загружать данные по одному байту в регистры процессора и работать таким образом. Но довольно часто, приходится работать с большими объемами данных и читать байты по-одному будет очень медленно. Поэтому, можно читать из памяти за раз 2, 4, 8, 16, 32 и вплоть до 512 байт (так много читать позволяют avx регистры, если не ошибаюсь). Грубо говоря, считать из памяти 1 байт используя однобайтовый регистр по скорости займёт столько же, сколько и 4, например. Поэтому это выгодно и быстро.

Пример объявления переменной типа int
Пример объявления переменной типа int

Простейшие переменные различаются именно по такому принципу: количество места, которые они занимают в оперативной памяти. Например, наверное, самый популярный тип данных это int. Еще его называют Int, Integer. В зависимости от платформы или разрядности системы, он может занимать от двух до восьми байт. Часто, int занимает четыре байта. Четыре байта — это 4 * 8 бит, то-есть 32. Тогда можно вычислить максимальное число, которое может быть записано в переменную с типом int. Для этого, нужно возвести 2 в 32 ступень. Получается 4294967296. Это довольно много и для большинства повседневных задач хватит. Но что если вам нужно разделить 5 на 2 и получить точный результат без округления? Тогда тип int вам не подойдет. Для хранения чисел c плавающей точкой, можно использовать тип float.

Создание переменной с плавающей точкой
Создание переменной с плавающей точкой

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

Какие еще бывают переменные?

Кроме простых (числовых) значений, переменные могут содержать в себе объекты классов. Например, String это тип данных, для хранения текстовых данных. Но кроме этого, это еще и класс. В java принято называть классы всегда с большой буквы, чтобы можно было просто понять, что какой-либо тип данных является классом.

Ещё один кейс. Иногда на занятиях я говорю такую фразу: «положи результат выполнения этого метода в переменную». Что я хочу тут? Многие ученики впадают в ступор. Давайте разберемся.

Надо понимать, как работают методы и функции. Ключевой принцип таков, метод – это маленькая обособленная подпрограмма в вашем коде, которая выполняет какие-то расчёты или другую работу, для выполнения поставленной задачи. Результатом работы каждого метода является какое-то значение или данные (на самом деле, может быть много всего). То-есть смысл вызова любого метода – это получить результат его работы.

Создание переменной типа String, которая содержит объект класса String. Сложно!!
Создание переменной типа String, которая содержит объект класса String. Сложно!!

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

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

Создание объекта класса String в явном виде. Не пишите так! Это только для демонстрации
Создание объекта класса String в явном виде. Не пишите так! Это только для демонстрации

Теперь вернемся к исходной задаче: “положи результат выполнения этого метода в переменную”. Возьмем такой код:

-6

Здесь есть метод getName, который возвращает переменную с типом String.Сами по себе методы ничего не делают, поэтому, его нужно вызвать:

-7

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

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

Как этого избежать?

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

Чтобы сделать переменную правильно в этом случае, нужно определить её тип. Самый простой способ – посмотреть на сигнатуру метода.

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

Положил результат работы метода в переменную
Положил результат работы метода в переменную

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

Ссылка на оригинал статьи:
https://abritov.medium.com/зачем-нужны-переменные-e331b2cb05a1