Как вы объясняете OO новым программистам?

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

Я пытался использовать аналогию, как определение класса, похоже на план дома. И экземпляры - это дома, сделанные из этого проекта.

Как вы вообще объясняете классы и OO?

Ответы

Ответ 1

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

    // Assembly: Common Classes
    // Namespace: CommonClasses

    public interface IAnimal
    {
        string Name
        { 
             get; 
        }
        string Talk();
    }

    // Assembly: Animals
    // Namespace: Animals

    public class AnimalBase
    {
        private string _name;
        AnimalBase(string name)
        {
           _name = name;
        }
        public string Name
        {
           get
           {
              return _name;
           }
        }
    }

    // Assembly: Animals
    // Namespace: Animals

    public class Cat : AnimalBase, IAnimal
    {
        public Cat(String name) :
            base(name)
        {
        }

        public string Talk() {
            return "Meowww!";
        }
    }

    // Assembly: Animals
    // Namespace: Animals

    public class Dog : AnimalBase, IAnimal
    {
        public Dog(string name) : 
            base(name)
        {
        }

        public string Talk() {
            return "Arf! Arf!";
        }
    }

    // Assembly: Program
    // Namespace: Program
    // References and Uses Assemblies: Common Classes, Animals

    public class TestAnimals
    {
        // prints the following:
        //
        // Missy: Meowww!
        // Mr. Bojangles: Meowww!
        // Lassie: Arf! Arf!
        //
        public static void Main(String[] args)
        {
            List<IAnimal> animals = new List<IAnimal>();
            animals.Add(new Cat("Missy"));
            animals.Add(new Cat("Mr. Bojangles"));
            animals.Add(new Dog("Lassie"));

            foreach(IAnimal animal in animals)
            {
                 Console.WriteLine(animal.Name + ": " + animal.Talk());
            }    
        }
    }

И как только он получил это гвоздь, вы бросаете ему вызов, чтобы определить Птицу (летать), а затем Пингвин (летать!?)

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

Я начал программировать базовую версию на VIC-20. Не зная ничего другого, я, хотя это было, как все компьютеры были запрограммированы. Я думал, что было немного сложно отслеживать, какие имена переменных я использовал и которые были все еще свободными (проблема с областью). Я также думал, что трудно разделить мою программу на повторяющиеся куски, используя gosub-return и установив и прочитав переменные, которые они будут использовать (отсутствие методов).

Затем я попал в Turbo C по MS-DOS. Теперь я мог бы создать свои собственные методы и функции! Я больше не придерживался старого конечного набора команд в базовом. Мне казалось, что я создаю новый язык для каждой программы, которую я написал. C дал мне более выразительную силу.

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

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

Ответ 4

Я второй подход "животных"!

Эта небольшая статья о JavaRanch: "Как моя собака научилась полиморфизму" мне очень помогли (это почти не зависит от языка):

http://www.javaranch.com/campfire/StoryPoly.jsp

Ответ 5

Пока вы объясняете OO животными, не забудьте проиллюстрировать связь "is-a" с Стенды, вооруженные пингвинами, strong > ; -)

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

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

Ответ 6

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

Класс

Окно - это класс. Он имеет такие методы, как

  • Показать окно
  • Включить окно
  • Установить заголовок окна

В окне есть атрибуты. Это данные, связанные с ним. Он инкапсулирован в класс вместе с функциями, которые работают с ними

  • Окно имеет размеры. Ширина и высота.
  • Окно имеет родительское окно и, возможно, дочерние элементы.
  • Окно имеет заголовок

Объект

Есть много окон. Каждое конкретное окно является объектом класса Window. Родительское окно, содержащее 10 окон, делает 11 объектов Window.

Deriveration

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

  • Кнопка имеет состояние. Он может находиться в нажатом состоянии и в состоянии без нажатия.
  • Кнопка может быть кнопкой по умолчанию в окне.

