prepod

Путь к Файлу: /РОССИЙСКИЙ НОВЫЙ УНИВЕРСИТЕТ / Smalltalk / Руководство I часть 2.doc

Ознакомиться или скачать весь учебный материал данного пользователя
Скачиваний:   4
Пользователь:   prepod
Добавлен:   04.05.2015
Размер:   418.0 КБ
СКАЧАТЬ

Руководство I часть 2

Руководство I часть 2

Web Log Stats Lesson 4 Reading External Files and Parsing Strings

Руководство I часть 2

| Table of Contents | Lesson 3 | Lesson 5 |

Руководство I часть 2

The previous workshop verified that you could successfully locate a web server log file on your machine and that you were able to view it in the VisualWorks File Editor. This brought the file in "all at once", but in order to count the "hits", we need to be able to read in the file line by line.

Руководство I часть 2

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

Руководство I часть 2

1. В рабочем поле Workspace, изменим текст, выделив его полностью <Operate-Click>, а затем выбрав Do it.

| myFile myStream | myFile := 'ws000101.log' asFilename. myStream := myFile readStream. myStream inspect. myStream close.

A Появится новое окно инспектора Inspector. В окне можно прочитать an ExternalReadStream с self одиннадцатью других свойств, появившихся на левой панели. Важная часть системы VisualWorks работает с последовательными файлами, как со stream (потоком) знаков. См. Рисунок 4-1.

Руководство I часть 2 Рисунок 4-1. Регистрационный файл как Stream (поток) в окне Inspector

Руководство I часть 2

Напоминание. Может быть, мы применяли "путь по умолчанию " для размещения этого файла, если не поместили его в "директории по умолчанию" системы VisualWorks. Вспомним, что когда нам задавался вопрос, как ссылаться на этот или любой другой файл, примерный ответ был прост – " не известно" ("non-qualified"). Это было воспринято как название файла. It will be up to you to make sure you are correctly referencing this file. Надо помнить, что преимущество размещения этого файла ( и всех других регистрационных файлов) в "директории по умолчанию" состоит в том, что мы имеем возможность копировать и вводить участки кода из этого урока в Workspace.

Руководство I часть 2

2. В левой панели окна инспектора, щелкнем (выделим) по слову lineEndCharacter.

Заметим, что в правой панели отображено значение lineEndCharacter,  равное Core.Character cr.В Unix/Linux оно отоброазится как Core.Character lf. Это нужно помнить, так как мы воспользуемся этой информцией позже в ходе этого урока.

3. Закроем окно Inspector.

Руководство I часть 2

Многое здесь происходит, поэтому рассмотрим это шаг за шагом.

| myFile myStream |

На этом первом шаге мы объявляем две временных переменных. Это сделано помещением вертикальной черточки сначала, списка названий переменных, разделенных пробелом, и знаком вертикальной черточки, замыкающим список.

myStream := myFile readStream.

Это место, откуда начинаются интересные вещи. По выражениям назначения (они содержат символ :=), Smalltalk выполняет сначала правую часть, а затем назначает результат левой частиe. Так объекту myFile послано сообщение readStream. Это означает, что мы хотим обращаться с регистрационным файлом (log file), как с потоком ("stream") знаков (ведь этот файл получает компьютер) и присвоить этот поток временной переменной myStream.

myStream inspect.

Мы даем указание Smalltalk'у инспектировать поток (то есть это похоже на опцию Inspect It в меню <Operate>, но вызывается программным путем) (Cool !!).

myStream close.

Пока мы разглядывали окно Inspector, Smalltalk продвинулся вперед и выполнил последнюю строку, которая и закрыла файл (это хорошая мысль – закрывать файл, когда он окончен).

Преимущества использования потока (stream) состоит в определении lineEndCharacter, мы можем прочитявать файл строка за строкой. So let's try to read in just the first line of the file.

Руководство I часть 2

4. Изменим текст, выделим его, нажмем <Operate-Click> и выберем Do It.

Пользователи UNIX/Linux должны изменить cr  на lf .

| myFile myStream myLine | myFile := 'ws000101.log' asFilename. myStream := myFile readStream. myLine := myStream upTo: Character cr. myLine inspect. myStream close.

Заметим, что новое окно (Inspector) will appear with the caption of the window being a MSCP1252String (MSCP1252 is a Windows character set designation). Displayed in the Inspector window is the first line of our file. See Figure 4-2.

Руководство I часть 2 Рисунок 4-2. Первая строка регистрационного файла

Руководство I часть 2

Если приведенный код не выдается "построчно" (то есть возвращает все содержание файла одной строкой), то применяемой операционной системе может понадобиться немного помощи в истолковании знака "конец строки".

Так как мы знаем, что этот файл имеет этот знак в конце каждой строки, то можем указать системе VisualWorks, чтобы она ожидала этого знака, когда открывается файл. Способ проделать это состоит в следующем:

myStream := myFile readStream lineEndCRLF.

Мы немного забегаем вперед (ведь это выражение не принадлежит к известному нам синтаксису метода объекта), но это будет кратко впоследствии. Сейчас достаточно сказать, что в приведенной строке объединены две строки кода. Выражения Smalltalk'a выполняются слева направо, поэтому myFile readStream выполняется сначала и возвращает экземпляр класса Stream, а этот объект затем посылает сообщение lineEndCRLF. В результате VisualWorks теперь знает, что когда ему встречаются знаки возврата строки, то это будет происходить в конце строки в файле.

