Занятие 1
Вопрос: Когда появилась Объектно- Ориентированная парадигма программирования?
Ответ: 1969 год, Smalltalk OO было признано индустрией только в первой половине 90-х (Borland) – 1969 = 21 год Вопрос: Почему столь долгий период понадобился для того, чтобы идея была принята в промышленности?
Ответ: Инерция Мышления
Все современные языки программирования – это смешение 2х семейств, 2х генеалогических деревьев: 1) Fortran и Algol 2) Lisp Fortran и Algol – это усовершенствованный ассемблер. Lisp был открыт математиком Джоном МакКарти (John McCarthy) как модель вычислений, альтернативная машине Тьюринга, и позже запрограммирован учеником МакКарти Стивом Расселом (Steve Russel) как язык программирования.
Fortran и Algol стали использоваться в промышленности и дали начало многим языкам программирования. Lisp развивался и его черты и идеи медленно проникали в языки программирования первой семьи языков.
Особенности и идеи Lisp, и то, насколько они приняты сегодня: 1) Условные конструкции. Их не было в Fortran, был лишь goto. Сегодня условные конструкции есть везде 2) Рекурсия. Сегодня рекурсия возможна практически во всех языках программирования. 3) Управление памятью (Garbage-collection). Сегодня – Java, Perl и т.д. 4) Динамическая типизация. Perl, Python 5) Функция как тип данных (first-order functions) 6) Все есть выражение. Fortran и его наследники различают между выражениями и операторами. 7) Отсутствие различия между компиляцией (compile-time) и выполнением (runtime).
Вывод: Повсеместно принятые стандарты не обязательно являются лучшими инструментами и решениями! Замечательные идеи медленно и с трудом пробивают себе дорогу.
Ruby
1. Что такое Ruby Все есть объект (как в Smalltalk, Eifell) Динамическая типизация (как Smalltalk, Perl, Lisp) Единичное наследование (Smalltalk, Java) Функции как тип данных - объект класса Proc (lambda в Lisp и других функциональных языках) Шаблоны проектирования как часть языка Мощные итераторы Открытые классы mix-ins прозрачный синтаксис (как Eifell) Совместимые с Perl регулярные выражения Интерпретируемый язык
2. Объект и метод Объект irb> 32 irb> "Hello world" irb> 5.8
Message, method, метод Объект MessageMessage Возвращаемое значение (тоже объект)
Message, method, метод irb> "Hello world".length irb> "Hello world".chop Hello world #length#length 11
Kласс объекта. Отдельный набор методов для объектов каждого отдельного класса. Имена классов - с большой буквы (константы). irb> "Hello world".length irb> 32.length #=> NameError: undefined method `length' for 32:Fixnum метод #class irb> 32.class irb> "Hello world".class irb> 5.8.class методы с параметрами, параметры - тоже объекты. irb> "Hello world".index('e') irb> "Hello world".index('x')
Арифметические операции - те же методы с параметрами: irb> 5-1 irb> 5.-(1) irb> 10*4 irb> 10.*(4)
Что такое ri Задания 1) Найти информацию в ri о классах String, Float, Fixnum 2) Найти метод класса String который бы вернул строчный объект с теми же символами в верхнем регистре, запустить этот метод на "Hello world" в irb. 3) Найти метод класса String который бы вернул строчный объект равный исходному объекту с обратным порядком символов.
3. Переменные и объекты Переменные - это не объекты, а только ссылки на объекты irb> a = hi irb> b = a irb> a = bye irb> a irb> b hi b a b bye a
Рождение нового объекта: метод #dup irb> a = hi irb> b = a.dup irb> a irb> b hi a b
Почему на #dup и #class отзываются объекты всех классов? Иерархия классов, класс Object. ObjectNumeric String ArrayFloatIntegerFixnumBignum
Изменяемые и неизменяемые объекты irb> a = 3 irb> b = 3 irb> a.id irb> b.id irb> a = 4 irb> a.id irb> b.id irb> a = Hello World irb> b = Hello World irb> a.id irb> b.id
Изменяющие и неизменяющие методы. Те методы, которые изменяют сам объект, по традиции заканчиваются на ! irb> a = "hello world" irb> a.capitalize irb> a irb> a.capitalize!
Класс TrueClass с единственным объектом true,класс FalseClass с единственным объектом false. По традиции методы возвращающие true/false заканчиваются на ? irb> a="Hello world" irb> a.empty? irb> b="" irb> b.empty? irb> a.include?("e") irb> a.include?("R")
4. Класс Array irb> aа= [2, 6, 76, "hello"] irb> a.class irb> a.length irb> a[0] irb> a[2] [] - тот же метод irb> a.[](0) irb> a.[](2) irb> a[-1]
irb> b=[] irb> b irb> b.push(45) irb> b.push(76) irb> b[5]="hello" irb> b irb> a2 = [2,6,1,98,-6] irb> a2.sort
5. Класс Hash Ассоциативные массивы, хеши (hashes) irb> ages = \ {"John"=>26, "Peter"=>36, "Alice"=>16} irb> ages.length irb> ages["John"] irb> ages.has_key?("John") irb> ages.has_key?("Jack") irb> ages["Jack"]=43 irb> ages.has_key?("Jack")
Запуск первого скрипта 2 способа - #!/usr/bin/ruby в первой строке (Unix) и ruby script.rb При первом способе скрипт необходимо сделать исполняемым следующей командой: chmod u+xсscript.rb Наберите и запустите скрипт hello.rb: puts "Hello world" puts