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

Компьютерная программа

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

Компьютерный код — это специальный текст, состоящий из набора пошаговых инструкций. Он не всегда содержит в себе нули и единицы, также в нём есть определённые слова и дополнительные символы. Компьютер считывает код, который сообщает ему, какие операции следует выполнить с данными. Вы знакомы с Twitter? Представьте, что Twitter — одна большая квартира, в которой расположены миллионы компьютеров, хранящих ваши твиты и вашу дату рождения (день рождения), как и твиты и даты рождения миллионов других пользователей.

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

Если инструкции хорошо продуманы, то всё будет относительно хорошо работать. Почему относительно? Разработчикам часто приходится искать и исправлять баги (ошибки) в проектах, даже несмотря на то, что они рабочие. Ведь баг может превратиться в крупную уязвимость.

ASP.Net Core Разработчик

Junior Projects, от 70 000 до 130 000 ₽

tproger.ru

Вакансии на tproger.ru

Если в инструкциях будет какой-либо недочёт, например, опечатка или неправильное толкование данных, то приложение будет работать нестабильно или не будет запускаться вообще, показывая сообщение об ошибке.
Помните, не так сложно писать код, как уметь терпеть и принимать все неудачи и провалы, с которыми вам, несомненно, придётся столкнуться. Можете взять пример в плане терпения с программистов из Индии: их код не всегда хорош, но их оптимизму могут позавидовать многие новички, которые разочаровались в себе.

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

Придумывайте правильные имена

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

Название переменной должно иметь ясный и понятный смысл, говорить о том, какие данные в ней хранятся.

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

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

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

Несколько хороших правил:

  • Используйте легко читаемые имена, такие как или .
  • Избегайте использования аббревиатур или коротких имён, таких как , , , за исключением тех случаев, когда вы точно знаете, что так нужно.
  • Делайте имена максимально описательными и лаконичными. Примеры плохих имён: и . Такие имена ничего не говорят. Их можно использовать только в том случае, если из контекста кода очевидно, какие данные хранит переменная.
  • Договоритесь с вашей командой об используемых терминах. Если посетитель сайта называется «user», тогда мы должны называть связанные с ним переменные или , а не, к примеру, или .

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

Повторно использовать или создавать новую переменную?

И последняя заметка. Есть ленивые программисты, которые вместо объявления новых переменных повторно используют существующие.

В результате их переменные похожи на коробки, в которые люди бросают разные предметы, не меняя на них этикетки. Что сейчас находится внутри коробки? Кто знает? Нам необходимо подойти поближе и проверить.

Такие программисты немного экономят на объявлении переменных, но теряют в десять раз больше при отладке.

Дополнительная переменная – это добро, а не зло.

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

Виды переменных в языке C#

Перед тем, как мы приступим к знакомству с основными типами данных в языке C# необходимо узнать изучить еще один вопрос – виды переменных. На самом деле их всего два:

Ссылочные – хранятся в куче (сложные типы и классы)

Значимые – хранятся в стеке (базовые примитивные типы)

Мы не будем подробно останавливаться на этой теме, но общая идея следующая:

Условно в компьютере существует два вида памяти для работы приложения:

Стек (Stack) – быстрая память, но сильно ограниченная по размеру

Куча (Heap) – память, ограниченная только размером оперативки, но при этом значительно более медленная, чем стек.

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

Переменные

Один из самых раздражающих видов переменных — это такие переменные, что дают ложное представление о природе данных, которые они хранят. Эдакие переменные-мошенники.

В среде Python-разработчиков крайне популярна библиотека , и если вы когда-либо искали что-то связанное с , то наверняка натыкались на подобный код:

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

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

Давайте рассмотрим еще один пример, но теперь из Django:

Когда вы видите где-то в коде , то вы совершенно справедливо ожидаете, что сможете сделать так:

Но нет, вы этого сделать не можете, так как возвращает , а далеко не :

Если вам очень важно указывать суффикс, то укажите хотя бы такой, который соответствует действительности:

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

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

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

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

Еще одним видом раздражающих переменных являются переменные с сокращенными именами.

Вернемся к и рассмотрим этот код:

Это яркий пример совершенно неоправданного сокращения названия переменной. Это ужасная практика, и ее ужасы становятся еще более очевидны, когда такой код занимает больше 10-15 строк кода.

Конкретно в случае скрипя зубами можно простить подобное сокращение, когда код занимает не более 5-10 строк и записывается вот так:

Тут контекстный менеджер позволяет дополнительно выделить объемлющий блок для переменной .

Но гораздо лучше написать как есть, а именно:

или

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

Рассмотрим еще один пример:

Вы видите и можете захотеть сделать так:

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

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

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

