Как объяснить объект? - PullRequest
27 голосов
/ 15 июня 2009

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

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

  • Уровни доступа
  • Наследование
  • Инкапсуляция
  • Полиморфизм
  • Абстракция
  • Интерфейсы

Ответы [ 27 ]

0 голосов
/ 23 июня 2009

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

0 голосов
/ 21 июня 2009

Я предпочитаю думать об муравьях - это дает зрительным ученикам что-то, что можно «увидеть», а вы «рассказать» для слушателей. Сначала сосредоточьтесь на ПОЧЕМУ каждой части, чтобы избежать стеклянных глаз.

Муравей происходит от Насекомого (Наследование) Муравей рабочего, муравей королевы, муравей-дрон - все происходит от муравья (наследования). Универсального «муравья» не существует, все муравьи относятся к производным классам Worker, Queen и т. Д., Но все они имеют одинаковый базовый интерфейс - действия (методы) и свойства.

Рабочий Муравей, Королева муравей, Drone Ant происходят от Ant и, таким образом, демонстрируют специальный полиморфизм, где все они происходят от одного и того же класса Ant и показывают полиморфизм подтипов (наследование) класса Ant, все эти муравьи являются подклассом Муравей классифицирует и наследует 6 ног, 2 глаза, 3 сегмента тела и т. Д. Муравья - Свойства. У Ant также есть методы, ходить, видеть и захватывать способности класса Ant. Таким образом, применение реализации интерфейса более общего класса Ant (Полиморфизм) со свойствами и методами базового класса Ant, но каждый подкласс определяет, как он реализует их.

Рабочие Муравьи имеют различную деятельность и поведение. Они собирают еду, защищают колонию, копают туннели, ухаживают за королевой и т. Д., Но все еще имеют базовые атрибуты муравья (интерфейса). Челюсти используются в каждом поведении - полиморфная функция, которая сама по себе НЕ является полиморфизмом, и, таким образом, вы получаете представление о перегрузке метода для различного использования челюстей - каждый метод имеет базовое сходство (челюсти, захват), но используются разные типы объектов - захватить грязь, захватить другого муравья, захватить еду, захватить грязь от королевы, захватить врага. Это показывает ПОЧЕМУ методы перегрузки, - области специализации в зависимости от того, что схватили - с личинками (молодыми муравьями) и едой обращаются мягко и иначе, чем с врагом, где мы хотим их разорвать.

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

Каждый муравей имеет доступ и возможность манипулировать своими собственными личными атрибутами, ногами, глазами и т. Д., Но не манипулировать другими муравьями глазами и ногами (уровни доступа).

Муравьиная колония - общее пространство имен для муравья - таким образом, муравей Королевы и рабочий муравей могут принадлежать пространству имен муравьиной колонии, а рабочие муравьи имеют доступ к муравьиной королеве, но снаружи ничего не делает (Защищено)

Муравьиные королевы никогда не выходят на улицу нормально - (Уровни доступа)

Каждый Муравей имеет доступ и способность манипулировать своими собственными атрибутами, ногами, глазами и т. Д., Но не манипулировать другими муравьями глазами и ногами (Уровни доступа). Теперь этот муравей знает, где его ноги, где он смотрит, те, что заключены в его экземпляре. Акт инкапсуляции в некоторой степени создает абстракцию здесь.

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

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

0 голосов
/ 15 июня 2009

Используйте примеры из реальной жизни.

  • Животное (интерфейс)
  • Млекопитающее (абстрактный класс)
  • Собака (класс)
  • Ваша собака (экземпляр объекта)

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

0 голосов
/ 20 июня 2009

Начнем с пояснения, что означает объектно-ориентированное проектирование ...


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

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

Каждый тип объекта - это класс, каждый объект одного типа - это объект одного типа.

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

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

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

Далее вы думаете о том, что делают сущности (методы) и как их определить (свойства / поля).

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

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

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

Возможно попасть в конструкторы (как инициализировать определения объекта) и деструкторы (освободить память / файловые дескрипторы / соединения, которые он держит).

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

0 голосов
/ 24 июня 2009

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

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

  • взять PHP ... там, классы не объекты ... объекты имеют переменные и методы ... и это полностью противоречиво ... :) ... просто как плохой пример ...

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

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

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

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

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

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

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

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

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

Greetz

back2dos

0 голосов
/ 24 июня 2009

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

Этот волшебный пример - GUI.

Графический интерфейс имел большой смысл, когда я понял ООП после долгой борьбы.

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

И сложная часть, «Инкапсуляция», которая является не чем иным, как причудливым способом избавить программиста от отладки:)

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

Спасибо

0 голосов
/ 15 июня 2009

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

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

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

Полиморфизм: вы можете управлять Lada и Porche, используя один и тот же интерфейс. Это означает, что вы являетесь полиморфным драйвером:).

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

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