Переменные и значения
Понятие переменной одно из основных понятий в программировании. Переменные хранят данные, с которыми работает программа. В этой связи говорят, что переменная имеет значение. Переменная всегда имеет значение, а значение всегда имеет тип. Тип переменной определяется типом значения, которое оно хранит. В одних языках тип переменной статичен, в то время как в других он может меняться в тех или иных пределах. В своих программах мы присваиваем переменным имена. В памяти компьютера переменные определяются адресами байтов.
Простая переменная
Простая переменная содержит одно простое значение: число, символ, логическое или перечислимое значение. Все всегда сводится к набору простых значений, поскольку процессоры оперируют только числами. Упомянутые символы, логические или перечислимые значения в конечном счете представляются тем или иным числом. Особняком стоит ссылка -- тоже число, но в данном случае важно не само значение ссылки, а значение, на которое она указывает.
Массив
Массив состоит из элементов одинакового типа, которые можно получить указав их индекс. Это возможно, поскольку элементы имеют одинаковый размер, что позволяет вычислить смещение элемента как произведение размера на индекс. В некоторых языках элементы массива могут быть разных типов, а, следовательно и размеров. Но в этом нет противоречия, поскольку в этом случае язык скрывает реальную организацию массива как набора ссылок на свои элементы, доступ к которым выполняется в два этапа: сначала по индексу определяется ссылка, а затем по ссылке выдается значение элемента.
Записи
Записи, как и массивы, состоят из отдельных элементов, но в данном случае нет ограничения на их тип и размер. Однако при этом приходится помнить смещение каждого элемента. Для доступа к отдельным элементам мы их именуем и используем точку указывая сложное имя состоящее из имен переменной и нужного нам элемента. Элементы в записях часто называют полями. Набор полей определяется набором атрибутов, определяющих состояние объекта.
Классы
С развитием объектно-ориентированного программирования стали доступны классы, объединившие записи, представляющие состояние объекта с процедурами изменяющими его. Процедуры в случае классов принято называть методами, поля -- свойствами, а связь методов и свойств -- инкапсуляцией.
Класс может быть наследником другого класса. Эта связь всегда задает переход от более общего, к более детальному. Если это не так, то вы ошиблись в разделении ваших объектов на классы. При правильном подходе вы всегда можете использовать частный класс вместо базового, что приводит нас к пониманию полиморфизма. В данном случае на основе иерархии классов. Мне нравиться называть это вертикальным полиморфизмом.
Интерфейсы
Интерфейс определяет набор описаний свойств и методов делегируя их реализацию классу, в котором он реализован. Таких классов может быть много и они не обязаны принадлежать одной иерархии. С другой стороны, один класс может реализовывать несколько интерфейсов. Здесь мы встречаем иной тип полиморфизма. Для отличия от вертикального я называю его горизонтальным полиморфизмом.
Обобщенные типы
Многие языки поддерживают параметризацию классов и интерфейсов. Такие классы и интерфейсы называются обобщенными. Объектов этих классов не создашь, но они являются хорошей базой для наследования и реализации. При этом в качестве аргументов используются конкретные типы и классы.
Базовые структуры данных
Простые переменные, массивы, записи и классы являются базовыми структурами данных. Все остальное многообразие можно построить комбинируя их друг с другом. До этого мы рассматривали структуры данных с точки зрения хранения. Далее мы рассмотрим их с функциональной точки зрения.
Поддающийся перечислению
Как и массив состоит из одинаковых элементов, но не дает прямого доступа к ним. Вместо этого определяет указатель на текущий элемент и операцию следующий, передвигающую указатель на следующий элемент. Как правило эта операция возвращает логическое значение, говорящее была ли она успешной. Число элементов заранее не доступно. Если захотите узнать, вам придется их все перебрать, подсчитав число.
Список
Еще один родственник массива. В случае списка отличие состоит в том, что список имеет переменный размер. Вы можете добавлять элементы в конец или внутрь списка или удалять их. Список имеет функцию для определения текущего числа элементов. Как правило, списки поддерживаю функционал перечисления и поиска элемента в нем.
Справочник
Хранит значения, доступ к которым возможен по ключу. Справочник, как и список, имеет динамический размер, но вы не можете управлять порядком элементов. Можно только добавлять, удалять, искать по ключу. Ключ должен быть уникальным в рамках справочника. Разные реализации по разному реагируют на конфликт ключей. В одних выполняется перезапись значения или возврат пустого значения, другие выдают ошибку в этом случае. Проверяйте документацию или тестируйте эти случаи.
Мир многообразен
Перечисленные структуры данных почти полностью перекрывают наши потребности в организации данных для наших программ. Однако мир многообразен и для некоторых задач были изобретены деревья, очереди, графы и прочее. Возможно вы и сами придумаете что-то новое.