Статьи

Руководство для начинающих по приведению типов: типы данных

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

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

Если вы точно знаете, о чем я говорю, то статьи этой серии, вероятно, не для вас; однако, если вы только начинаете заниматься программированием или только начинаете использовать новый язык, который динамически типизирован (или слабо типизирован), то есть ряд вещей, на которые стоит обратить внимание при работе с типами данных.

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

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

Вообще говоря, вы скорее всего найдете строго типизированные языки в семействе языков программирования, которые компилируются. Это включает в себя такие языки, как C и C ++.

Однако есть и исключения.

Есть некоторые языки, которые скомпилированы в некоторую форму байт-кода или некоторый тип промежуточного языка, а затем обрабатываются интерпретатором. Ява является одним из таких языков. Эти языки строго типизированы. Они также составлены. Но они не обязательно скомпилированы в двоичные исполняемые файлы, а в виде байт-кода, который интерпретируется сторонним программным обеспечением.

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

Например:

1
2
3
4
string example = «The quick brown fox jumps over the lazy dog.»;
int number = 42;
double cash = 99.99;
boolean exists = true;

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public string getGreeting() {
    return «Hello world!»;
}
 
public boolean isAlive() {
    return true;
}
 
public void doSomething() {
 
    for ( int i = 0; i < 10; i++ ) {
        // Perform something
    }
     
}

Обратите внимание, что в приведенном выше примере функция final имеет тип возврата void . Это означает, что функция ничего не возвращает. Когда мы начнем смотреть на динамические языки, мы увидим, как это отличается.

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

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

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

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

Дело в том, что переменные, определенные в динамически типизированных языках, могут ссылаться на различные типы данных в ходе выполнения программы.

Например:

1
2
3
4
5
6
var example;
 
example = «The quick brown fox jumps over the lazy dog.»;
example = 42;
example = 99.99;
example = true;

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
function getGreeting() {
    return «Hello world!»;
}
 
function isAlive() {
    return true;
}
 
function doSomething() {
 
    for ( var i = 0; i < 10; i++ ) {
        // Perform something
    }
     
}

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

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

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

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

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

А пока, пожалуйста, добавьте все комментарии, вопросы и общие отзывы в канал ниже!