Основные виды виртуальных конструкторов. Виртуальный конструктор

ВВЕДЕНИЕ

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

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

Основная часть

1. Понятие «Виртуальный конструктор »

Виртуальный конструктор (учебная среда) - это образовательный электронный ресурс, позволяющий в рамках законов и правил, заданных предметной областью, строить модели и работать с ними в объектной технологии.

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

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

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

2. Особенности учебных сред

Компьютерная информационная среда обучения содержит модели изучаемых знаний и является самостоятельным объектом обучения в варианте, возможном без участия учителя, реализуя парадигму: «ученик - учебная среда - технологии». Поскольку здесь информационные объекты не могут рассчитывать на их активизацию и воспроизведение учителем, то и требования к ним должны предъявляться другие, чем в системе «учитель - учебная среда - ученик»:

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

· во-вторых, они должны быть воспроизводимыми и соответственно представлять все системные связи и отношения;

· - в-третьих, они должны содержать максимально возможное количество средств самоактивизации.

В этом, очевидно, большое преимущество компьютерных средств обучения. Их средства управления и пользовательского интерфейса обязаны соответствовать уровню искусственного интеллекта, возлагая на себя часть функций учителя. Таким образом, печатные и компьютерные средства в системе обучения «ученик - учебная среда - технологии» должны соответствовать системному подходу. Такой тип обучения может быть применим в средней школе, во-первых, в дифференцированной форме, а во-вторых, только как надстройка над базовой системой с учетом специфики и профильной направленности обучения. Разумеется, любые печатные и компьютерные средства могут использоваться в полной системе обучения в качестве дополнительных учебных пособий (помимо основных учебников). В этом случае они выступают в качестве иллюстративных аудиовизуальных средств или сборников экспериментального материала, и поэтому к ним не предъявляются никакие требования, кроме требований качества и соответствия целям обучения.

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

3. Основные виды виртуальных конструкторов

Логомиры.

Самой знаменитой учебной средой является Лого. В ЛогоМирах ребенок рисует фантастические пейзажи, сопровождает их письменными и устными текстами, населяет самыми разными персонажами, задавая для них математические законы поведения. Перволого - Лого для маленьких позволяет делать все это тем, кто еще не умеет читать и считать, но хочет научиться этому, а заодно многому другому. Используя прикладные программные средства общего назначения учитель (а тем паче, ученик) может создать собственную специальную образовательную среду для конкретного проекта. Например - нарисовать на экране визитную карточку, которую дети заполняют (с индивидуальной, посильной для них скоростью и грамотностью) придя в первый класс. Внутри компьютера все визитные карточки слетаются в одну общую записную книжку. Компьютер для каждого ученика печатает все листочки этой книжки. Ну, а разукрасить и вырезать сбоку страничку до нужной буквы и сшить в настоящую, не виртуальную, книжку - это дело самого ученика. Эта записная книжка становится для учащегося и его родителей не только полезным информационным продуктом, но и метафорой современной жизни в Сети (Интернете), где каждый рассказывает о себе и может узнать обо всех.

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

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

Применение системы возможно практически в любых предметных областях, включая орнаментальное искусство, историю, географию, домоводство, дисциплины естественно-математического цикла. Система ориентирована на непрограммирующего пользователя. В среде Элкон могут работать дети, начиная с 5-6 лет.

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

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

Разработка такого тезауруса является далеко не тривиальной задачей, а сам тезаурус представляет интеллектуальный продукт. Описание каждого термина в системе его связей становится отдельным исследованием, поскольку эта работа проводится на самом глубоком уровне изучения лингвистического объекта - как в парадигматике (в ряду аналогичных объектов), так и в энциклопедическом аспекте (в системе знаний).

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

При использовании АСКУН достигаются следующие цели:

изучение основной терминологической лексики предметной области и системы семантических связей между понятиями (тематическая и структурная ориентация);

формирование производных словарей (микротезаурусов) на базе основного тезауруса (функциональная ориентация);

ассоциативное усвоение элементов знаний изучаемой предметной области на основе многоаспектного использования словарной информации и графического изображения связей понятий (когнитивная ориентация).

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

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

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

Основные достоинства разработки:

построение формальной модели условия задачи;

