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

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

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

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

10.12.2008 11:44:00
В рамках этого вопроса было задано объектно-ориентированное программирование: stackoverflow.com/questions/84125/… Файл как дубликат.
George Stocker 10.12.2008 12:31:13
И так же важно, как вы объясняете ОО старым программистам? ;-)
Ola Eldøy 10.12.2008 12:47:50
старые программисты изобрели ООП, ты кучка панков! ;-)
Steven A. Lowe 15.12.2008 19:17:01
Этот вопрос кажется не по теме, поскольку не входит в рамки обсуждения, как описано в справочном центре.
user1228 23.08.2013 15:21:41
Да, этот вопрос может быть не по теме, но я хотел бы знать, есть ли другой сайт, где он будет по теме. Я хотел бы провести там некоторое время.
Guge 2.12.2014 12:36:01
17 ОТВЕТОВ
РЕШЕНИЕ

Серьезно используйте животных, это прекрасно работает. И это то, что придало мне эту концепцию несколько лет назад. Только что нашел этот код 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());
            }    
        }
    }

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

20
10.12.2008 11:48:17
Животные! Наиболее существенный пример ООП. Возвращает меня к некоторым из моих самых ранних классов программирования =)
Tom 10.12.2008 12:15:14
Мне нравится добавлять что-то вроде метода «die» в абстрактный класс, чтобы проиллюстрировать различия между рефератами и интерфейсами
annakata 10.12.2008 12:42:51
Убедитесь, что вы не используете C #. Этот код является 90% стандартным. Используйте язык сценариев , чтобы получить OO поперек, а затем перейти на язык статического объяснить интерфейсы и т.д.
Jules 11.12.2008 00:47:56

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

2
10.12.2008 11:48:24
+1. Я впервые попал в ООП, читая руководства по Java (с большим уважением и без написания одной строки, хе). Понятия было забавно читать и облегчали изучение C ++ позже.
Tiberiu Ana 10.12.2008 15:09:17

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

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

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

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

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

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

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

20
10.12.2008 12:09:38
+1, половина проблемы - это понимание ученика. Вот почему 1: 1 более эффективен, чем классы, потому что вы можете учить мысли учеников и дополнять ваши данные в соответствии с вашими потребностями. Однако многим не хватает терпения, как и мне;)
Kent Fredric 10.12.2008 13:10:07
Это определенно правда. Люди учатся намного лучше, если они могут опираться на предыдущие знания.
Jay Conrod 15.12.2008 19:00:35

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

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

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

4
10.12.2008 12:18:12

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

0
10.12.2008 12:19:19

Пока вы объясняете ОО с животными, не забывайте проиллюстрировать отношения "есть-а" с кенгуру, вооруженным ракетами Stinger ;-)

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

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

3
10.12.2008 12:26:58
Хе-хе, да, эта история была в одной из моих школьных учебников. Отличная история :)
Gunnar Steinn 10.12.2008 14:59:34

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

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

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

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

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

Делегация

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

Полиморфизм

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

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

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

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

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

1
10.12.2008 12:28:58

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

0
10.12.2008 12:30:28

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

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

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

0
10.12.2008 15:01:07

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

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

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

0
10.12.2008 15:26:46
Или отец или брат? Я продолжаю объяснять
chryss 10.12.2008 17:41:49
Несмотря на распространенное мнение, я думаю, что сокрытие информации вовсе не является частью ООП! smalltalk похож на python в том смысле, что в нем нет явных «приватных» полей. Кроме того, сокрытие информации очень хорошо подходит для процедурного программирования.
hasen 11.12.2008 00:35:19

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

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

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

0
10.12.2008 15:43:38

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

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

1
10.12.2008 20:01:49

Хотите верьте, хотите нет, спорт !

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

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

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

1
11.12.2008 00:02:35

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

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

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

0
11.12.2008 00:18:25

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

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

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

1
11.12.2008 00:27:06

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

Учебный класс

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

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

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

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

объект

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

Deriveration

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

  • Кнопка имеет состояние. Это может быть как в нажатом состоянии, так и в несжатом состоянии.
  • Кнопка может быть кнопкой по умолчанию в окне.
3
11.12.2008 00:34:17
Я думаю, что вы потеряете некоторых людей из-за «кнопки - окна» - как, почему, они бы спросили
Axarydax 24.03.2010 07:58:56

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

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

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

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

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

8
15.11.2016 11:19:43