Руководство I часть 2

5. В окне Inspector щелкнем по закладке Basic.

На левой панели self сопровождается последовательностью чисел со значениями от 1 до 122. Это говорит о том, что первая строка содержит 122 знака (одно число для каждого знака).

Руководство I часть 2 Figure 4-3. The first line of the log file contains 122 characters

Руководство I часть 2

Нужно объяснить 4-ю строку приведенного кода. Это большая работа. 

myLine := myStream upTo: Character cr.

В третьей строке, когда мы выдали сообщение readStream объекту myFile, Smalltalk преобразовал объект Filename в объект Stream. Полное содержание файла имеет форму потока знаков. Будем считать, что этот поток знаков хранится во временной переменной myStream.

Теперь до четвертой строки, где мы выдаем сообщение upTo: объекту Stream, которому принадлежит myStream. Заметим, что за этим сообщением следует двоеточие, которое означает, что за двоеточием следует параметр. С английского эту строку можно перевести так: "взять все знаки потока myStream до знака Character cr и присвоить их объекту myLine. Это чем-то похоже на копирования выражения. Сообщение upTo: только хочет знать "где мне остановиться?". Знак cr обозначает возврат каретки (Carriage Return сокращено до cr) и для большинства построчных файлов, подобных данному, Carriage Return отмечает конец одной строки и возвращение к следующей.

Заметим,что четвертая строка несколько более сложна, чем 4 squared или 3 + 4. Не только потому, что это выражение, содержащее параметр, но и потому, что оно включает объект (myStream), класс (Character) и 2 сообщения (upTo: и cr). Чтобы разобраться, как Smalltalk интерпретирует эту строку (то есть какой метод выполняется первым), следует обратиться к начальному описанию синтаксиса, которое содержит также информацию об общепринятом в Smalltalk'е правиле названия объектов.

Мы прочли первую строку файла. Теперь нужно выделить из этой строки IP адрес. Так как это "разделенный запятыми" файл, все поля в этом файле разделены запятыми. Так как IP адрес всегда является первым полем в каждой строке, нужно просто прочесть все знаки в строке "вплоть до" первой запятой, и это будет IP адрес. Сделаем это.

Руководство I часть 2

Обратимся к начальному синтаксису.

Букварь : синтаксис Smalltalk'а (Часть 1)

 

Руководство I часть 2

В Smalltalk'е имеется три типа сообщений. Разница между этими типами важна потому, что они подчиняются правилам, например, как разделить сложное сообщение в Object - Method – основном строительном блоке языка.

Руководство I часть 2

В Smalltalk'е широко распространено правило присвоения названий (оно не является строгим стандартом, но может им стать), которое выглядит следующим образом.

Руководство I часть 2

Части кода в этом разделе могут быть запущены в Workspace.

Руководство I часть 2

Итак, в Smalltalk'е есть три типа сообщений:

·  Унарные

·  Бинарные и

·  Ключевые слова

Унарные сообщения

4 squared 'pots' reverse 10 factorial 'chocolate' asUppercase 6.4 rounded

Представленные выражения образуют строительный блок языка Smalltalk. Как в русском языке существуют простейшие предложения, где есть подлежащее и сказуемое ("Он идет."), так и выражение Smalltalk'а имеет объект и сообщение и называется Унарным сообщением.

Бинарные сообщения

3 + 4 6 * 5 'Visual' , 'Works'

Выше даны примеры бинарных сообщений. Здесь выражение имеют два объекта в одном сообщении. Большинство бинарных сообщений являются математиыескими выражениями, но вовсе не обязаны быть таковыми. Третий пример ('Visual' , 'Works') имеет два экземпляра класса String с запятой в качестве сообщения. Метод "запятой" используется при конкатенации. В данном случае метод используется, чтобы добавить строку 'Works' к объекту 'Visual', в результате в классе String образуется объект 'VisualWorks'.

Сообщения ключевые слова

Dialog warn: 'Hello World' Transcript show: 'Hello World' ('Got Milk?') copy replaceFrom: 5 to: 8 with: 'I am lost' startingAt: 6

Каждое приведенное сообщение является примером сообщения ключевое слово. Признаками этих сообщений является двоеточие (:). Так в одном из наших примеров мы использовали класс Dialog и послали ему сообщение warn. Двоеточие, которое следует за сообщением warn, означает, что что-то (параметр) связывается с сообщением warn. В этом случае это строка знаков, заключенная в одинарные кавычки. 

Обратим внимание на то, что в последнем примере насчитывается четыре сообщения, так там четыре слова с двоеточием. Но на самом деле там один метод.  Метод  называется  replaceFrom:to:with:startingAt:. Это звучит немного странно, но вполне понятно, чтобы разделить этот метод на части. Это одиночный метод с четырьмя параметрами. Сообщения сами описывают параметры, которые ожидает этот метод.

Руководство I часть 2

Выполнение выражений в Smalltalk'е

