Как преподавать Объектно-ориентированное программирование - Какая-либо идея, где запустить?

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

class Person {
public:

 Person();
 ~Person();
 char* getFirstName(); //we can use std::string instead of char* in optimization part
 char* getLastName();
 char* getFullName();
 int getAge();
 bool getGender();
 void printFullProfile();

 void setFirstName(char*);
 void setLastName(char*);
 void setAge(unsigned int); 
 void setGender(bool);
 void setGender(char);//f for female, m for male.

private:
 char* first_name; //or std::string but i prefer to use pointers in the beginning.
 char* last_name;
 unsigned int age;
 bool gender; //ladies 1(st) , male 0
}

и затем завершение этого класса Человека и преподает новые вещи как то, почему метод считывания и методы методов set являются злыми и избегающими средствами доступа, наследованием, полиморфизмом путем создания других классов (как Студент, Сотрудник, Модератор и т.д.), необходимые навыки ООП и понятия.

[Править]: И сделайте эти классы полезными для решения проблем программирования. (Как вычисление зарплаты для каждого объекта Сотрудника, Студенты отмечают среднее число и многих других),

другой основные примеры является классом Механизма, классом Формы, и т.д.

Я хочу знать Ваши идеи о том, как (ТОЛЬКО) запустить класс ООП.

ожидание к прекрасным идеям.

17
задан 14 revs, 5 users 99% 23 August 2013 в 15:23
поделиться

9 ответов

Я бы начал без кода, с CRC карт. Пусть класс разыграет роли карточек и проведет реальный сеанс проектирования OO. Там вы можете ввести принцип единой ответственности, поговорить о "has-a vs is-a" и наследовании, инкапсуляции. Я встречаю слишком много программистов, которые не имеют представления об OO и до сих пор программируют на c++, c#, java или delphi.

[редактировать] Позже вы, возможно, захотите сравнить классы, основанные на javascript (или на себе) и OO, основанные на прототипах, чтобы поговорить о различных способах классификации.

12
ответ дан 30 November 2019 в 11:52
поделиться

Я бы не стал использовать С++ для обучения ООП, потому что С++ - не совсем элегантный язык, а ООП - несколько странный в С++. Я бы предпочел Java или Scala, или, может быть, Python, который является прекрасным языком для обучения. Моим первым выбором был бы Scala, из-за его сильных концепций. Например, нет статических элементов, ломающих оп. Не забывайте, что обучение более эффективно, если программировать весело (C++ не так уж и весело).

Я бы рассказал:

  • Какова цель ООП?
  • полиморфизма с наследованием и интерфейсами
  • ответственностью объекта
  • инкапсуляции
  • сообщений между объектами
4
ответ дан 30 November 2019 в 11:52
поделиться

С ростом важности интерфейсов в современном мире программирования я бы сконцентрировался на том, что делает (ведет) ваш класс, а не на его полях и свойствах. Это помогает усилить концепцию мышления "Is-A" (так же известный как Liskov Sustitution Principle).

.
2
ответ дан 30 November 2019 в 11:52
поделиться

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

.
1
ответ дан 30 November 2019 в 11:52
поделиться

Как мы знаем, понятия "Объект-ориентирован" очень близки человеку, поэтому, когда я начинаю с понятия "оо", я всегда даю примеры в реальном времени, и это очень важно... EX... -- Полиморфизм: Пример полиморфизма в реальном времени - "Я". Я сам вижу, что есть только один человек - это я, но у меня РОЛЬНЫЕ РОЛИ, как, например, когда я дома 1. Я сын отца и матери. 2. Когда я нахожусь в школе, я учитель. 3.когда я нахожусь на земле, тогда я - игрок........ видеть только одного человека, т.е. меня, но у меня разные роли...., т.е. ПОЛИМОРФИСМ

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

1
ответ дан 30 November 2019 в 11:52
поделиться

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

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

У вас может быть связанный класс со списком и попросить их унаследовать от него создание стека или очереди, написав свои собственные методы push/pop, enqueue/dequeue. Или сделать класс из двоичного дерева и попросить их сделать из него двоичное дерево поиска, переопределив метод вставки. Заставьте их работать с динамической памятью, чтобы они могли понять, почему важны [копировать] конструкторы/деструкторы. Пусть напишут класс-таймер, который хранит время в секундах, но использует геттеры/установки для автоматического преобразования в/из минут или часов.

Я не знаю, работали ли ваши ученики с char-массивами или std::strings с самого начала. Заставьте их использовать оба. Когда они поймут, насколько сложными могут быть char-массивы, они больше оценят класс string и поймут, что суть класса - это абстракция, а не просто организация кода. Если ваши студенты когда-нибудь спросят об организации кода и не уверены, куда должно идти конкретное данное или метод, запомните эту цитату:

"На самом деле, я буду утверждать, что разница между плохим программистом и хорошо то, считает ли он свой код или структуры данных. важнее. Плохие программисты беспокоятся о коде. Хорошие программисты беспокоиться о структурах данных и их взаимоотношениях". - Линус Торвальдс

7
ответ дан 30 November 2019 в 11:52
поделиться

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

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

0
ответ дан 30 November 2019 в 11:52
поделиться

начинаются с того, что избегают классов с геттерами и сеттерами. одно из главных обещаний ООП - "данные и программа идут вместе". оно призвано решить давнюю проблему в процедурных программах: изменение структуры данных в одном месте пульсирует настолько далеко, насколько программа движется по потокам данных. ООП решает это, убедившись, что данные остаются на месте. геттеры и сеттеры - это просто механизм обхода ООП (перемещение данных в a->setX(y->getX())), и вы оказываетесь с кучами котловой плиты.

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

6
ответ дан 30 November 2019 в 11:52
поделиться

Как насчет того, чтобы показать, какое отношение все это имеет к программированию ? Чего можно добиться, если кому-то сказать "вы можете использовать классы для моделирования физических объектов, например, скажем, человека"?

Как это связано с тем, что он пытается выучить ? То есть, программирование?

Этот способ "научить" ООП - полная чушь и совершенно бесполезен для любого, кто не уже знаком с понятиями ООП.

Если вы хотите научить ООП, покажите им что-нибудь полезное в программировании . Как такие понятия ООП, как классы, помогают решать актуальные проблемы программирования? И предлагают ли они более чистое решение, чем то, что им пришлось бы использовать в противном случае?

Легко принять абстрактный факт, что "у нас может быть класс Человек". Также достаточно легко принять тот факт, что "мы можем получить от этого класса Person, чтобы создать класс более специализированных людей, таких как уборщики, дети или женщины". Чего не хватает, так это подсказки, как это полезно при программировании. как наследование полезно при решении проблем программирования? Как полезен полиморфизм? Почему нас волнует сокрытие данных?

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

И ради всего святого, используйте std::string вместо char*. Да, это означает, что вы должны сказать своим ученикам, что "std::string - это строка", но, по крайней мере, вам не нужно иметь весь этот беспорядок и шум от управления указателями на символ. Держите свой код чистым и свободным от нежелательных шумов.

3
ответ дан 30 November 2019 в 11:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: