Подтвердить что ты не робот

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

Я преподаю С++ около 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
}

а затем завершает этот класс Person и обучает новым вещам, например, почему методы getter и seters evil и избегают доступа, наследования, полиморфизма, создавая другие классы (например, Student, Сотрудник, Модератор и т.д.), Необходимые навыки и концепции ООП.

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

другими основными примерами являются класс Vehicle, класс Shape и т.д.

Я хочу знать ваши идеи о том, как (JUST) начать класс ООП.

ожидает больших идей.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 4

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

Я бы сказал:

  • Какова цель ООП?
  • полиморфизм с наследованием и интерфейсами
  • ответственность объекта
  • Инкапсуляция
  • сообщения между объектами

Ответ 5

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

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

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

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

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

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

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

Ответ 6

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

Ответ 7

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

- Абстракция: я учитель, и вы (студенты) интересуетесь моим учением, а не тем, что я сделал для сбора этих данных и того, что я сделал прошлой ночью. т.е. абстракция НЕ ИЗМЕНИТЬ, ЧТОБЫ ОТПРАВИТЬСЯ В ПОЛЬЗОВАТЕЛЕ.

Ответ 8

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

Ответ 9

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

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