Теперь о правилах. Мы помним, что не имеет значения, насколько сложно выражение. Оно должно быть разделено на части 

Объект сообщение

1. Слева направо

2. части выражений внутри скобок должны выполняться раньше

3. Унарные сообщения

4. Бинарные сообщения

5. Сообщения ключевые слова

Кроме того, сообщение производит объект в качестве возвращаемого объекта. Этот объект может быть использован как получатель или в качестве параметра следующего сообщения в выражении.

Руководство I часть 2 Рисунок S-1. Типичное "сложное" выражение.

Так как нигде нет скобок, работаем слева направо, выполняем сначала унарные сообщения, затем бинарные сообщения затем ключевые слова. Итак, сначала выполняем

Date today weekday

Затем нужно выполнить

December 25, 2000 weekday

Конечно, дата "December 25, 2000" появилась бы, если бы мы выполняли это упражнение в эту дату. С другой стороны она должна вернуть дату того дня, когда ведется выполнение. Поэтому "Date today" возвращает объект Date. Объекту Date затем посылается сообщение weekday, в результате которого возвращается день недели на эту дату.

Руководство I часть 2 Figure S-2. Как Smalltalk выполняет "сложное" выражение.

Руководство I часть 2

Правило названий

·  Название класса всегда начинается с заглавной буквы

·  Название метода всегда начинается со строчной буквы

·  Название метода, состоящее из нескольких слов, никогда не сокращается

·  Название метода, состоящее из нескольких слов, должно использовать заглавные буквы для каждого слова, следующего за первым 

·  Пробелы в названиях методов не допускаются

·  Правила, применимые к названиям метода, действительны и для названий переменных экземпляра

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

я

Типы методов

Существует два основных типа сообщений:

·  Методы класса

·  Методы экземпляра

Рассмотрим каждый тип подробнее.

Dialog warn: 'Hello World'

Так как слово Dialog начинается с заглавной буквы, то Dialog является классом. Так как Dialog является классом, warn: является методом класса. Он возвращает отдельный экземпляр класса Dialog (послание со строкой 'Hello World' в нем и кнопку OK).

4 factorial

Число 4 является экземпляром класса SmallInteger class. Следовательно, , factorial это метод экземпляра. Он возвращает отдельный экземпляр класса SmallInteger (24).

Date today weekday

Так как Date начинается с заглавной буквы, Date является классом. Так как Date это класс, today является методом класса. Он возвращает отдельный экземпляр класса Date (независимо от даты дня). Если двигаться слева направо, следующим будет термин weekday. Так как он следует за экземпляром класса Date, то weekday является методом экземпляра. Он возвращает символ (символ в языке Smalltalk это отдельный тип объекта, который действует как константа, но здесь это неважно). Что важно сейчас, так это как результирующий объект от "Date today" использован в качестве получателя следующего сообщения "weekday".

Transcript show: Date today weekday

Двигаясь слева направо, заметим, что имеем сообщение ключевое слова (так как show:), но ключевые слова являются по порядку последними. Мы должны сначала рассмотреть унарные или бинарное сообщение. Выражение "Date today weekday" выполняется первым и получает в результате "Monday", который затем используется как параметр в ключевом слове show: объекта Transcript. Происходит нечто подобное слудующему:

Transcript show: Date today weekday

Transcript show: (December 25, 2000) weekday

Transcript show: Monday

 

Руководство I часть 2

Резюме

Многое должно быть рассмотрено в синтаксисе Smalltalk'а, но первые шаги в этом направлении позволяют немного легче разбираться в коде Smalltalk'а.

Руководство I часть 2

6. Изменим код, выделим его выполним щелчок правой кнопкой и затем выберем Do it.

| myFile myStream myLine addrIP | myFile := 'ws000101.log' asFilename. myStream := myFile readStream. myLine := myStream upTo: Character cr. addrIP := myLine copyUpTo: $,. addrIP inspect. myStream close.

Заметим, что появится новое окно (Inspector) с заголовком MSCP1252String. Здесь мы увидим значение MSCP1252String, которое представляет собой IP адрес, а именно 209.67.247.201. Щелкнув по закладке Basic, увидим числа от 1 до 14, показывающие, что IP адрес содержит 14 знаков (одно число на каждый знак).

Руководство I часть 2 Рисунок 4-4 Пример IP адреса

7. Закрываем окно Inspector.

Руководство I часть 2

Объясним пятую строку приведенного кода.

addrIP := myLine copyUpTo: $,.

Теперь, когда временная переменная myLine содержит первую строку знаков, необходимо взять все знаки до запятой и сохранить их во временной переменной addrIP. Так мы даем объекту String значение myLine (напомним, это экземпляр класса ByteString) и сообщаем copyUpTo:, а затем передаем ему параметр $,. Так как особое внимание уделено нами знаку "запятая", мы применяем знак доллара перед запятой, чтобы Smalltalk'у, что нам нужен знак запятой. В языке Smalltalk запятая имеет особое значение (это, как ни удивительно, сообщение), поэтому, применяя знак доллара, мы сообщаем, что запятую следует просто как знак, а не как сообщение.