возможность исследования задачи на наличие других решений;

приближение объекта к реальному, за счёт учёта свойств элементов многогранника;

идея конструктора задач;

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

Заключение

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

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

Вид ПО : Конструктор
Разработчик/Издатель : Madfinger Games
Версия : 0.1.0
iPhone + iPad : Бесплатно [Скачать из App Store ]

Все без исключения мальчики в детстве обожали собирать конструкторы или модели. Это могли быть автомобили, самолеты и другие реальные объекты, уменьшенные в десятки и сотни раз. И лишь редкие юные конструкторы с возрастом сохранили любовь к своему хобби, продолжая конструировать. Причины на это могут быть самые разнообразные, но это уже выходит за рамки данного материала. Сегодня мы рассмотрим приложение Monzo , которое позволит любому ненадолго вернуться в детство и немного пособирать превосходные трехмерные модели.

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

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

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

Спустя три-пять минут модель будет собрана. Никакой сложности в этом процессе нет. После этого предлагается раскрасить получившийся объект. Для каждой детали можно выбрать свой цвет из богатой палитры доступных красок. Затем можно украсить результат наклейками или стикерами. Вот их размещение реализовано довольно неудобно – один из редких недостатков Monzo.

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

Разумеется, одной моделью утолить жажду конструирования вряд ли возможно. Поэтому в Monzo предусмотрен встроенный магазин, где за реальные деньги можно приобретать новые модели различных механизмов и объектов. Стоят они, разумеется, куда дешевле реальных, которые можно найти в магазинах. Тем не менее, и удовольствие от процесса несравнимо.

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

iPhone + iPad : Бесплатно [Скачать из App Store ]
*включает встроенные покупки

» Виртуальный конструктор в C++

Виртуальный конструктор в C++

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

Для начала вспомним, что дает использование виртуальных функций. Механизм полиморфизма на базе виртуальных функций и наследования позволяет автоматически направлять вызовы производным классам, ничего о них не зная. Если у пользователя есть указатель на базовый класс, значением которого является адрес объекта производного класса, то для вызова некоторого метода производного класса пользователю достаточно знать об интерфейсе базового класса.

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

Фабричные методы, например, на базе обобщенного конструктора (паттерны Factory Method и Prototype), также предназначены для создания объектов без указания их конкретных типов, однако их поведение отлично от поведения виртуального конструктора.

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

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

#include #include #include // Идентификаторы всех родов войск enum Warrior_ID { Infantryman_ID, Archer_ID, Horseman_ID }; class Warrior { public: Warrior(): p(0) { } Warrior(Warrior_ID id); virtual void info() { p->info(); } virtual ~Warrior() { delete p; p=0; } private: Warrior* p; }; class Infantryman: public Warrior { public: void info() { cout << "Infantryman" << endl; } private: Infantryman(): Warrior() {} Infantryman(Infantryman&); Infantryman operator=(Infantryman&); friend class Warrior; }; class Archer: public Warrior { public: void info() { cout << "Archer" << endl; } private: Archer(): Warrior() {} Archer(Archer&); Archer operator=(Archer&); friend class Warrior; }; class Horseman: public Warrior { public: void info() { cout << "Horseman" << endl; } private: Horseman(): Warrior() {} Horseman(Horseman&); Horseman operator=(Horseman&); friend class Warrior; }; Warrior::Warrior(Warrior_ID id) { if (id == Infantryman_ID) p = new Infantryman; else if (id == Archer_ID) p = new Archer; else if (id == Horseman_ID) p = new Horseman; else assert(false); } int main() { vector v; v.push_back(new Warrior(Infantryman_ID)); v.push_back(new Warrior(Archer_ID)); v.push_back(new Warrior(Horseman_ID)); for(int i=0; iinfo(); // ... }