Ответ 8

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

Обратите внимание, что он работает для ориентированного на класс ООП (который вы хотите), но не для ориентированного на прототип ООП.

Что касается объяснения ООП программисту, я бы добавил примеры, иллюстрирующие:

Отделяющее состояние от поведения

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

Делегирование

Экземпляр делегирует свое поведение своему классу, и класс, в свою очередь, может делегировать свое поведение своим суперклассам (или миксинам или чертам)

Полиморфизм

Если класс A наследуется от класса B, экземпляр A можно использовать везде, где может использоваться экземпляр класса B.

Сообщения и методы

Сообщение (или общая функция или виртуальная функция) похоже на вопрос. В большинстве случаев несколько классов могут ответить на этот вопрос.

Соответствующий метод является возможным ответом на вопрос, который находится в классе.

При отправке сообщения экземпляру экземпляр ищет соответствующий метод в своем классе. Если он найден, он вызывает его (с привязкой к "self" или 'this'. В противном случае он ищет соответствующий метод в своих методах, чертах или суперклассах и вызывает его.

Ответ 9

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

Одна вещь, которую я бы советовал AVOID при попытке передать концепции OO новым программистам, использует только примеры, где объекты (в смысле OO) представляют физические объекты реального мира. Это действительно заставит студентов больше запутаться, когда они столкнутся с объектами, используемыми для представления нефизических объектов (например, цветовой схемы или большинства моделей поведения в "Шаблонах проектирования" ) или объектов, используемых так же, как полезный способ хранения связанных функций и связанных с ними данных в одном и том же месте (например, Java java.lang.Math).

Ответ 10

Верьте или нет, спорт!

У меня был успех в обучении и наставничестве, говоря о том, как, например, игра для футбольной команды описывается с точки зрения того, как различные позиции (Центр, Quarterback, Runningback и т.д.) взаимодействуют для достижения определенной цели. В одной из версий позиции соответствуют классам, а конкретные лица (Тони Ромо, Джонни Юнтас и т.д.) Являются экземплярами класса - индивидуумами, которые демонстрируют одинаковое поведение, определяемое позициями.

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

Наконец, игра похожа на шаблон, в котором описывается, как взаимодействовать набор ролей для достижения определенной цели.

Ответ 11

Объект - это черный ящик, который вы не видите. Публичные методы - это кнопки на них. Защищенные методы - это кнопки, скрытые внизу, частные методы - это dip-переключатели внутри.

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

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

Ответ 12

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

Ответ 14

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

В качестве примера я использую автомобили - "Honda Accord" - это класс, тогда как автомобиль, сидящий на стоянке, является объектом, примером Honda Accord. Honda Accord - это седан, который является автомобилем, который является автомобилем, который является моторизованным транспортным средством, которое является видом транспорта и т.д. Я не могу ничего сделать с автомобилем, пока у меня не будет физического автомобиля, это не помогает мне, что идея Honda Accord существует.

Это также помогает обсуждать интерфейсы и полиморфизм - средства педали газа ускоряются, независимо от того, что делает автомобиль за кулисами, чтобы это произошло. Есть "private" части автомобиля, к которым у меня нет доступа - я не могу напрямую применять отдельный тормоз.

Ответ 15

Поскольку проблема заключается в том, чтобы объяснить новому программисту, а не матери или жене, я бы сразу пошел прямо к делу. OO - это три основные понятия:

  • Наследование: собака - это животное, родитель-ребенок, - это тест на отношения и т.д.
  • Инкапсуляция: public-private (защищенная), скрытие информации, внутренние базовые данные не важны для пользователей класса, защищают пользователей от будущих изменений в реализации.
  • Полиморфизм: привязка во время выполнения, поздняя привязка, метод, который вызывается, зависит от типа объекта, а не от ссылки или указателя на объект.

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

Ответ 16

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

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

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

Ответ 17

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

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

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