Участник:Rubynovich: различия между версиями

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Нет описания правки
Строка 11: Строка 11:
== Высокоуровневое программирование ==
== Высокоуровневое программирование ==
Вот некоторые принципы программирования, которых должен придерживаться высокоуровневый программист:
Вот некоторые принципы программирования, которых должен придерживаться высокоуровневый программист:
* отсутствие глобальных переменных (чем меньше переменных, тем меньше ошибок);
* отсутствие переменных (чем меньше переменных, тем меньше ошибок);
* отсутствие циклов (все циклы должны быть заменены на итераторы);
* отсутствие циклов (все циклы должны быть заменены на итераторы);
* отстутствие условных конструкций if, case и т.д. (если они есть, то вы делаете, что-то не так);
* отстутствие условных конструкций if, case и т.д. (если они есть, то вы делаете, что-то не так);
* должны выполняться правила рефакторинга (код должен "хорошо пахнуть").
* должны выполняться правила рефакторинга (код должен "хорошо пахнуть").

=== Отсутствие переменных ===
Если переменные отсутствуют, то что-то же использовать вместо них? Параметры методов/замыканий и константы. Это значит, что строка вида:
a += 5

является скорее всего ошибочной. Скорее всего суммирование можно перенести на момент присваивания начального значения. Поэтому выражение:

b = a + 5

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


=== Отсутствие условных конструкций if, case и т.д. ===
=== Отсутствие условных конструкций if, case и т.д. ===
Многие из этих принципов кажутся дикими. Например, отсутствие условных операторов. Но давайте рассмотрим несколько приемов, которые позволяют их избежать. Допустим у нас есть программа вида:
Оказывается, что условные операторы вовсе не обязательны. Давайте рассмотрим несколько приемов, которые позволяют их избежать. Допустим у нас есть программа вида:


a, b = 5, 6
a, b = 5, 6
Строка 31: Строка 42:
["a == b","a > b","a < b"]
["a == b","a > b","a < b"]


И использовать оператор '''<=>''' для получения индекса варианта. Решение для вышеуказанного примера будет выглядеть так:
и использовать оператор '''<=>''' для получения индекса варианта. Решение для вышеуказанного примера будет выглядеть так:


a, b = 5, 6
a, b = 5, 6
puts ["a == b","a > b","a < b"][ a <=> b ]
puts ["a == b","a > b","a < b"][ a <=> b ]


Естественно, что пример был выбран искусственно, но сама по себе идея достаточно интересна.
Естественно, что пример был выбран искусственно, но сама по себе идея достаточно интересна. Кстати, как написать программу, которая выводит "a == b" или "a != b"?

Версия от 18:50, 24 мая 2006

Жил был программист. И писал он на великом и могучем языке Pascal. И считал он, что программа в несколько тысяч строк -- это показатель высокого мастерства программиста. Но шло время. Поступил он в институт. Первые курсовые работы пришлось ему сдавать на Java. Все бы хорошо, но выполнять курсовые приходилось в стенах университета, т.к. программы написанные дома не работали в университете. Но объектно-ориентированная концепция ему понравилась. И решил наш программист поупражняться. Начал переписывать свои программы на Pascal под C++ (язык Java ему не понравился). И был удивлен тем фактом, что ему удалось в несколько раз сократить размер исходного кода. Но язык С++ тоже не вызывал у него уважения... он искал.

Тем временем в университете преподавали Visual Basic, Haskell, Prolog. Самостоятельно он начал изучать PHP. Но тут один из учителей предложил ему посмотреть Ruby. И тут наш программист решил попробовать... написал один курсовой, второй, третий. Причем эти курсовые занимали все меньше и меньше строчек кода. По мере того, как он постигал тонкости языка, он все сильней понимал, что писать на других языках он уже не может. Ему не хватало их гибкости, выразительности, мощности. Но он не сдавался... Он изучил Perl (был поражен регулярными выражениями), Python (понравилась идея отступов), но все равно не получал того самого удовлетворения от написания программ, которое должно охватывать программиста. И понял тут он, что поиск его завершен... и не найти ему ничего более совершенного.


Rubynovich

Rubynovich -- это прозвище дали первые студенты, своему преподавателю по предмету "Программирование на языках высокого уровня". Для демонстрации высокоуровневых алгоритмов он использовал язык Ruby, что и послужило предпосылкой для появления такого прозвища.

Rubynovich преподает предмет "Программирование на языках высокого уровня" в МЭТТ с 2003 года. За это время он сумел сформировать собственную программу обучения и свое уникальное видение сути предмета.

Высокоуровневое программирование

Вот некоторые принципы программирования, которых должен придерживаться высокоуровневый программист:

  • отсутствие переменных (чем меньше переменных, тем меньше ошибок);
  • отсутствие циклов (все циклы должны быть заменены на итераторы);
  • отстутствие условных конструкций if, case и т.д. (если они есть, то вы делаете, что-то не так);
  • должны выполняться правила рефакторинга (код должен "хорошо пахнуть").

Отсутствие переменных

Если переменные отсутствуют, то что-то же использовать вместо них? Параметры методов/замыканий и константы. Это значит, что строка вида:

a += 5

является скорее всего ошибочной. Скорее всего суммирование можно перенести на момент присваивания начального значения. Поэтому выражение:

b = a + 5

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

Отсутствие условных конструкций if, case и т.д.

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

a, b = 5, 6
if a > b
   puts "a > b"
elsif a == b
   puts "a == b"
else puts "a < b"
end

Казалось бы, все очевидно и по другому быть не может. Rubynovich же предлагает заменить результаты массивом вариантов:

["a == b","a > b","a < b"]

и использовать оператор <=> для получения индекса варианта. Решение для вышеуказанного примера будет выглядеть так:

a, b = 5, 6
puts ["a == b","a > b","a < b"][ a <=> b ]

Естественно, что пример был выбран искусственно, но сама по себе идея достаточно интересна. Кстати, как написать программу, которая выводит "a == b" или "a != b"?