или даже так, что более идиоматично:

А что с заглавными буквами?

В про­грам­ми­ро­ва­нии есть два под­хо­да к оформ­ле­нию функ­ций и пере­мен­ных: camelCase и snake_case.

В camelCase пере­мен­ные из несколь­ких слов соеди­ня­ют­ся без про­бе­ла, все новые сло­ва пишут­ся с заглав­ной: getMoney, renderToFrame, removeFromBase и т. д. Этот под­ход реко­мен­ду­ет­ся в JavaScript. Обра­ти­те вни­ма­ние: назва­ния пере­мен­ных и функ­ций в JavaScript чув­стви­тель­ны к заглав­ным, то есть пере­мен­ные getmoney и getMoney — это раз­ные пере­мен­ные.

Snake_case — это когда сло­ва скле­и­ва­ют­ся ниж­ним под­чер­ки­ва­ни­ем. Это чаще исполь­зу­ют в клас­сах CSS. При­ме­ры: header_marginal, form_success.

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

Настраиваемые определения переменных

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

Следующие ключевые слова могут оказаться полезными в ваших проектах по разработке прошивок:

  • : Как вы могли догадаться, это говорит компилятору интерпретировать переменную как значение без знака, а не как значение со знаком. Я определяю большинство переменных как беззнаковые, потому что мне редко нужны отрицательные числа.
  • : Классификатор типа указывает компилятору, что значение переменной не должно изменяться. Как я уже упоминал в начале статьи, иногда значение «переменной» в C не является переменной. Если вы допустите ошибку в своем коде и попытаетесь изменить значение переменной , компилятор выдаст ошибку.
  • : Сложные компиляторы не просто берут исходный код и напрямую переводят его в собранную прошивку. Они также пытаются заставить код работать более эффективно, и этот процесс называется «оптимизацией». Однако время от времени это может испортить ваш день, потому что компилятор оптимизирует только на основе кода и не может учитывать аппаратные события, которые взаимодействуют с вашим кодом. Когда переменная имеет спецификатор типа , компилятор знает, что он должен быть осторожен с оптимизациями, которые связаны с этой переменной.
    Прерывание может привести к изменению значения переменной так, как этого не ожидает компилятор, и это может привести к проблемной оптимизации
  • типы памяти, такие как , и : Эти ключевые слова заставляют компилятор размещать переменную в определенной части памяти микропроцессора. Тип памяти особенно удобен: ресурсы оперативной памяти RAM часто гораздо более ограничены, чем энергонезависимая память программы, а тип памяти позволяет использовать дополнительную память программы для хранения данных, которые используются в вашей программе, но никогда не изменяются.

Вот некоторые примеры:

Практическая работа

  1. Переменной var_int присвойте значение 10, var_float — значение 8.4, var_str — «No».

  2. Значение, хранимое в переменной var_int, увеличьте в 3.5 раза. Полученный результат свяжите с переменной var_big.

  3. Измените значение, хранимое в переменной var_float, уменьшив его на единицу, результат свяжите с той же переменной.

  4. Разделите var_int на var_float, а затем var_big на var_float. Результат данных выражений не привязывайте ни к каким переменным.

  5. Измените значение переменной var_str на «NoNoYesYesYes». При формировании нового значения используйте операции конкатенации (+) и повторения строки (*).

  6. Выведите значения всех переменных.

Практическая работа

Выполни приведённую ниже последовательность действий, чтобы создать проект, демонстрирующий верховую езду Самата:​​1. Разработай спрайты, необходимые для выполнения проекта.​2. Выбери фоном проекта рисунок жайляу. Можно скопировать рисунок жайляу из интернета или нарисовать его самостоя­тельно (рис. 4).3. На фоне размести спрайт мальчика на коне (рис.5). Для того чтобы верховая езда мальчика выглядела естественной, убедительной, необходимо в спрайте 1-2 раза сменить костюм с помощью использования цикла (1-2 рисунка с изображением движения).​4. Разработай скрипт программы для создания спрайта. Создай скрипт так, чтобы при нажатии на зелёный флаг, Самат проскакал на коне пять раз.​

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

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

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

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

Рис. 7. 

Пояснение к скриптам проекта

Скрипты

Пояснение

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

Определяет начальное значение переменных: счёт = 0 и останов = 1.

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

Цикл перемещает коня с всадником шагом 10, пока значение переменной останов не станет равным нолю.

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

Если мальчик на коне доскачет до края экрана и поскачет обратно, то значение переменной счёт увеличивается на единицу: счёт = счёт + 1.

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

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

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

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

1. После 1-го цикла

a=  b=   c= 

2. После 2-го цикла

a=  b=  c= 

