prepod

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

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

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

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

Web Log Stats Lesson 4 Reading External Files and Parsing Strings

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

| Table of Contents | Lesson 3 | Lesson 5 |

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

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 часть 2a

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

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

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 часть 2a Рисунок 4-1. Регистрационный файл как Stream (поток) в окне Inspector

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

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

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

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

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

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

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

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

| 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 часть 2a

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 часть 2a Рисунок 4-2. Первая строка регистрационного файла

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

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

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

myStream := myFile readStream lineEndCRLF.

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

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

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

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

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

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

Нужно объяснить 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 часть 2a

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

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

 

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

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

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

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

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

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

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

Итак, в 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 часть 2a

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

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

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

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

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

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

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

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

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

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

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

Date today weekday

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

December 25, 2000 weekday

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

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

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

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

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

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

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

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

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

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

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

я

Типы методов

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

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

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

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

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 часть 2a

Резюме

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

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

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 часть 2a Рисунок 4-4 Пример IP адреса

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

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

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

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 часть 2a

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 часть 2a

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 часть 2a Рисунок 4-5. Все IP адреса, отобразившиеся в Transcript

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

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

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

[ myStream atEnd ] whileFalse: [

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

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

Proceed to the loops primer.

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

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 часть 2aRead in a file line by line

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

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

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

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

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

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

 

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

 

 

 

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

 

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

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

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

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

 

 

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

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

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

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

 

Вставка:

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

Важная роль браузеров в процессе программирования более легко оценивается, если понимаешь, как процесс разработки в языке Smalltalk отличается от такого процесса в процедурных языках, таких как паскаль и Си. Программирование в Smalltalk'е производится при имеющейся и постоянно обновляющейся библиотеке классов. Этот процесс назван программированием с применением расширения. При наличии механизма наследования, новые классы создаются путем описания, чем они отличаются от существующего класса данного объекта – этот процесс называется дифференциальным программированием.

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

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

· Наблюдение исходного кода для существующих классов и методов.

· Внесение поправок в существующие классы и методы.

· Пополнение библиотеки классов новыми классами и методами.

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

Кроме небольшого числа примитивных операций, все исходные коды в библиотеке классов могут быть рассмотрены (и модифицированы) программистом, Smalltalk – открытая система. Со многими тысячами методов и несколькими сотнями классов, браузеры помогают программисту преодолеть проблему перегрузки информацией. Они дают программисту средство, с которым он может просмотреть и ввести изменения в библиотеку классов Smalltalk'а. Они заменяют собой использование статичных руководств и составление списков исходных кодов, давая динамичный взгляд на систему Smalltalk'а в любой момент времени. Так как приложения этого языка программирования строятся на существующей библиотеке классов, то значительно более информативно иметь возможность просмотреть библиотеку классов, чем изучать бумажное  описание отдельного класса.

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

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

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

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

Чтобы дать программисту возможность двигаться в библиотеке легко и быстро, библиотека имеет индексацию. Соответствующие классы сгруппированы в категории, а соответствующие методы внутри отдельных классов – в категории сообщений (протоколы). Таким образом, четыре панели списков дают четыре уровня индексации в библиотеке классов. Слева направо эти панели названы соответственно панелями категорий класса, названий классов, категорий сообщений (иначе называемых протоколами) и селекторов сообщений. Кроме того, чтобы определить расположены ли экземпляры сообщений в панелях протокола и селекторах сообщений, любой класс или экземпляр класса выбирается по закладке экземпляр-класс в панели классов.

Просмотр существующих классов

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

· Определение класса для перечисления его экземпляров и переменных класса.

· Иерархию классов вблизи данного класса для определения его отношений с соответствующими классами.

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

· Исходный код для любого метода.

Относящаяся к данному классу информация отображается на текстовой панели браузера после выбора пунктов в панелях списков и в различных меню в панелях. То, что отображается на панели списка браузера, зависит от предшествующего выбора в соседней слева панели. Выбор определенной категории класса отображает классы данной категории в панели названий классов. Выбор определенного класса отображает список категорий сообщений в панели категории сообщений (протоколов). Этот список в зависимости от выбора закладки класс-экземпляр в категории классов будет либо списком категории сообщений экземпляра, либо списком сообщений класса. Затем выбор определенной категории сообщений в панели протоколов отображает селекторы методов этой категории на панели сообщений. Наконец, выбор селектора сообщения вызывает код этого метода, который отображается в текстовом протоколе в нижней панели. Другая информация также может отображаться в текстовой панели, например, определение класса.   

 

 

В целом, система 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, который представляет собой разность между получателем (self) и параметром aNumber. Затем он дает в ответ либо 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) abs

Эта версия удаляет временную переменную и использует метод abs, который уже введен с классом 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> в панели категории классов браузера системы. Эта новая категория классов сначала не будет иметь в своем составе, как и сейчас, никаких классов. Образец для создания нового класса будет отображаться на нижней панели браузера системы.

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

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

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

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

Иконка

Описание

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

Пакет

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

Комплект

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

Браузер системы отделяет средства кода от навигатора, так что разные средства кода могут быть использованы с любым навигатором. Обычно средство 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 часть 2a

Чтобы найти класс, просто вводим его название и выбираем 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 часть 2a

Чтобы создать новое изображение, используем 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

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

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