Как вы объясняете объектно-ориентированный подход новым программистам?

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

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

Как вы объясняете классы и объектно-ориентированный объект в целом?


person Gunnar Steinn    schedule 10.12.2008    source источник
comment
В рамках этого вопроса был задан вопрос об объектно-ориентированном программировании: stackoverflow.com/questions/84125/ Файл дублирован.   -  person George Stocker    schedule 10.12.2008
comment
И что не менее важно, как вы объясните объектно-ориентированный объект старым программистам? ;-)   -  person Ola Eldøy    schedule 10.12.2008
comment
Горток: Да, наверное, вы правы. Однако никто не найдет другого вопроса из-за его названия;) olaeld: Старые программисты, наверное, лучше в своем Cobol ...   -  person Gunnar Steinn    schedule 10.12.2008
comment
старые программисты изобрели ООП, а ты кучка панков! ;-)   -  person Steven A. Lowe    schedule 15.12.2008
comment
Есть новый дубликат с хорошими ответами на странице stackoverflow.com/questions/597267/   -  person UnkwnTech    schedule 28.02.2009
comment
См. также: Сравнение ООП без жаргона с процедурой: stackoverflow.com/questions/1530868   -  person dreftymac    schedule 04.12.2009
comment
Этот вопрос кажется не по теме, потому что он выходит за рамки обсуждения, как описано в справочном центре.   -  person    schedule 23.08.2013
comment
Да, этот вопрос может быть не по теме, но я хотел бы знать, есть ли другой сайт, где он был бы по теме. Я бы хотел провести там немного времени.   -  person Guge    schedule 02.12.2014


Ответы (16)


Серьезно используйте Animals, отлично работает. И вот что помогло мне много лет назад. Только что нашел этот код C #. Это выглядит неплохо

    // 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());
            }    
        }
    }

И как только он это сделает, вы предложите ему дать определение Bird (летать), а затем Penguin (летать !?)

person Robert Gould    schedule 10.12.2008
comment
Животные! Типичный пример ООП. Возвращает меня к некоторым из моих первых уроков программирования =) - person Tom; 10.12.2008
comment
Мне нравится добавлять что-то вроде метода die в абстрактный класс, чтобы проиллюстрировать различия между абстрактами и интерфейсами. - person annakata; 10.12.2008
comment
Убедитесь, что вы не используете C #. Этот код на 90% является шаблоном. Используйте язык сценариев для объектно-ориентированного взаимодействия, затем перейдите на статический язык для объяснения интерфейсов и т. Д. - person Jules; 11.12.2008

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

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

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

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

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

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

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

person paxdiablo    schedule 10.12.2008
comment
+1, Половина проблемы - понять ученика. Вот почему 1: 1 более эффективен, чем классы, потому что вы можете изучить мысли студентов и дополнить свои данные в соответствии с их потребностями. Однако многим не хватает терпения, как мне;) - person Kent Fredric; 10.12.2008
comment
Это определенно правда. Люди учатся намного лучше, если могут опираться на предыдущие знания. - person Jay Conrod; 15.12.2008

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

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

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

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

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

person Guge    schedule 15.12.2008

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

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

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

person VonC    schedule 10.12.2008
comment
Хе-хе, да, эта история была в одной из моих школьных учебников. Отличная история :) - person Gunnar Steinn; 10.12.2008

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

Класс

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

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

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

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

Объект

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

Вывод

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

  • Кнопка имеет состояние. Он может быть как в нажатом состоянии, так и в нажатом состоянии.
  • Кнопка может быть кнопкой по умолчанию в окне.
person Johannes Schaub - litb    schedule 11.12.2008
comment
Я думаю, вы потеряете некоторых людей на Button is a Window - как, почему они спросят - person Axarydax; 24.03.2010

Прочтите руководства по Java, чтобы найти несколько хороших идей и реальных мировые примеры.

person adam    schedule 10.12.2008
comment
+1. Я впервые познакомился с ООП, прочитав руководства по Java (с большим уважением и без написания ни одной строчки, хех). Понятия было интересно читать и облегчили (способ) изучение C ++ позже. - person Tiberiu Ana; 10.12.2008

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

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

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

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

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

Делегация

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

Полиморфизм

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

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

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

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

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

person Sébastien RoccaSerra    schedule 10.12.2008

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

Одна вещь, которую я бы посоветовал ИЗБЕГАТЬ при попытке передать концепции объектно-ориентированного программирования новым программистам, - это использовать только примеры, в которых объекты (в объектно-ориентированном смысле) представляют реальные физические объекты. Это фактически заставит учащихся больше запутаться, когда они столкнутся с объектами, которые используются для представления нефизических объектов (например, цветовая схема или большинство поведенческих паттернов в «Паттернах дизайна») или объектов, используемых просто как полезный способ хранить связанные функции и связанные данные в одном месте (например, Java java.lang.Math).

person afeldspar    schedule 10.12.2008

Вы не поверите, спорт!

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

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

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

person joel.neely    schedule 11.12.2008

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

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

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

person yogman    schedule 11.12.2008

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

person yfeldblum    schedule 10.12.2008

лучшая книга по объектно-ориентированному программированию, которую я когда-либо видел, - это Betrand's «Конструирование объектно-ориентированного программного обеспечения» - если вы действительно хотите получить основы, пути нет.

person Andre Steingress    schedule 10.12.2008

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

Например, я использую автомобили: «Honda Accord» - это класс, а автомобиль, стоящий на стоянке, - это объект, экземпляр Honda Accord. Honda Accord - это седан, автомобиль, автомобиль, моторизованный автомобиль, средство передвижения и т.д. мне не помогает то, что идея Honda Accord существует.

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

person JohnMcG    schedule 10.12.2008

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

  1. Наследование: собака - животное, родитель-ребенок, тест на родство и т. Д.
  2. Инкапсуляция: публично-частное (защищенное), скрытие информации, внутренние базовые детали не важны для пользователей класса, защищают пользователей от будущих изменений в реализации.
  3. Полиморфизм: привязка во время выполнения, поздняя привязка, вызываемый метод зависит от типа объекта, а не от ссылки или указателя на объект.

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

person Kevin Le - Khnle    schedule 10.12.2008
comment
Или отец, или брат? Мне все время приходится объяснять мужчинам нетехнологиям ... - person chryss; 10.12.2008
comment
несмотря на распространенное мнение, я считаю, что сокрытие информации вообще не является частью ООП! smalltalk похож на python тем, что здесь нет явных частных полей. Кроме того, скрытие информации очень хорошо применимо к процедурному программированию. - person hasen; 11.12.2008

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

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

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

person Community    schedule 10.12.2008

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

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

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

person hasen    schedule 11.12.2008