3. После 1-го цикла

a=  b=  c= 

Басқа іс-әрекеттер

  • Сілтемені көшіру
  • Қате туралы хабарлау

Классификация

Статическая и динамическая типизация переменных

Основные статьи: Статическая типизация, Динамическая типизация

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

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

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

Статические и динамические переменные

См. также: Класс памяти

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

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

Локальные и глобальные переменные. Области видимости

Основные статьи: Локальная переменная, Глобальная переменная, Область видимости

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

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

Простые и сложные переменные

По наличию внутренней структуры, переменные могут быть простыми или сложными (составными).

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

Самыми характерными примерами сложных типов являются массив (все элементы однотипные) и запись (элементы могут иметь разный тип).

Следует подчеркнуть относительность такого деления: для разных программ одна и та же переменная может иметь разную структуру.

Например, компилятор различает в переменной вещественного типа 4 поля: знаки мантиссы и порядка, плюс их значения, но для программиста, компилирующего свою программу, вещественная переменная — единая ячейка памяти, хранящая вещественное число.

Математические операции в C++

В С++ есть пять базовых математических операций:

  1. Сложение (+).
  2. Вычитание (-).
  3. Умножение (*).
  4. Деление (/).
  5. Остаток от деления (%).

Используются они следующим образом:

Важно! Сначала выполняется правая часть выражения после знака =, а потом левая. То есть переменной не будет присвоено значения, пока не выполнены все вычисления

Поэтому можно записать в переменную результат вычислений, в которых использовалась эта же переменная:

Если вам нужно провести какую-то операцию с переменной, а потом записать значение в неё же, используйте следующие операторы:

Во время работы с С++ вы будете часто прибавлять или отнимать единицу от какой-нибудь переменной. Для этого тоже есть сокращённая запись:

Инкремент и декремент могут быть префиксными (++x) и постфиксными (x++). Префиксный инкремент сначала прибавляет к переменной единицу, а потом использует эту переменную, а постфиксный — наоборот.

Переменные в аппаратном обеспечении

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

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

Как называть переменные и функции, чтобы вас уважали бывалые программистыВ итоге все ваши тщательно определенные, грамотно названные переменные на C заканчиваются битами в памяти (или в регистрах)

Язык C не ограничивает размер переменной до 8 бит, даже когда вы работаете с 8-разрядным процессором. Это означает, что одна переменная в вашей прошивке может соответствовать нескольким регистрам или ячейкам памяти в аппаратном обеспечении. «Ручное» управление многобайтовыми переменными (т.е. через язык ассемблера) не является моей забавой, но компиляторы не возражают против этого, и они выполняют свою работу очень хорошо.

Типы переменных в языке C#

Начнем со знакомства с наиболее часто используемыми типами данных (большинство их них значимые):

Имя Класс Описание Пример
int Int32 Целое число со знаком -2147483648, -1, 0, 1, 2147483647
double Double Число с плавающей запятой -12.34, -1.1, 0, 1, 53.6123123
char Char Символ ‘a’, ‘b’, ‘1’, ‘+’, ‘\t’, ‘_’
bool Boolean Логическое значение true, false
decimal Decimal Число с фиксированной запятой -123.2M, -1, 0, 1.10M
string String Строка (ссылочный тип) “hello”, “a”, “11”, “+++”, “”
object Object Базовый класс (ссылочный тип) Вообще все в C#

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

Имя Класс Описание Пример
sbyte SByte Маленькое целое число со знаком -128, -1, 0, 1, 127
byte Byte Маленькое целое число без знака 0, 1, 255
uint UInt32 Целое число без знака 0, 1, 4294967295
long Int64 Большое целое число со знаком -9223372036854775808, -1, 0, 1, 9223372036854775807
ulong UInt64 Большое беззнаковое целое число 0, 1, 18446744073709551615
float Single Маленькое число с плавающей запятой -1.1F, 0, 1.001F

Надеюсь, ты заметил, что для типов float и decimal при дробном числе добавляется специальная литера (F и M соответственно). Это связано с тем, что по умолчанию в C# дробные числа хранятся в типе double, а это необходимо для того, чтобы компилятор правильно воспринимал эти числа. Для целых значений это не обязательно.

Операции в программировании

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

Так в математике и программировании символ плюса является оператором операции сложения по отношению к числам. В случае строк этот же оператор выполняет операцию конкатенации, т. е. соединения.

>>> 10.25 + 98.36
108.61
>>> 'Hello' + 'World'
'HelloWorld'

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

>>> 1 + 'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 
'int' and 'str'

Здесь в строке интерпретатор сообщает, что произошла ошибка типа – неподдерживаемый операнд для типов int и str.