Структуры данных. Не стреляй себе в ногу, вдруг пригодится

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

Я не буду говорить вообще об использовании templates, хотя на мой взгляд, «изобретателям» этого механизма надо присудить что-то вроде премии Дарвина, за успешный отстрел себе ноги (или мозгов). Templates в С++ – это средство, которое позволяет сделает программу существенно менее читаемой, менее понимаемой и менее поддерживаемой.

Но не стоит углубляться в эмоциональные оценки. Что, по сути, позволяют сделать templates применительно к структурам данных?

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

Еще раз: СТАТИЧЕСКИ независимый от размера! И это все. При исполнении программы код будет дублироваться для разных размеров. В качестве небольшой премии получаем статическую типизацию, что, не спорю, полезно.

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

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

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

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

  • На уровне вида контейнера – определить, что это – очередь, стек, дерево…
  • И на уровне содержимого контейнера – определить динамический тип содержимого контейнера или то, что контейнер является гетерогенным.

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

Впрочем, набор функций может быть «обернут» в объект, например, для того, чтобы получить некоторое обобщение – например, понятие «контейнера». Действия и свойства первичны – обертка вторична.

О том, как же сделать правильное ООП надо говорить отдельно и подробно. Некоторые признаки правильного ООП есть в таких языках, как Smalltalk, Oberon, Lua, Ruby – ну и, нельзя забывать про Forth!

Еще одна тема для отдельного разговора, которую нельзя пропустить – это статическая и динамическая типизация.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *