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

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

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

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

30
задан Will 23 August 2013 в 15:18
поделиться

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

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

20
ответ дан Robert Gould 23 August 2013 в 15:18
поделиться
  • 1
    В течение четырех с половиной лет у меня был " stask" там и никто не заметил до сих пор. – siride 11 November 2014 в 01:11

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

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

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

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

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

8
ответ дан Guge 23 August 2013 в 15:18
поделиться
  • 1
    любите находить полные ответы на Stackoverflow, которые обычно лучше читают, чем doco. – Spence 1 February 2017 в 00:46

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

2
ответ дан adam 23 August 2013 в 15:18
поделиться
  • 1
    +1. Просто требуемый, чтобы упомянуть, что в C static const переменная не является константным выражением как you' d нужно для размера массива, например. Я предполагаю that' s, почему #define с более популярны в C. – sellibitze 24 February 2010 в 20:11

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

Одна вещь, которой я порекомендовал бы к , ИЗБЕГАЕТ в попытке связаться, понятие OO новым программистам использует только примеры, где объекты (в смысле OO) представляют реальные физические объекты. Это на самом деле сделает студентов [еще 113] перепутанный, когда они встретятся, объекты раньше представляли нефизические объекты (такие как цветовая схема, или большинство поведенческих моделей в "Шаблонах разработки") или объекты, используемые в качестве полезного пути к связанным с хранилищем функциям и связанным данным в том же месте (думают java.lang Java. Математика для примера.)

1
ответ дан afeldspar 23 August 2013 в 15:18
поделиться
  • 1
    @quantum231: Вы имеете в виду, используете макросы вместо const переменные? – John Bode 31 May 2018 в 19:06

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

Некоторые элементы UI также хороши, существуют кнопки, inputboxes и т.д., который все наследовали от некоторого baseobject, который имеет код для управления событиями от нажатия мыши и т.д.

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

0
ответ дан 23 August 2013 в 15:18
поделиться

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

0
ответ дан Andre Steingress 23 August 2013 в 15:18
поделиться

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

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

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

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

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

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

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

20
ответ дан paxdiablo 23 August 2013 в 15:18
поделиться
  • 1
    если мы используем #ifndef #define в начале заголовочного файла, и все еще определяют константы, won' t это быть достаточно? – quantum231 31 May 2018 в 18:54

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

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

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

Разделение состояния от поведения

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

Делегация

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

Полиморфизм

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

сообщения & методы

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

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

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

1
ответ дан Sébastien RoccaSerra 23 August 2013 в 15:18
поделиться
  • 1
    Почему Вы используете магические числа, а не сами константы? Кроме того, это - просто ответ hacky. – Eric Cochran 24 December 2014 в 08:23

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

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

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

0
ответ дан Kevin Le - Khnle 23 August 2013 в 15:18
поделиться
  • 1
    .. это - строка запроса, которая определяется в другом месте. i' ll вырезают его. Та строка также не нужна, это - только если Вы хотите предварительно заполнить запрос, и второй аргумент (ложь) мешает ему выполнить запрос. – bkurzius 14 March 2013 в 21:46

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

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

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

3
ответ дан VonC 23 August 2013 в 15:18
поделиться
  • 1
    @sellibitze: Да, но это главным образом становится проблемой с интегральными константами. Влияние на неинтегральные постоянные объекты незначительно, если вообще существующий. – AnT 24 February 2010 в 21:21

Я второй подход 'Животных'!

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

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

4
ответ дан Ruben Steins 23 August 2013 в 15:18
поделиться

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

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

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

0
ответ дан JohnMcG 23 August 2013 в 15:18
поделиться
  • 1
    Большое спасибо! searchView.clearFocus () является первой частью, отсутствующей до настоящего времени – satyadeepk 19 December 2013 в 19:38

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

0
ответ дан yfeldblum 23 August 2013 в 15:18
поделиться
  • 1
    Этот isn' t названный, если эти SearchView пусто... – Sakiboy 11 April 2017 в 04:14

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

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

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

1
ответ дан yogman 24 August 2013 в 02:18
поделиться
  • 1
    Это должно быть корректным ответом согласно документации, булевской переменной Возвратов: верный, если запрос был обработан слушателем, ложь, чтобы позволить SearchView выполнить действие по умолчанию. developer.android.com/reference/android/widget/… – MrDEV 10 December 2018 в 07:58

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

Класс

, Окно является классом. Это имеет методы как [1 118]

  • Шоу, окно
  • Включает Набору окна
  • заголовок

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

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

Объект

существует много окон. Каждое конкретное окно является объектом класса Окно . Окно Parent, содержащее 10 окон, делает 11 Объектов окна.

Deriveration

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

  • Кнопка А имеет состояние. Это может быть в нажатом состоянии и ненажатом состоянии.
  • Кнопка А может быть кнопкой по умолчанию в Окне.
3
ответ дан Johannes Schaub - litb 24 August 2013 в 02:18
поделиться
  • 1
    +1 для хорошего описания и обучения меня что-то я didn' t знают: " в C++ постоянные объекты имеют внутреннюю связь default" – Michael Burr 25 February 2010 в 06:31

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

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

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

0
ответ дан hasen 24 August 2013 в 02:18
поделиться
  • 1
    Или просто вытяните притон {1} как разность и примените это локально (например, siride' s ответ и комментарии), но это работает также, Спасибо! – rogerdpack 14 May 2016 в 06:58

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

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

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

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

1
ответ дан joel.neely 24 August 2013 в 02:18
поделиться
Другие вопросы по тегам:

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