Меня однажды спросили в интервью "Каковы 3 основные концепции ООП?". Я ответил, сказав, что, по моему мнению, было 4, которые следующие:
- Наследование
- Герметизация
- Абстракция
- Полиморфизм
Я был прав?
Меня однажды спросили в интервью "Каковы 3 основные концепции ООП?". Я ответил, сказав, что, по моему мнению, было 4, которые следующие:
Я был прав?
Существует 3 требования к объектно-ориентированному языку:
ПРИМЕЧАНИЕ. Абстракция - гораздо более общая концепция; encapsulation и др. являются видами абстракции, так же как подпрограмма является своего рода абстракцией. См. Abstraction
Я бы сказал, что абстракция - это не только концепция ООП, поскольку вы можете в значительной степени абстрагироваться на многих языках, отличных от ООП.
Четыре столпа соответствуют вашему правильному состоянию
Инкапсуляция касается содержащихся данных, не более того, не что иное.
Абстракция касается абстракции данных, т.е. все эти данные действительно актуальны. Подумайте о банке, который содержит информацию о названии, возрасте, адресе, цвету глаз, любимом галстуке и т.д. Являются ли цвет глаз и любимый галстук действительно соответствующими требованиям банков? Нет. Это абстракция.
Наследование имеет дело с обобщением. Информация, которая может применяться к нескольким вещам. Если что-то наследует от чего-то, то можно сказать, что это более конкретный тип этой вещи. Например, Animal. Собака - это тип Животного, поэтому Собака наследует от Животного. Джек Рассел - тип собаки, поэтому Джек Рассел наследует от Собаки.
Полиморфизм имеет дело с вещами, имеющими несколько форм (полиморфный). Два вида программирования,
Вы ссылаетесь на что-то, как на общий тип, и, следовательно, компилятор не знает, что нужно связывать во время компиляции. Подумайте о методе переопределения.
Ранняя привязка
int add(int a, int b) vs double add(double a, double b)
Это, по сути, основные принципы ориентации объектов. Между ними существует много совпадений, поэтому очень важно достичь четкого понимания того, что означает каждое из них.
Это Четыре Всадника, как я их знаю. Возможно, они ошибочно объединяют Наследование и Полиморфизм вместе.
Проблема с ООП заключается в том, что никто не потрудился дать правильное, сжатое, согласованное определение. В частности, я хотел бы отметить, что все аспекты, о которых вы говорили, могут быть приведены в действие без использования объектной ориентации!
Двумя типами систем, которые делают это, является система типа Haskell, которая по консенсусу обычно не рассматривается как объектно-ориентированная и С++-шаблоны с подклассом шаблонов. Однако, возможно, можно утверждать, что подклассы шаблонов эмулируют ООП.
Поскольку подклассы шаблонов не являются широко известным механизмом, позвольте мне привести пример из библиотеки SeqAn, где он был изобретен.
String<Char> cstr = "This is a test";
String<Dna, Packed<> > dstr = "GATTACA";
cout << "length(" << cstr << ") = " << length(cstr) << endl;
cout << "length(" << dstr << ") = " << length(dstr) << endl;
Здесь String<Char>
и String<Dna, Packed<> >
наследуются от "абстрактного класса" String<>
. Они инкапсулируют понятие строки, используя совершенно разные методы. Они разделяют полиморфный метод length
, реализованный по-разному для обоих конкретных типов.
Да, это стандартные четыре.
Некоторые люди объединяют абстрагирование и инкапсуляцию. Я не уверен, почему... они не полностью ортогональны, но, может быть, там достаточно совпадений? Там, конечно, существует совпадение между наследованием и полиморфизмом, но было бы сложно совместить их, на мой взгляд.
Большинство людей считают это правильным, я думаю, если бы они просили три, это было бы Наследование, Инкапсуляция и Полиморфизм.
Я лично считаю, что эти три понятия являются реальным "мясом", если вы позади определения ООП. И большинство людей воспринимают абстракцию как нечто само собой разумеющееся и объединяют ее с другими, так как это действительно можно считать частью любой из трех других.
Когда я говорю об ООП, хотя я всегда упоминаю 4.
Вероятно, последние три - это то, что они искали - наследование может считаться скорее механизмом, помогающим достичь других, которые являются задачами более высокого уровня.
В любом случае, нет правильного ответа, особенно если он ограничен "топ-3".
Это правильно.
Если бы вам пришлось предоставить только одну, Абстракцию, которая должна была быть, так или иначе, остальные три - это просто абстракция в действии.
Это [статья] [1] относится к трем колонкам хорошего кода. Я нашел отличную статью о том, что инкапсуляция является "первым принципом" объектно-ориентированного дизайна.
"Первые" принципы являются фундаментальными, лежащими в основе принципами, из которых все остальные источники. Автор использует пример Золотого правила. Трудно учить детей всем тонкости цивилизованного поведения, но если вы можете заставить их понять (и, что более важно, практику) Золотое правило относиться к другим, как к вам хочется лечиться, тогда они с большей вероятностью "получат", все юридические и моральные стандарты, которые мы проводим ежедневно.
Из этого следует, что если разработчик понимает инкапсуляцию как "первый принцип" объектно-ориентированного развития, все остальные принципы последуют в свое время.
Я не занимаюсь авторским контентом, но я определенно призываю людей читать его.
По какой-то причине я не показываю гиперссылку, так как здесь URL: http://www.netobjectives.com/files/Encapsulation_First_Principle_Object_Oriented_Design.pdf
3 основных понятия в ООП:
Возможно, это был трюк для интервью, но в классах Computer Science в эти дни они учат 4 Pillars объектно-ориентированного программирования.
Правильный ответ на вопрос: "Пожалуйста, уточните, что вы означают объектно-ориентированное программирование". К сожалению, это будет говорить, потому что задаваемый реальный вопрос: "Когда я говорю ООП, что я имею в виду?"
Нет правильного ответа.
В целом считалось, что это основные принципы, но они очень мало связаны с тем, почему было создано OO.
Одним из руководящих принципов была метафора прямого манипулирования. Это создает объект в программе, представляющий объект из ментальной модели пользователя. Большая часть мотивации для создания OO основывалась на психологии, а не на математике /CS, как часто считают, что в наши дни.
Если сомневаться в этом, взгляните на некоторые работы Трюгве Ренскауге. Отец MVC и DCI или Джеймс Коплиен выполняют автор и докладчик.
Итак, я бы сказал, что вы, скорее всего, дали им ответ, близкий к тому, что они ожидали, правильно ли это зависит от того, где вы стоите.