Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемrema44.ru
1 Объектно-ориентированное программирование Смолток. Лекция 3 Карпов В.Э.
2 ООП Смолток2 Циклические конструкции Циклы – тоже почти все «самодельные»
3 ООП Смолток3 Цикл While whileTrue (покаИстина), whileFalse (покаЛожь) whileTrue: BLOCK "Выполняет заданный блок до тех пор, пока приемник не будет иметь значение 'ложь'. Выдает нуль" self value ifTrue: [BLOCK value. self whileTrue: BLOCK ]. ^nil! whileFalse: BLOCK "Выполняет заданный блок до тех пор, пока приемник не будет иметь значение 'истина'. Выдает нуль" self value ifFalse: [BLOCK value. self whileFalse: BLOCK ]. ^nil! Пример программы, копирующей файл SOURCE.TXT в файл DEST.TXT: | ввод вывод | ввод:= Файл полноеИмя: 'SOURCE.TXT'. вывод:=Файл полноеИмя: 'DEST.TXT'. [ввод вКонце] whileFalse: [ вывод поместитьСледующий: ввод следующий ]. ввод закрыть. вывод закрыть.
4 ООП Смолток4 Простой цикл timesRepeat: Block | n | n := self. [n > 0] whileTrue: [n := n - 1. Block value] Пример: 3 timesRepeat: [ Черепашка переместитьНа: 100; повернутьНа: 120 ]
5 ООП Смолток5 Арифметический цикл to:limit by:step do:block self
6 ООП Смолток6 Создание новых объектов Чтобы создать объект, классу посылается сообщение о создании нового экземпляра. Класс создает экземпляр, инициализирует и выдает созданный экземпляр в качестве ответа на сообщение. Пример 1: x := Array new: 10. Для того чтобы обратиться к нужному методу экземпляра класса, необходимо, чтобы уже существовал экземпляр класса. Пример 2: ДемоКласс запустить. компилятор выдает ошибку, т.к. здесь сообщение посылается классу, а в протоколе сообщений класса такого метода нет. Метод 'запустить' находится в протоколе сообщений экземпляра класса. Поэтому необходимо сначала создать экземпляр класса: ДемоКласс новыйЭкземпляр запустить. Пример 3: |c| c:= BouncingBallView new. c show. BouncingBallView show
7 ООП Смолток7 ПРОГРАММИРОВАНИЕ Этапы разработки программы 1. Разработка спецификации метода (предварительная постановка задачи): Что будет являться объектом - адресатом? Что будет являться объектом - параметром? Что будет являться результатом? 2. Создается новый класс объектов, необходимых для решения задачи некоторой прикладной области (анализ предметной области). определяется место класса в иерархии прикладных классов (определяется его суперкласс и возможные подклассы). 3. Для каждого класса определяется протокол сообщений и внутренняя структура экземпляров. 4. Алгоритм решения задачи записывается на языке взаимодействия объектов (проектирование прикладной системы): объекты порождаются, инициализируются, обмениваются сообщениями с другими объектами в целях получения результата решения задачи. 5. Новые классы реализуются с помощью имеющихся классов системы Смолток (программированию задачи).
8 ООП Смолток8 Системный генератор путей Категории - группы классов, выделенные для некоторых областей применения. Классы - классы системы Смолток. Категории методов - группы методов классов или методов экземпляров, выделенные для удобства по признаку применения или по иному свойству. Методы - методы системы Смолток.
9 ООП Смолток9 Системный генератор путей в DolphinSmalltalk
10 ООП Смолток10 Рекурсия -- Фибоначчи -- выдать N число Фибоноччи, где N - объект-адресат -- Числа Фибоначчи задаются следующей последовательностью: -- x1=1, x2=1, xi=xi-1+xi-2 fibo self
11 ООП Смолток11 Ханойские башни 1 Этап. Спецификация метода объект-адресат - это целое число (количество колец). метод будет принадлежать классу целых чисел. объекты-параметры - символы '1', '2', '3' (информация: с какого штырька на какой нужно переложить кольцо и какой использовать как дополнительный) результат - вывод на экран информации о последовательности выполнения данной задачи. Вызов метода будет выглядеть так: 10 ханойC: '1' на: '2' через: '3'
12 ООП Смолток12 Алгоритм 2 Этап. Реализация метода ханойС: x на: y через: z. Рекурсивное решение. Базис. Если число колес равно 1, то нужно просто переложить это кольцо c х на y. Если число колес равно К, то нужно переложить со штырька х на штырек z K-1 колец, а затем переложить самое большое K-е кольцо на y и переложить все остальные K-1 колец на y.
13 ООП Смолток13 Реализация метода ханойС: x на: y через: z "головоломка 'Ханойские башни'" self := 1 ifTrue: [ СистемнаяИнформация поместитьВсеПоследующие: 'Переложить со штырька ',x,' на штырек ',y; символВК. ] ifFalse: [ (self - 1) ханойС: x на: z через: y. СистемнаяИнформация поместитьВсеПоследующие: 'Переложить со штырька ',x,' на штырек ',y; символВК. (self - 1) ханойС: z на: y через: x ] Пример использования: 10 ханойС: '1' на: '2' через: '3'
14 ООП Смолток14 Пример метода в Smalltalk Express hanoiFrom: x to: y by: z result: aStream "головоломка 'Ханойские башни'" self == 1 ifTrue: [ 'Переложить со штырька ' printOn: aStream. x printOn: aStream. 'на штырек ' printOn: aStream. y printOn: aStream. (10 asCharacter) printOn: aStream.] ifFalse: [ (self - 1) hanoiFrom: x to: z by: y result: aStream. 'Переложить со штырька ' printOn: aStream. x printOn: aStream. 'на штырек ' printOn: aStream. y printOn: aStream. (10 asCharacter) printOn: aStream. (self - 1) hanoiFrom: z to: y by: x result: aStream.]
15 ООП Смолток15 Пример использования |aStream| aStream := WriteStream on: String new. 10 hanoiFrom: 1 to: 2 by: 3 result: aStream. aStream contents.
16 ООП Смолток16 ПАРАЛЛЕЛЬНЫЕ ВЫЧИСЛЕНИЯ Три механизма: 1.параллелизм (parallelism) 2.планирование (scheduling) 3.синхронизация (synchronisation). Три класса: Process, ProcessScheduler, Semaphore
17 ООП Смолток17 Параллелизм Класс Process реализует механизм распараллеливания [f computeFunc] fork newProcessсоздать новый процесс, но не выполнять его; resumeвыполнить остановленный процесс; suspendостановить процесс; terminateзакончить процесс. Например: FProcess := [f computeFunc] newProcess, сформируется новый процесс, однако он будет находиться в состоянии ожидания и выполняться не будет. Выполнение его начнется только после того, как будет выполнено сообщение: FProcess resume.
18 ООП Смолток18 Диспетчеризация. Класс ProcessScheduler ProcessScheduler имеет единственный экземпляр, указателем на который является глобальная переменная Processor Processor fork: block1 Алгоритм диспетчеризации реализуется через простую систему приоритетов (priority system). Приоритеты процессов в Smalltalk Express определяются методами класса ProcessScheduler: userPriority, highUserPriority, lowUserPriority, topPriority В SmallTalk Express: userPriority ^4! highUserPriority ^6! lowUserPriority ^2! topPriority ^7! yield – остановить процесс с учетом приоритета [Float computeFunc] forkAt:Processor userBackgroundPriority
19 ООП Смолток19 Пример работы (Smalltalk Express) 1.|aStream n block1 block2 w nfibo flimit| 2.w := TextWindow windowLabeled: 'Fibo' frame: extent: 3.flimit := aStream := WriteStream on: String new. 5.block1 := [ n := 0. 6.[n
20 ООП Смолток20 Синхронизация. Класс Semaphore Семафоры Дейкстры Функции P и V V s s=s+1 P s s=s-1 s==0?
21 ООП Смолток21 Задача о кольцевом буфере Буфер на N ячеек Голова (Head) и хвост (Tail) Head – первая свободная ячейка, Tail – последняя занятая. Пишем в голову, читаем из хвоста.
22 ООП Смолток22 Класс «Ячейка» " Класс BUFFER " Object subclass: #Buffer instanceVariableNames: 'next val ' classVariableNames: '' poolDictionaries: '' ! !Buffer methods ! next ^next.! next: link next := link.! put: data val := data.! val ^val.! ! valnext valnext valnext
23 ООП Смолток23 Класс «Кольцевой буфер» Object subclass: #RingBuffer instanceVariableNames: 'empty full head tail fetchprotect storeprotect ' -- семафоры: -- empty - количество данных в буфере -- full - количество свободных мест -- head, tail - указатели на начало и конец -- fetchprotect и storeprotect - вспомогательные переменные, обеспечивающие -- взаимоисключение classVariableNames: '' poolDictionaries: '' ! ! !RRingBuffer class methods ! create: size ^self new init: size.! ! !RRingBuffer methods ! init: size head := tail := Buffer new. 1 to: size - 1 do: [ :i | tail next: Buffer new. tail := tail next]. tail next: head. tail := head. empty := Semaphore new. full := Semaphore new. 1 to: size do: [:i | full signal]. fetchprotect := Semaphore new signal. storeprotect := Semaphore new signal.!
24 ООП Смолток24 Методы fetch и store fetch |data| empty wait. fetchprotect wait. data := tail val. tail := tail next. fetchprotect signal. full signal. ^data.! store: data full wait. storeprotect wait. head put: data. head := head next. storeprotect signal. empty signal.! !
25 ООП Смолток25 Пример использования 1.|n block1 block2 w nfibo rb d flimit| 2.flimit := rb := RingBuffer new init: или так: rb := RingBuffer create: w := TextWindow windowLabeled: 'Ring Buffer' frame: extent: 6.block1 := [ n := 0. 7.[n
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.