Рассмотрим особенности реализации идиомы виртуального конструктора:

  1. Класс Warrior одновременно является основным классом для конверта и базовым классом для подклассов писем Infantryman, Archer, Horseman.
  2. Пользователи не могут непосредственно создавать воинов разных родов войск, так как конструкторы подклассов писем не являются общедоступными.
  3. Для создания воина некоторого типа используется конструктор конверта Warrior(Warrior_ID id). По полученному идентификатору типа в куче создается объект-воин, адрес которого и присваивается указателю на письмо. При этом в самом письме этот указатель не используется, поэтому при конструировании самого письма будет вызван конструктор по умолчанию Warrior(), который и инициализирует его нулем.
  4. Метод info() в базовом классе должен быть объявлен виртуальным для того, чтобы конверт мог автоматически перенаправить этот вызов в соответствующее письмо по указателю на объект базового класса.
  5. При разрушении конверта его деструктор освобождает память, занимаемую письмом. Это в свою очередь приводит к вызову деструктора базового класса Warrior для письма, где выполняется ничего не делающая команда delete 0.

Узнав о виртуальных деструкторах, естественно спросить: "Могут ли конструкторы то же быть виртуальными?" Если ответить коротко - нет. Можно дать более длинный ответ: "Нет, но можно легко получить требуемый эффект".

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

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

Как правило "виртуальные конструкторы" являются стандартными конструкторами без параметров или конструкторами копирования, параметром которых служит тип результата:

expr(); // стандартный конструктор

virtual expr* new_expr() { return new expr(); }

Виртуальная функция new_expr() просто возвращает стандартно инициализированный объект типа expr, размещенный в свободной памяти. В производном классе можно переопределить функцию new_expr() так, чтобы она возвращала объект этого класса:

class conditional: public expr {

conditional(); // стандартный конструктор

expr* new_expr() { return new conditional(); }

Это означает, что, имея объект класса expr, пользователь может создать объект в "точности такого же типа":

void user(expr* p1, expr* p2)

expr* p3 = p1->new_expr();

expr* p4 = p2->new_expr();

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

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

// копировать `s" в `this"

inline void copy(expr* s);

// создать копию объекта, на который смотрит this

virtual expr* clone(int deep = 0);

Параметр deep показывает различие между копированием собственно объекта (поверхностное копирование) и копированием всего поддерева, корнем которого служит объект (глубокое копирование). Стандартное значение 0 означает поверхностное копирование.

Функцию clone() можно использовать, например, так:

void fct(expr* root)

expr* c1 = root->clone(1); // глубокое копирование

expr* c2 = root->clone(); // поверхностное копирование

Являясь виртуальной, функция clone() способна размножать объекты любого производного от expr класса. Настоящее копирование можно определить так:

void expr::copy(expression* s, int deep)

if (deep == 0) { // копируем только члены

else { // пройдемся по указателям:

left = s->clone(1);

right = s->clone(1);

Функция expr::clone() будет вызываться только для объектов типа expr (но не для производных от expr классов), поэтому можно просто разместить в ней и возвратить из нее объект типа expr, являющийся собственной копией:

expr* expr::clone(int deep)

expr* r = new expr(); // строим стандартное выражение

r->copy(this,deep); // копируем `*this" в `r"

Такую функцию clone() можно использовать для производных от expr классов, если в них не появляются члены-данные (а это как раз типичный случай):

class arithmetic: public expr {

// новых членов-данных нет =>

// можно использовать уже определенную функцию clone

С другой стороны, если добавлены члены-данные, то нужно определять собственную функцию clone():

class conditional: public expression {

inline void copy(cond* s, int deep = 0);

expr* clone(int deep = 0);

Функции copy() и clone() определяются подобно своим двойникам из expression:

expr* conditional::clone(int deep)

conditional* r = new conditional();

r->copy(this,deep);

void conditional::copy(expr* s, int deep)

if (deep == 0) {

expr::copy(s,1); // копируем часть expr

cond = s->cond->clone(1);

Определение последней функции показывает отличие настоящего копирования в expr::copy() от полного размножения в expr::clone() (т.е. создания нового объекта и копирования в него). Простое копирование оказывается полезным для определения более сложных операций копирования и размножения. Различие между copy() и clone() эквивалентно различию между операцией присваивания и конструктором копирования ($$1.4.2) и эквивалентно различию между функциями _draw() и draw() ($$6.5.3). Отметим, что функция copy() не является виртуальной. Ей и не надо быть таковой, поскольку виртуальна вызывающая ее функция clone(). Очевидно, что простые операции копирования можно также определять как функции-подстановки.