prepod

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

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

       

 

 

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

 

 

 

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

 

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

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

rowser в окне запуска VisualWorks.

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

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

 

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

                       категории/пакеты  классы/поля имен      протоколов      методы/переменные

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


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

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

 

Вставка:

Браузеры являются наиболее важным и наиболее полезным инструментом в 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 часть 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

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

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