Заметим, что мы имеем два разных сообщения, которые в основе представляют собой одно и то же. Сообщение upTo: копирует слово "до" некоторого параметра. Сообщение copyUpTo: копирует слово "до" некоторого параметра. Причина, почему нами применено два разных сообщения, состоит в том, что имеется два разных объекта. Сообщение upTo: используется объектами Stream, тогда как сообщение copyUpTo: используется объектами String.

Теперь мы можем сказать себе: "Как бы было хорошо, если бы мы имели одно сообщение, которое 'copied stuff up to some parameter' независимо от того, какой класс применяется". Ответ да, и к этот подход носит название полиморфизм, фундаментальный принцип объектно-ориентированного программирования. Сейчас же важно запомнить, что сообщение upTo: применяется к объектам Stream, а сообщение copyUpTo: к объектам String.

Руководство I часть 2

Proceed to the polymorphism primer.

OK. We have an IP address. But each line contains an IP address. We need a way to loop through the file line by line and collect the IP address as we go. Would you believe that just one additional line of code will do that?

Руководство I часть 2

8. Изменим код  выделим его, нажмем <Operate-Click> и затем выберем Do it.

| myFile myStream myLine addrIP | myFile := 'ws000101.log' asFilename. myStream := myFile readStream. [ myStream atEnd ] whileFalse: [ myLine := myStream upTo: Character cr. addrIP := myLine copyUpTo: $,.

Transcript show: addrIP.]. myStream close.

Заметим, что весь текст (числа) появился в главном окне VisualWorks. Мы помним, что эта область отображения носит название System Transcript и это один из четырех способов отображения (Lesson 2).

Руководство I часть 2 Рисунок 4-5. Все IP адреса, отобразившиеся в Transcript

Руководство I часть 2

Другая строка кода, которая действует совсем немного.

Это по существу тот же код, что и предыдущий. Так как мы располагаем кодом для построчного прочтения и выделения IP адреса, то нужен способ повторения этого процесса с начала файла до конца. Помимо выражения в окне Transcript, в нем отображается IP адрес, который вместе для повторения этого цикла занимает одну строку кода!

