c++ — Понятие «абстракция» и понятие «объявление»
Диалог:
[Преподаватель]: Абстракцию данных изучали?
[Я]: А подробнее, что именно?
[Преподаватель]: Абстракция — это отделение кода от заголовков. С оставлением прототипов заголовков в файле .h и вынесением всей реализации в .cpp.
[Я]: Вряд ли можно назвать это абстракцией. Это мы проходили.
[Одна из студенток]: А как это назвать тогда?
[Я]: Отделение объявления от определения (реализации).
[Преподаватель]: Ну так это и есть абстракция.
[Я]: Абстракция применяется в ООП в другом ключе…
[Преподаватель]: И то, и другое — это абстракция, просто разной направленности.
У меня есть сомнения насчет применения этих двух понятий в одном ключе.
Что вы думаете?
Если зайти на Википедию, то можно обнаружить статью Абстракция данных, где оно определяется как
Абстра́кция в объектно-ориентированном программировании — это использование только тех характеристик объекта, которые с достаточной точностью представляют его в данной системе.
Основная идея состоит в том, чтобы представить объект минимальным набором полей и методов и при этом с достаточной точностью для решаемой задачи.
В разделе ссылок в статье приводится статья Бьерн Страуструп — Абстракция данных в языке С++, где понятие более детально рассматривается в контексте C++ и определяется как
Фундаментальная идея состоит в разделении несущественных деталей реализации подпрограммы и характеристик существенных для для корректного ее использования.
Хотя разделение кода между заголовочными файлами и файлами реализации может быть необходимо при создании абстракций данных, само по себе такое разделение не является средством создания абстракций. Такое разделение существует так как по историческим причинам в С/С++ используется раздельная компиляция с текстовым препроцессором, который на первом этапе собирает из множества текстовых файлов один длинный текст единицы трансляции.
13Погуглил толкования на английском, одно из лучших описаний:
Abstraction is one of the key concepts of object-oriented programming (OOP) languages. Its main goal is to handle complexity by hiding unnecessary details from the user.
Вольный перевод:
Абстракция это одно из ключевых понятий в объектно-ориентированном программировании (ООП), чьё основное назначение – помогать справляться со сложностью скрывая ненужные детали от пользователя.
То есть, абстракция прямо вытекает в принципы ООП: наследование, инкапсуляция, полиморфизм. Инкапсуляция зачастую выглядит как классы и объекты, которые могут производить сложную логику предоставляя при этом простой интерфейс. В Си++ этот интерфейс выглядит в виде заголовочных файлов, но это лишь одно из технических воплощений как инкапсуляции, так и абстракции в целом. Инкапсуляция реализована и в виде модификаторов доступа полей в C++,
, protected
, которые очень чётко говорят, что является деталями реализации и не должно заботить разработчика-пользователя класса. Но инкапсуляция существует и вне ООП, те же заголовочные файлы были и есть в языке Си, и используются там для тех же целей.
Абстракция также проявляется и в наследовании с полиморфизмом, когда мы можем использовать родительские/абстрактные классы или интерфейсы, и успешно производить какую-то логику с объектами даже не зная их точного типа.
1Удаляторам и минусаторам настоятельно рекомендую отправиться в комментарии и изложить свои аргументы. А также вспомнить о пирамиде Грэма и ее отношению к дискуссии
В контексте C++ «абстракция» (в рамках студенческого и школьного программирования) имеет вполне четкий смысл — это использование класса с чисто виртуальными методами. В нем интерфейс к объекту действительно отделен от реализации, так как реализацию предоставляет экземпляр-наследник.
Разделение на *.h и *.cpp — это следствие технологического процесса сборки программы на C++ (машины были слабенькие, памяти мало, поэтому появилось стремление сделать компилятор однопроходным. А для этого нужно иметь возможность объявить сущность до ее определения), и смешение его в кучу с настоящей абстракцией из ООП как раз и приводит к запутыванию студентов. В процессе преподавания такое нежелательно.
Почему вынос тел функций в *.cpp не является абстракцией? Да потому что нельзя в двух разных файлах держать функцию с одним и тем же именем — компоновщик будет ругаться, придется изобретать какой-то переключатель или тасовать файлы.
14Зарегистрируйтесь или войдите
Регистрация через Google Регистрация через Facebook Регистрация через почтуОтправить без регистрации
ПочтаНеобходима, но никому не показывается
Отправить без регистрации
ПочтаНеобходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Что такое абстракции и интерфейсы — Журнал «Код»
Как в старом анекдоте: про объектно-ориентированное программирование можно рассказать просто и неправильно либо сложно и неправильно. Мы попробуем рассказать про очередной аспект ООП просто.
Зачем это: ООП — одна из главных концепций современной разработки. Она применима не к каким-то конкретным языкам, это скорее способ мышления в программировании. Если вы понимаете ООП, ваш код на любом языке будет чище, читаемее и эффективнее.
В этой статье разберём два сложных понятия из объектно-ориентированного программирования: абстракции и интерфейсы. Это ещё одна ступень в понимании непостижимого.
Основные идеи из ООП
- Объектно-ориентированное программирование построено вокруг объектов. Можно представить, что объект — это коробка, в которой лежат данные и функции.
- Деление на объекты нужно для того, чтобы можно было создавать, обслуживать и переделывать части программы, не влияя на другие части и программу в целом. По-умному это называется «для повышения уровня абстракции».
- Смысл объекта в том, что он умеет делать какие-то свои дела, и остальные объекты не должны знать, как он это делает.
- У объекта есть понятие атрибута и метода. Атрибут — это любые данные, которые хранятся в «коробке» объекта. Методы — это любые действия, которые можно совершать над объектом или внутри его. Атрибуты обычно выражаются переменными, а методы — функциями.
- Объекты необходимы, например, в компьютерных играх, где каждая штучка на игровом поле — это объект с какими-то свойствами. Или в интернет-магазине, где один объект отвечает за корзину, другой — за выкладку товара.
- Объекты можно создавать по шаблону — такие шаблоны называются классами.
Абстракция
Представьте, что вы попросили нескольких человек описать в общих чертах, что такое телефон и как им пользоваться: пусть это будут бабушка, мама и подруга. Бабушка вспомнит про дисковые телефоны и трубки с витым проводом. Мама расскажет про радиотелефоны, у которых есть база и есть трубка, с которой можно ходить по всей квартире, а подруга начнёт описывать мобильник.
Несмотря на то что рассказы будут сильно отличаться между собой, у них будет несколько общих моментов про телефон:
- у телефона есть трубка;
- в трубку мы говорим, из трубки — слушаем;
- можно набрать номер нужного человека и позвонить ему;
- если вам позвонят по телефону, вы это услышите и примете звонок.
Получается, что если представить абстрактный телефон, то получится такое устройство с динамиком, микрофоном и средством набора номера.
Это и есть абстракция: когда мы описываем только самые существенные детали, которые важны для задачи. В нашем случае задача такая — понять, что такое телефон и как им пользоваться. Поэтому микрофон и динамик для этой задачи важен, а способ связи телефона с сетью — нет. Устройство набора номера важно, а то, какая мелодия играет при вызове — нет.
🔥 Абстракция — это когда мы сосредотачиваемся только на существенных для задачи деталях и игнорируем всё остальное. В ООП абстракция означает, что для каждого объекта мы задаём минимальное количество методов, полей и описаний, которые позволят нам решить задачу. Чем меньше характеристик, тем лучше абстракция, но ключевые характеристики убирать нельзя.
Чтобы работать с абстракциями, используют интерфейсы.
Интерфейс
Итак, у нас есть некое устройство с трубкой, микрофоном, динамиком и средством набора номера. Но если вы вспомните рассказы мамы, бабушки и подруги, то обнаружите вот что:
- в микрофон говорят, чтобы собеседник мог вас услышать;
- чтобы слышать самому, ухо прикладывают к динамику;
- чтобы набрать номер, нужно с помощью номеронабирателя вызвать нужную последовательность цифр;
- когда идёт вызов, слышны гудки в динамике.
Всё это — интерфейсы. Они позволяют работать с объектом, не вникая в то, как он устроен внутри. Если вы умеете работать с интерфейсом номеронабирателя, то вам всё равно, нужно ли крутить диск, нажимать физические кнопки на радиотрубке или давить пальцем на сенсорный экран.
Такой интерфейс как бы говорит нам — я передам в телефон любые цифры, какие захочешь. Как я это сделаю внутри и как они будут обработаны — неважно, просто набери номер, а дальше телефон сам разберётся.
Интерфейсы — это действия над объектом, доступные другим объектам (поэтому они называются публичными).
Есть ещё инкапсулированные, то есть внутренние методы. Например, у микрофона есть публичный метод «Слушать голос», и есть внутренний метод «Преобразовать голос в электрические сигналы». С его помощью он взаимодействует с другими частями нашего абстрактного телефона. Про инкапсуляцию будет отдельный материал, потому что тема большая.
Оцифровка звука: как это работает
Сложная терминология
Строго говоря, интерфейсы — это не действия, а методы. Сейчас объясним.
В программировании есть операции — это простейшие действия, например, скопировать значение из одной переменной в другую.
Из простых действий составляются функции — это когда несколько операций «склеиваются» в нечто единое. Мы даём этой склейке название и получаем функцию. Например, может быть функция «проверить правильность электронного адреса», которая состоит из нескольких десятков простых операций.
На языке ООП функции, привязанные к объектам, называются методами. Просто такой термин. По сути это функции, то есть склеенные вместе операции.
Итого: метод — это набор простых действий, которые склеили в единое целое и засунули в объект.
Для чего это всё
Допустим, вы работаете в команде над большим продуктом. В таких случаях удобно разделить одну большую программу на множество мелких подпрограмм и сервисов, каждый из которых решает свою узкую задачу.
Если заранее не договориться о том, как эти компоненты обмениваются данными между собой, то может случиться то, о чём мы уже предупреждали:
- один программист делает функцию, которая отвечает за регистрацию новых пользователей;
- все остальные используют эту функцию, привыкли к её параметрам и знают, что туда нужно передавать;
- внезапно этот программист понимает, что можно запрограммировать более эффективный вариант регистрации, который будет работать гораздо быстрее;
- он полностью переписывает функцию, и в этот момент у всей команды ломается логика программы: старые вызовы не работают, потому что функция теперь принимает другие данные (или в другой последовательности).
Чтобы такого не было, поступают так:
- Один программист отвечает за регистрацию новых пользователей.
- Он делает объект «Пользователь» и прописывает ему интерфейс «Зарегистрировать».
- Также он говорит, что интерфейс «Зарегистрировать» будет принимать на вход три переменные: имя, почту и пароль.
- Теперь программист говорит остальным: «Ребята, если нужно зарегистрировать нового пользователя — используйте интерфейс Пользователь.Зарегистрировать(имя,почта,пароль)».
- Даже если внутри объекта поменяется вся логика работы, то это никак не повлияет на интерфейс — все так же смогут им пользоваться.
- А всё потому, что никому нет дела, как тот программист реализовал свою часть, если через интерфейс всё работает нормально. Неважно, как он шифрует пароль, где хранит почту, как обрабатывает имя и в какую базу данных всё это складывает. Если интерфейс работает, все остальные могут продолжать разработку.
Текст
Михаил Полянин
Редактор
Максим Ильяхов
Художник
Даня Берковский
Корректор
Ирина Михеева
Вёрстка
Мария Дронова
Соцсети
Олег Вешкурцев
4
Даже опытные программисты не всегда понимают ООП. А вы — поймёте. Приходите в Практикум, чтобы постепенно стать опытным программистом.
Прийти в ПрактикумАбстрактное искусство | Тейт
Художественный термин
Абстрактное искусство — это искусство, которое не пытается представить точное изображение визуальной реальности, а вместо этого использует формы, цвета, формы и знаки жестов для достижения своего эффекта
Василий Кандинский
Казаки (1910–191)
Тейт
Строго говоря, слово абстрактное означает отделить или изъять что-то из чего-то другого.
Этот термин может применяться к искусству, основанному на объекте, фигуре или пейзаже, где формы были упрощены или схематизированы.
Он также применяется к искусству, использующему такие формы, как геометрические фигуры или знаки жестов, которые вообще не имеют источника во внешней визуальной реальности. Некоторые художники этой «чистой» абстракции предпочитали такие термины, как конкретное искусство или беспредметное искусство, но на практике слово «абстрактное» используется повсеместно, и различие между ними не всегда очевидно.
Абстрактное искусство часто считается носителем морального аспекта, поскольку оно символизирует такие добродетели, как порядок, чистота, простота и духовность.
С начала 1900-х годов абстрактное искусство стало центральным направлением современного искусства.
Абстракция через столетие
Василий Кандинский
Казаки (1910–191)
Тейт
Электрические призмы 1913
Орфизм (1912–1913 гг. ): придумал французский поэт и искусствовед Гийом Аполлинер. Название происходит от музыканта Орфея в древнегреческих мифах, так как Аполлинер считал, что живопись должна быть похожа на музыку. Основные художники Робер Делоне и Соня Делоне также использовали термин симультанизм для описания своих работ этого периода.
Жоан Миро
Живопись (1927)
Тейт
© Succession Miro/ADAGP, Париж и DACS, Лондон, 2023
Моррис Луи
Альфа-Фи (1961)
Тейт
© Поместье Морриса Луи
Художники-кубисты и фовисты зависели от визуального мира в своих предметах, но открыли дверь для более экстремальных подходов к абстракции. Пионерами «чистой» абстрактной живописи были Казимир Малевич и Пит Мондриан примерно в 19 веке.10–20. Пионером абстрактной скульптуры, взявшей за основу современный мир, был русский конструктивист Наум Габо.
Содержит ли этот текст неточную информацию или язык, который, по вашему мнению, нам следует улучшить или изменить? Мы бы хотели получить от Вас отзывы.
Избранные художники, работающие с абстракцией
Левый Верно
За абстрактным искусством стоит множество теоретических идей. В то время как некоторые придерживаются идеи «искусства ради искусства» (искусство должно быть направлено исключительно на создание красивых эффектов), другие полагают, что искусство может или должно быть похоже на музыку, в том смысле, что музыка представляет собой звуковые паттерны, а эффекты искусства должны создаваться чистыми узорами формы, цвета и линии. Представление древнегреческого философа Платона о том, что высшая форма красоты заключена не в формах реального мира, а в геометрии, также используется при обсуждении абстрактного искусства, равно как и представление о том, что абстрактное искусство, поскольку оно не представляют материальный мир, можно увидеть, чтобы представлять духовный.
Содержит ли этот текст неточную информацию или язык, который, по вашему мнению, нам следует улучшить или изменить? Мы бы хотели получить от Вас отзывы.
Исследуйте этот термин
Левый Верно
Эрик де Шасси
Выставка в галерее Tate St Ives этим летом исследует международный контекст, который формировал творчество художников в городе Корнуолл с 1940-х по 1960-е годы. Как пишет Эрик де Шасси, широкий обмен идеями не ограничивался американскими художниками, такими как Ротко и де Кунинг, но распространялся на французских художников, таких как Николя де Сталь, что также отражало общий интерес к природе и пейзажу
Гэвин Делаханти
Куратор предстоящей выставки немецкой художницы-абстракциониста представляет свои работы, а коллега-художник отдает дань уважения
В этом докладе искусствовед Бенджамин Х. Д. Бухло подробно рассматривает ответы Рихтера таким художникам, как Лучио Фонтана, Жан Фотрие и Роберт Раушенберг в 1962 году
Аудиозаписи конференции «Абстрактные связи», приуроченной к двум крупным выставкам: «Ван Дусбург и международный авангард: конструируя новый мир» и «Аршил Горки: ретроспектива в Тейт Модерн».
Кэтрин Спенсер
Это эссе, в котором американская художница Джей ДеФео помещается в сеть художников-практиков Западного побережья в 1950-х и 1960-х годах, показывает, как ее рельефные картины, наслоенные органическими, геологическими и телесными референтами, составляют то, что можно понимать как «гибридную абстракцию». Это имеет сходство с «эксцентричной абстракцией» и «фанк-артом», но также резонирует с социально-политическим контекстом Америки холодной войны.
Аудиозапись с конференции Abstraction Across Media: Дэвид Смит с Анной Вагнер (Калифорнийский университет, Беркли), Дэвидом Анфамом (Phaidon Press), Алексом Поттсом (Мичиганский университет), Джереми Льюисоном и Ребеккой Смит, дочерью художника
Левый Верно
Левый Верно
Беспредметное искусство определяет тип абстрактного искусства, который обычно, но не всегда, является геометрическим и направлен на передачу ощущения простоты и чистоты
Art Informel — это французский термин, описывающий ряд подходов к абстрактной живописи в 1940-х и 1950-х годах, которые объединяли импровизационную методологию и жесткую технику
Также известное как art informel, art autre переводится как «искусство другого рода» и использовалось для описания доминирующего направления абстрактного искусства в XIX веке. 40-е и 1950-е годы характеризуются импровизационным подходом и высокой жестовой техникой
Жесты — это термин, используемый для описания нанесения краски свободными жестами кисти
В искусстве автоматизм относится к созданию искусства без сознательного мышления, доступу к материалу из бессознательного разума как части творческого процесса
Левый Верно
Абстрактное искусство в Тейт
Левый Верно
java.
Какое правильное определение «абстрактного» в ООП?Задавать вопрос
спросил
Изменено 5 месяцев назад
Просмотрено 417 раз
Я пытаюсь понять определение «абстракции» в ООП.
Я наткнулся на несколько основных определений. Все ли они действительны? Кто-то из них не прав? Я в замешательстве.
Определение 1 :
Абстракция — это процесс моделирования объектов реального мира в языке программирования
Абстракция — это не интерфейсы или абстрактные классы.
Абстракция — это прогресс в моделировании объектов реального мира на языке программирования.
Таким образом, интерфейсы и абстрактные классы — это всего лишь два метода, используемых в этом процессе.
В объектно-ориентированном языке программирования, таком как Java, все является абстракцией: интерфейс, класс, поле, метод, переменная и т. д.
Абстракция — это фундаментальная концепция, на которую опираются другие концепции: инкапсуляция, наследование и полиморфизм
Определение 2 : Абстракция — одна из ключевых концепций языков объектно-ориентированного программирования (ООП). Его основная цель — справляться со сложностью, скрывая от пользователя ненужные детали. Это позволяет пользователю реализовать более сложную логику поверх предоставленной абстракции, не понимая и даже не задумываясь обо всей скрытой сложности.
Оба определения действительны. Различия между определениями во многом обусловлены контекстом. Первый касается роли абстракции в моделировании . Второй — о роли абстракции в программировании .
Мой совет: не зацикливайтесь на поиске «правильного» определения. Эти термины имеют множество значений и интерпретаций. И нет официального арбитра, который бы сказал вам, какое определение правильное. Это НЕ математика…
Определение 1 слишком узкое. «моделирование объектов реального мира в язык программирования» можно рассматривать как абстракцию (хотя я бы предпочел использовать здесь термин «моделирование»), но существует гораздо больше форм абстракции.
Определение 2 лучше.
1Определение 1 точно не объясняет абстракцию. Процесс моделирования объектов реального мира для языков программирования называется ООП. Абстракция — это концепция ООП.
Определение 2 лучше объясняет абстракцию.
Но лучше понять концепцию своими мыслями и словами.
Подумайте о значении слова «абстракция» в английском языке. Это определяется как «качество обращения с идеями, а не с событиями». В ООП аналогично: абстракция — это концепция, при которой вы показываете только важные данные и скрываете от пользователя ненужные детали объекта.
[Очищение] не означает [Абстракцию], Очищение — важное правило Столпа Наследования
[Скрытие] не означает [Абстракция], Сокрытие — важное правило Столпа Инкапсуляции
———
—> Сокрытие или Очищение или Сокрытие или Инкапсуляция Никогда = Абстракция <—
Первое определение это правильный ответ:
Абстракция — это прогресс моделирования объектов реального мира на языке программирования.
—<< Абстракция = Классы = Чертежи = Моделирование некоторых объектов>> —
Абстракция — это первое правило шага и столп столпов ООП…
———
что означает [Классы и интерфейсы] …
[Абстракция] не более чем [Моделирование] …
в целом:
Инженер-строитель не может начать строительство любой дом без чертежа !!
Абстракция =>> ( это первый шаг в ООП
) и ( Столп из всех столпов
)
без абстракции нет классов нет интерфейсов нет абстрактных классов и автоматически нет объектов.