Как я могу описать объектно-ориентированное программирование для начинающих? Есть ли хорошая реальная аналогия? - PullRequest
4 голосов
/ 26 января 2011

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

Он хорошо в Matlab (который я не знаю), а затем я помог ему, когда он изучал основы Python. Довольно скоро его курсы начнутся на C и C ++. Я беспокоюсь, что он останется позади, когда появится объектно-ориентированное программирование.

Я попытался объяснить ему аналогию с автомобилем.

псевдокод:

Class Car 
{
    public string make;
    public string model;
    private string milesPerGallon;
    private float gasolineGallonsInTank = 0;
    private float tankCapacity;
    private float odometer = 0;

    public Car(maxGas, mpg) 
    {
        tankCapacity = maxGas;
        milesPerGallon = mpg;
    }

    public void fillTank() 
    {
        gasolineGallonsInTank = tankCapacity;
    }

    public void drive(float miles) 
    {
        if (miles == 0) 
        {
            print("You don't want to drive?");
            return;
        }

        if(miles < 0)
        {
            print("Ok, we're driving in reverse!");
            miles = Math.AbsoluteValue(miles);
        }

        float maxDistance = gasolineGallonsInTank / milesPerGallon;
        if (maxDistance >= miles)
        {
            odometer += maxDistance;
            gasolineGallonsInTank = 0;
            print("You've run out of gas!");
            return;
        }

        odometer += miles;
        gasolineGallonsInTank -= miles / milesPerGallon;

    }

    public float readOdometer()
    {
        return odometer;
    }

}

Я сказал, что класс Car был похож на автомобильный завод, а var mySedan = new Car(12, 20) был похож на производство новой машины с 12-галлонным бензобаком и 20 миль на галлон. Затем я показал ему, как можно использовать методы, и это было похоже на то, как что-то происходит с машиной.

Затем я сделал вторую машину: var myMiniVan = new Car(21.5, 14) и показал, как методы бега на одной машине не влияют на другую.

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

Ответы [ 5 ]

1 голос
/ 26 января 2011

Наш учитель использовал:

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

Также, насколько я помню, было несколько хороших примеров в OOA & Dкнига Грэди Буча .

На первом семинаре ООП мы сделали довольно необычное интересное упражнение: мы реализовали «классы» в C (не в C ++).Нам приходилось использовать структуры и указатели на функции - это давало нам почувствовать, что такое состояние, что такое поведение, что такое класс и объекты.Затем мы перешли к C ++.

ОБНОВЛЕНИЕ

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

1 голос
/ 26 января 2011

Может быть, вам стоит взять программу, которую он понимает (например, на python).И покажите ему преимущества следующего подхода.Вот как я выучил C ++, имея некоторые базовые знания C.Но я думал, что ваше объяснение было уже достаточно ясным.

1 голос
/ 26 января 2011
0 голосов
/ 28 июня 2011

Программирование лучше всего изучать на практике.

Работайте с ним над написанием простого приложения для адресной книги. (Не нужно ничего сохранять, поскольку это опыт обучения ООП.) Создайте класс CEntry, который будет представлять каждую запись в адресной книге. Он будет содержать такие вещи, как имя человека, почтовый адрес, город, штат, почтовый индекс и номер телефона. Создайте еще один класс CName, в котором будут члены first, middle, и last. Наконец, создайте третий класс CPhone, который будет иметь членов для country, area_code, prefix и number. Когда он пишет, вы можете объяснить, почему использование классов имеет смысл для этого приложения, а также преимущества и недостатки наличия CEntry наследования от CName и CPhone или содержания новых экземпляров этих классов. *

0 голосов
/ 27 января 2011

Еще одна хорошая аналогия (особенно для студентов инженерных специальностей) - это детали машин.

Возьмите карбюратор.Карбурретор А предназначен для удовлетворения определенных требований к определенному двигателю, включая ИНТЕРФЕЙС (обычно закрытый прокладкой, которая также соответствует интерфейсу) между коллектором и карбюратором.

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

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

ВНУТРИ карбюратора, есть все, что происходит, чтобы лучше контролировать поток топлива и измерять вакуумное давление с помощью трубок Пито и тому подобное.Это сродни ЧАСТНЫМ функциям и методам.Средства, с помощью которых карбюратор знает, что при заданном давлении вакуума X мне нужно подать количество топлива Y и объем воздуха Z в коллектор.

Хотя это не обязательно делает хорошую работу по описанию закрытых переменных-членов, методов получения и установки и т. Д., Оно МОЖЕТ помочь в концепции методов Интерфейс, Исключение и Приват против Public.Для меня это было поначалу труднее понять, чем закрытые переменные-члены и тому подобное (особенно часть "Интерфейс" ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...