[ myStream atEnd ] whileFalse: [

Так как одна строка кода делает для нас так много, требуется совсем немного объяснения. Чтобы не вырывать из текста, рассмотрим материал о циклах.

Руководство I часть 2

Proceed to the loops primer.

Руководство I часть 2

Summary

Most of the explanation of the topics and concepts regarding Smalltalk for this exercise already took place. However, now would be a good time to recall how we are approaching this exercise. Only one more step remains before we finish the exercise - that of counting the number of hits this web site had for a particular day. We will do that in the next lesson, but let's recap how we got to this point.

We first had to know how to open a file. Then we had to know how to read it in line by line. We then had to know how to extract data from that line. Instead of doing this (writing a routine to display all IP addresses in a web server log file to the System Transcript) all at once, we did it in a "test this snippet of code - it worked - move on" fashion. In another programming language, you could not do this. It would involve writing all the code in some editor, compiling it and then running it. The first time you run this code, you really have no idea if it would work. Chances are it would not have run successfully so you go back and (try to) fix the problem (in your editor), compile it and run it again. You would repeat this process over and over again until eventually you get the program to work. It's an "all or nothing" approach.

With Smalltalk, it is incremental. You test and play with little chunks of code, get those working and then piece them together as a single unit. This is what makes code development in Smalltalk so much more productive. Once you get those little chunks of code working, you never have to go back and test them again.

In the next workshop, now that we know how to extract all those IP addresses from the file, we will be able to collect, sort and count them.

You now should know how to:

Руководство I часть 2Read in a file line by line

Руководство I часть 2Extract data from a string of characters

Руководство I часть 2Perform a loop

Руководство I часть 2Code block statements

Руководство I часть 2Overrides the special meaning of certain characters (comma)

Руководство I часть 2Use the Stream class for file access

Руководство I часть 2Recognize Boolean expressions

 

Браузер системы

 

 

 

Руководство I часть 2

 

Главным инструментам программирования в VisualWorks является System Browser. Вы используете его для “просмотра” библиотеки программ, выдачи, компиляции и печати выбранной порции исходного кода. Браузер также обеспечивает инструменты специального вида для совершенствования, переписи, контроля и испытания.

Чтобы открыть браузер, выбираем Browse→System или щелкаем по иконке System Browser в окне запуска VisualWorks.

Браузер системы обеспечивает различные представления образа VisualWorks, позволяя выбрать, как должна выглядеть система. Различные взгляды более полезны в различное время, чем другие.

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

 

 

                                 Список                 Список                    Список                  Список          

                       категории/пакеты  классы/поля имен      протоколов      методы/переменныеРуководство I часть 2Руководство I часть 2Руководство I часть 2Руководство I часть 2

Руководство I часть 2

Окно браузера делится на два "этажа": верхний этаж занят навигатором, а нижний средствами кода. Вы выбираете изображение навигатора, щелкнув по верхнему ряду кнопок управления. Средства кода выбираются, используя нижний ряд средств управления. Заголовок в средствах кода показывает, какое из средств управления она выбирает.

В целом, система VisualWorks организована с использованием легко управляемых систем: категорий, пакетов, упаковок. Выбор в верхнем ряду этих частей производится в линейке средств браузера системы (в навигаторе) и может быть изменен выбором из меню Browser вариантов: Category, Package, или Parcel.

Мы пользуемся навигатором, чтобы в библиотеке классов просмотреть классы, пространства имен, методов, переменных и так далее. Библиотека классов также организована в соответствии с иерархией наследования, которую можете видеть, выбрав закладку иерархии (Hierarchy), принадлежащую навигатору.  

Каждое название в Браузере имеет свое собственное меню <Operate>, предлагающее команды, соответствующие содержанию названий. Многие из команд очевидны. Особенные команды будут объяснены по ходу этого документа, когда будет обсуждаться соответствующая операция.  

Навигатор Браузера

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

Отображение категории

Это группы классов, разделенные на категории для удобства пользователя. Они не имеют семантического значения и не влияют на возможности системы и ее приложений. Категории и содержащиеся в них классы размещены в произвольном порядке, как удобно пользователю. Этот порядок имеет лишь косвенное отношение к иерархии классов в системе VisualWorks. Одна из этих категорий может быть выбрана щелчком кнопки мыши <select>. Новые категории можно добавить, выбрав add… и нажав кнопку <operate>. Категории могут удаляться или менять название  (см. главу 16). Классы выбранной категории представлены на следующей панели.

Названия классов

На этой панели собраны классы выбранной категории. В ней может быть выделен один класс. Сразу за этим выделением (выбором) не следующей панели демонстрируются протоколы (категории сообщений). Выбор класса вызывает отображение на нижней панели определения класса. Кроме того, отображение части классовой иерархии с этим классом, а также комментарий с описанием функций этого класса может быть выбран с помощью меню <operate>. Классы также можно удалять или переименовывать.

Протоколы (категории сообщений)

Здесь представлены категории сообщений, которые должны быть посланы или экземплярам выбранного класса (закладка instance), или самому классу (закладка class). По умолчанию всегда сначала выделена закладка instance. Категории сообщений называются протоколами. Из них этих протоколов может быть выбран один, вызывая на правой панели отображение всех селекторов сообщений, принадлежащих этому протоколу. Меню, вызванное нажатием кнопки <operate>, включает в список опции, позволяющие пользователю добавлять новый протокол или удалять или переименовывать существующий протокол.

Сообщения (селекторы, названия)

На этой панели представляются все селекторы сообщений, принадлежащие выбранному протоколу. Один из селекторов можно выделить, и он вызовет отображение своего метода на нижней панели. Код можно изменять и повторно вводить в состав образа, если это необходимо (см. ниже). Исходный текст отображенного на нижней панели метода хранится во внешнем файле.

Отображение пакетов

Система может быть организована с применением пакетов и  упаковок. Браузер отображает пакеты, когда в меню Browser выбран вариант Package.

Пакеты помогают проверять коды и относящиеся к ним механизмы индивидуального использования командами программистов, работающих над одним проектом.

Отображение упаковок

Система VisualWorks также разделяется на основной образ (image) и собрание загружаемых компонентов кода, называемых упаковками.  Браузер отображает упаковки, когда из меню Browser выбирается Parcel.  

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

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

Обзор иерархии

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

Пример: просмотр реализации существующего метода

–  Выделяем категорию класса Magnitude–Numbers в левой панели, кнопкой <select>.

–  Выделяем Number на панели названий классов.

–  Выделяем testing на панели протоколов.

–  Выбираем селектор even на панели методов.

Упражнение 6.1:  Убедитесь, что метод even правильно выполняет печать, выделение и выполнение (используя print it) следующее выражение в Workspace:

42 even

Повторите этот тест при других числах.

Упражнение 6.2:  Испытайте эффект следующих опций из меню <operate> в панели списка категорий (левая панель). Выберите закладку hierarchy в этой панели. Таким образом, отобразится текстуальное представление части иерархической структуры классов в образе, который в нижней (текстовой) панели включает класс Number.

Можно видеть, что классы Float, Fraction и Integer все являются подклассами класса Number. Таким образом, сообщение even должно быть понято экземплярами всех этих классов. Проверьте:

42 even

17.91 even

(3/7) even

Также проверьте варианты выбора definition и comment в меню <operate>.

Код на нижней панели, отображается, когда экземпляр класса Number (или один из его подклассов) получает сообщение с селектором even. Этот код возвращает true, если получатель четный, и false, если нечетный. Заметим, что он посылает сообщение самому себе (self), используя селектор \\ (остаток при делении по модулю) с 2 в качестве аргумента.

Экземпляр, класс и изображения переменных

Закладки под названием экземпляр, класс, общие переменные и переменные экземпляра переключают содержание метода категорий или отображения метод/переменной, выбирая показ категории или определений методов экземпляра, методов класса, общих переменных или переменных экземпляра. В некоторых ситуациях, таких, когда пространство названий выбрано так, что имеет определенные только в нем общие переменные, показана только одна из закладок, а именно Shared Variables. Обычно любая из закладок может быть выбрана, даже если для этого изображения может не быть никаких входов.

Определение методов

Новый метод может быть определен с помощью браузера, если выбран протокол. Если такого протокола нет, то можно его создать. Для этого надо щелкнуть <operate> на панели категории сообщений (протоколов) и выбрать в меню команду add…. Следующий образец дается браузером:

message selector and argument names

"comment stating purpose of message"

| temporary variable names |

statements

Этот образец сравнительно прост, чтобы годиться во всех случаях. Некоторые из выражений могут быть помещены в разделе выражений. Должно быть не больше, чем 255 временных переменных и аргументов.

 

Пример: создание нового метода

Функция, не имеющая экземпляров класса Number – это "абсолютно другая" функция. Здесь мы добавим функциональные возможности классу Number. Выделим классы Magnitude-Numbers, Numbers и  arithmetics в трех первых панелях браузера системы. Не будем ничего выбирать в правой панели. Нижняя панель отобразить "образец" для новых методов. Выдадим (используя обычные правила выдачи текста) образец, и он отобразится следующим образом.

diff: aNumber

"return the absolute difference between me and aNumber"

|temp |

temp := self – aNumber.

temp < 0

ifTrue: [^temp negated]

ifFalse: [^temp]

Этот метод сначала вычисляет temp, который представляет собой разность между параметром aNumber и получателем (self). Затем он дает в ответ либо temp, либо отрицательную версию temp , в зависимости от того, является ли temp отрицательной величиной. Новый метод может теперь быть компилированным и добавится в среду VisualWorks после выбора в нижней панели из меню <operate> варианта accept. Делаем это! Корректируем любые ошибки, которые подкрадываются из-за нашей невнимательности!

(Опция cancel удаляет весь текст, добавленный к текстовой панели, и восстанавливает его в прежнем состоянии.)

Упражнение 6.3:  Проверьте функционирование нового метода вводом и выполнением (print it) соответствующих выражений в Workspace. Например, проверьте:

42 diff: 17.

17 diff: 42.

-17 diff: -19.

10.15 diff: (3/7).

237846527938465 diff: 3456

Заметьте, что сделанное вами добавление к образу в VisualWorks будет там постоянно, пока не будет вами решено их удалить. (Конечно, предполагается, что вы в конце концов сохраняете образ!)

Упражнение 6.4:  Фактически использованное выше введение diff: не очень хорошо (хотя и работает). Лучшая версия показана ниже:

diff: aNumber

      "return the absolute difference between me and aNumber"

^ (self – aNumber) abc

Эта версия удаляет временную переменную и использует метод abc, который уже введен с классом Number. Это уменьшает величину кода, добавленного к образу, чтобы поддержать его новые функциональные возможности.

Упражнение 6.5:  Модифицируйте новое использование diff: путем выдачи и принятия текста в браузере системы. Убедитесь, что он не изменил функциональных возможностей метода путем повторения приведенных выше проверок. Обратите внимание, что нет способа, который введение можно выполнить отправителем метода diff:. Вы можете рассмотреть  ввод метода abs в класс ArithmeticValue.

Определение классов

Так же, как и методы, определение классов может быть добавлено с использованием браузера, когда выделена категория классов. Как и в случае методов, если нет подходящей категории, то может быть использована для ее создания опция add… из панели категорий класса и меню <operate>. Браузер обеспечивает следующий образец:

NameOfSuperclass subclass: #NameOfClass

instanceVariableNames: 'instVarName1 instVarName2'

classVariableNames: 'ClassVarName1 ClassVarName2'

poolDictionaries: ' '

category: 'Category-Name'

Это тоже легко заполнить. Запомним, что надо держать символ '#' перед названием класса, и что названия классов должны всегда начинаться с заглавных букв.

Пример:      Number subclass: #Fraction

InstanceVariableNames: 'numerator denominator'

classVariableNames: ' '

poolDictionarees: ' '

      category: 'Magnitude-Numbers'

Пример: добавление нового "приложения"

Этот пример представляет собой упражнение в добавлении нового "приложения" (малого), основанного на классах, уже имеющихся внутри образа. Пример взят из "Оранжевой книги", глава 17.

Создадим класс, имеющий отношение к отдельной "истории затрат". Мы не будем касаться проектирования или иметь дело с другими применяемыми классами. Это пример применения браузера системы и компилятора. Дадим описание нового класса SpendingHistory с различными методами и переменными экземпляра. Попытаемся просто поработать с этим классом.

Упражнения 6.6:  Используем пункт add…, из меню, всплывающего после нажатия клавиши <operate> в панели категории классов браузера системы. Эта новая категория классов сначала не будет иметь в своем составе, как и сейчас, никаких классов. Образец для создания нового класса будет отображаться на нижней панели браузера системы.

Упражнение 6.7:  Выдадим образец (используя обычные правила редактирования текста), таким образом, он в следующем виде:

Object subclass: #SpendingHistory

instanceVariableNames: 'cashOnHand expenditures'

classVariableNames:''

poolDictionaries:''

category: 'Spending'

В этом примере объявляется новый класс SpendingHistory, который является подклассом класса Object. Новый класс имеет две переменных экземпляра, которые носят названия cashOnHand и expenditures, но не имеет переменных класса. Выбираем из меню <operate> accept. Так создается новый класс SpendingHistory и постоянно устанавливается в образе.

Теперь нам нужно добавить несколько свойств к SpendingHistory, поскольку в этот момент все экземпляры класса SpendingHistory будут иметь одинаковые функциональные свойства с классом Object. Сначала мы добавим метод в протокол классов, чтобы создать новые initialized для класса SpendingHistory.

Упражнение 6.8:  Выберем в браузере системы закладку class, а в меню, вызванном щелчком кнопки мыши <operate> в панели категорий сообщений (протоколов) выделяем add….  

initialBalance: anAmount

^self new setInitialBalance: anAmount

Заметим, что этот метод использует метод, определенный выше в иерархии классов (new). Добавим этот метод, использовав accept в меню <operate>. Этот метод вызывает сообщение setInitialBalance:, которое будет отправлено новому экземпляру SpendingHistory. Метод, соединяющий основное сообщение, еще не определен, поэтому мы должны выбрать proceed в окне подтверждения.

Добавим протокол экземпляра классу SpendingHistory.

Упражнение 6.9:   Выберите закладку instance в браузере системы. Создайте новый протокол (как и ранее), называемый 'private'. Введите образец, чтобы добавить метод setInitialBalance:. Выполните accept из всплывающего по команде <operate> меню.

setInitnialBalance: anAmount

"initilize the instance variables;

cashOnHand is set to amount"

cashOnHand := anAmount.

Expenditures := Dictionary new.

Упражнение 6.10:  Повторите приведенное выше

для метода totalSpentOn: в протоколе 'inquiries',

для метода spend:on: в протоколе 'transactions',

и для метода printOn: в протоколе 'printing' (смотреть ниже):

printOn: aStream totalSpentOn: reason

"return the amount spent on reason. Answer

0 if reason is not used for expenditures"

(expenditures includesKey: reason)

ifTrue: [^expenditures at: reason]

ifFalse [^0]

spend: anAmount on: reason

"Spend anAmount on: reason, reducing the variable cashOnHand"

expenditures

at: reason

put: (self totalSpentOn: reason) + anAmount.

cashOnHand – anAmount.

"print a suitable representation of the receiver on a Stream"Histj

super printOn: aStream.

aStream space.

aStream nextPutAll: 'balance:'.

cashOnHand printOn: aStream.

expenditures keysAndValuesDo: [:reason :amount |

aStream cr.

reason printOn: aStream.

aStream tab.

mount printOn: aStream]

Теперь можно создать экземпляры класса SpendingHistory, применяя для этого выражение:

SpendingHistory initialBalance: 600

Упражнение 6.11:  Для тестирования новых классов введите в рабочее поле выражения, приведенные ниже. Выделите код и выполните его по команде print in.

| spendingHistory |

spendingHistory := SpendingHistory initialBalance: 800.

spendingHistory spend: 220 on: 'rent'.

spendingHistory spend: 30 on: 'food'.

spendingHistory spend: 45 on: 'drink'.

spendingHistory spend: 20 on: 'petrol'

Прежде, чем продолжить, убедитесь, что берете "мгновенную картину" созданного образа путем выделения опции Save as… из меню File окна запуска. Мы вернемся к этому примеру позже.

6.7. Сохранение нашего кода

Каждая из верхних панелей браузера системы имеет опцию file out as… в меню, вызываемом кнопкой <operate>. Эта опция дает возможность пользователю создавать файл, содержащий исходный код для выделения категории, класса, протокола или метода.

   Упражнение 6.12.         Выберите категорию Spending на панели категории классов и выделите там же в меню <operate> опцию file out as…. Вам будет подсказано закончить описание названия файла (см. рисунок 6.2), которое должно окачиваться расширением ".st" (если это необходимо, название файла будет сокращено в соответствии с правилами файловой системы вашей операционной системы). Просто нажмите клавишу <CR>. Курсор покажет , что файл записан на диск.

Упражнение 6.13.        Выполнение команды file out для метода diff: мы проделали  ранее.

 

Пиктограммы (иконки) в навигаторе

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

Иконка

Описание

Руководство I часть 2

Пакет

Руководство I часть 2

Комплект

Руководство I часть 2

Пространство названий

Руководство I часть 2

Подкласс модели

Руководство I часть 2

Подкласс модели приложения

Руководство I часть 2

Подкласс собрания

Руководство I часть 2

Подкласс исключения

Руководство I часть 2

Метод, заново определенный по край мере в одном суперклассе

Руководство I часть 2

Метод,  заново определенный по край мере в одном подклассе

 

Работа с браузером   

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

В VisualWorks 7, браузер включает систему параметров для автоматического обновления кодов. Детали изложены в разделе “Refactoring”. Для совершенствования проектирования браузер также имеет специальные инструменты, контролирующие переписывание кодов и тестирование частей.  Детали изложены в разделе “Coding Tools” на странице 493.

Чтобы облегчить обучение и экспериментирование, каждая операция с браузером может быть возвращена с применением функции Undo (в меню Browser).

Редактирование исходного кода

Исходный код в Браузере системы – это место, где делается большинство записей текста и редактирования для класса приложения и определения метода. Общие операции редактирования, такие как cut, paste, find и replace, задаются в меню <Operate> этой панели.

Когда мы выбираем категорию класса, но не выбираем класс, отображается шаблон выбора класса. Аналогично, когда мы выбираем протокол, но не метод, отображается шаблон определения метода. Чтобы создать новый класс или метод, заменяем шаблон подходящим определением.  

Когда мы даем определение, то должны сохранить или принять свои изменения. Выберите Accept в меню на панели кода <Operate>.

Пропущенный исходный код

Изображение в Smalltalk’e связано с исходным файлом, как и было описано выше. Если исходные файлы ресурсов не распознаны точно средствами установки, или каталог в VisualWorks правильно не установлен, или исходные данные не доступны, мы можем увидеть код в браузере с комментарием, объясняющим, что это декомпилированный код. Если Вы видите этот комментарий, установите исходный каталог и отредактируйте страницу с исходными файлами в средствах установки (Settings Tool), убедившись, что название файла с расширением .sou согласуется с именем изображения. (Чтобы открыть средства установки, выбираем System→Settings в окне запуска.)

Поиск

Панель навигатора включает в себя входное поле для быстрого поиска по названию классов, переменных или методов:

Руководство I часть 2

Чтобы найти класс, просто вводим его название и выбираем Accept в меню <Operate> или нажимаем клавишу <Return> (<Enter>). Чтобы найти метод, вводим его название с предварительно заданным знаком # (фунт). Групповой поиск возможен с использованием знака * (asterisk).

Перетаскивание

Чтобы изменить код, мы можем переносить методы классов или протоколов; проколы в другие классы или протоколы; классы в другие категории; а категории в другие категории.           

Управление видимостью методов

По умолчанию список методов в браузере отображает только те методы, которые принадлежат выбранному классу или протоколу. Различные опции обеспечивают управление видимостью методов и ее расширением.

Когда выбран класс, браузер может быть установлен таким образом, чтобы обеспечить видимость всех методов в классе, когда не выбрано протокола. Чтобы привести в действие эту возможность, надо выбирать Show all Methods when No Protocols Selected на странице Browser в средствах установки (Settings Tool).

Также как часто бывает полезно увидеть наследование классов, используя закладку Hierarchy, полезно увидеть наследованные методы. Чтобы распространить видимость списка методов на наследованные методы, размещенные в суперклассе, выберем название суперкласса из меню Method→Visibility. Эта установка остается активной, пока мы не перейдем к другому классу.

Чтобы закрепить исходную установку видимости так, чтобы она оставалась активной при просмотре разных классов, выбираем Show All Inherited или Show All Inherited Except for Object. Чтобы отключить расширенную видимость, выбираем Show No Inherited.

Использование множественных изображений

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

Руководство I часть 2

Чтобы создать новое изображение, используем View→New или соответствующую пиктограмму на панели средств браузера. Выбираем входы в меню View, чтобы быстро переключиться между разными, созданными Вами изображениями. Применим View→Remove, чтобы удалить существующее изображение.

 

Форматирование исходного кода

Чтобы отформатировать метод, используя интегрированный формировщик кода браузера, выбираем Format в меню средств исходного кода <Operate>.

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

Правила форматирования удобны для пользователя и могут быть изменены. Они принадлежат классу RBConfigurableFormatter и могут изменяться специальными средствами. Чтобы настроить браузер на использование по умолчанию изменяемого формировщика, выполняем:

RBProgramNode formatterClass: RBConfigurableFormatter

Чтобы открыть конфигурацию инструмента, выполняем:

FormatterConfigurationTool open

Средства конфигурации имеют около 20 отдельных правил. Когда изменяются правила, нужно после изменения значения щелкнуть Accept  в меню  <Operate> в поле ввода входных значений. Чтобы проверить влияние правил на метод тестирования, щелкните по вставленной в инструменты кнопке Format. Чтобы сохранить любые изменения в правилах, щелкните по кнопке OK.

Исходный метод в браузере может быть также закодирован цветами.

Чтобы запустить цветовое кодирование, загрузим посылку ColorEditing (ее можно найти в Менеджере Посылок (Parcel Manager’s) в категории Environment Enhancements).

 

 

Наверх страницы

Внимание! Не забудьте ознакомиться с остальными документами данного пользователя!

Соседние файлы в текущем каталоге:

На сайте уже 21970 файлов общим размером 9.9 ГБ.

Наш сайт представляет собой Сервис, где студенты самых различных специальностей могут делиться своей учебой. Для удобства организован онлайн просмотр содержимого самых разных форматов файлов с возможностью их скачивания. У нас можно найти курсовые и лабораторные работы, дипломные работы и диссертации, лекции и шпаргалки, учебники, чертежи, инструкции, пособия и методички - можно найти любые учебные материалы. Наш полезный сервис предназначен прежде всего для помощи студентам в учёбе, ведь разобраться с любым предметом всегда быстрее когда можно посмотреть примеры, ознакомится более углубленно по той или иной теме. Все материалы на сайте представлены для ознакомления и загружены самими пользователями. Учитесь с нами, учитесь на пятерки и становитесь самыми грамотными специалистами своей профессии.

Не нашли нужный документ? Воспользуйтесь поиском по содержимому всех файлов сайта:



Каждый день, проснувшись по утру, заходи на obmendoc.ru

Товарищ, не ленись - делись файлами и новому учись!

Яндекс.Метрика