что такое абстрагирование в информатике

Абстракция данных

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

Абстракция является основой объектно-ориентированного программирования и позволяет работать с объектами, не вдаваясь в особенности их реализации.

См. также

Примечания

что такое абстрагирование в информатике. 40px Wiki letter w.svg. что такое абстрагирование в информатике фото. что такое абстрагирование в информатике-40px Wiki letter w.svg. картинка что такое абстрагирование в информатике. картинка 40px Wiki letter w.svg.

Полезное

Смотреть что такое «Абстракция данных» в других словарях:

Абстракция — В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете … Википедия

АБСТРАКЦИЯ — (от лат. abstractio отвлечение, отделение) процесс мысленного отвлечения одних свойств и отношений вещей и явлений от других. А. отождествления выделяет общее свойство объектов путем установления отношения эквивалентности или равенства между ними … Философская энциклопедия

АБСТРАКЦИЯ ОТОЖДЕСТВЛЕНИЯ — одна из осн. абстракций математики и логики, позволяющая говорить об одинаковых объектах как об одном и том же объекте. А. о. представляет собой «образование абстрактного понятия путём объединения, отождествления предметов, связанных… … Философская энциклопедия

АБСТРАКЦИЯ НЕРАЗЛИЧИМОСТИ — абстракция, возникающая в практике наблюдения и обусловленная способностью отличать одно от другого, воспринимать как разные к.л. объективно различные воздействия. Поскольку различаемость (разрешающая способность) органов чувств и… … Философская энциклопедия

абстракция — АБСТРАКЦИЯ (от лат. abstractio выделение, отвлечение или отделение) теоретический прием исследования, позволяющий отвлечься от некоторых несущественных в определенном отношении свойств изучаемых явлений и выделить свойства существенные и… … Энциклопедия эпистемологии и философии науки

АБСТРАКЦИЯ — (лат. abstractio отвлечение, удаление введено Боэцием как перевод греческого термина, употреблявшегося Аристотелем) одна из важнейших операций мышления. Мысль человека отвлекает нечто от непосредственно данного воспринимаемого представления и… … Новейший философский словарь

абстракция неразличимости — АБСТРАКЦИЯ НЕРАЗЛИЧИМОСТИ эмпирический аналог философской (логической) идеи о тождестве неразличимых. Принята в рамках интервальной методологии с целью уточнения понятий о тождестве и различии в ситуациях, когда отсутствует априорная… … Энциклопедия эпистемологии и философии науки

АБСТРАКЦИЯ — (лат. abstractio отвлечение, удаление введено Боэцием как перевод греческого термина, употреблявшегося Аристотелем) одна из важнейших операций мышления. Мысль человека отвлекает нечто от непосредственно данного воспринимаемого представления и… … Социология: Энциклопедия

Поток данных — У этого термина существуют и другие значения, см. Поток. Не следует путать с Многопоточность. Поток данных (англ. stream) в программировании абстракция, используемая для чтения или записи файлов, сокетов и т. п. в единой… … Википедия

Типы данных — В этой статье перечисляются типы данных, о самом понятии см тип данных В различных операционных системах, языках программирования, спецификациях форматов данных фигурируют различные символические обозначения для типов данных. Часть из них… … Википедия

Источник

Абстракция — ключ к простому коду

что такое абстрагирование в информатике. ymj z0tgzazraw50myn0vpacwo. что такое абстрагирование в информатике фото. что такое абстрагирование в информатике-ymj z0tgzazraw50myn0vpacwo. картинка что такое абстрагирование в информатике. картинка ymj z0tgzazraw50myn0vpacwo.

Есть ли способ улучшить свои навыки в 10 раз? Есть ли какой-то волшебный секрет, который — если бы вы только знали это — открыл бы для вас совершенно новый мир мастерства и производительности в разработке программного обеспечения?

Вот где сомневающиеся думают: «Здесь не удастся срезать углы! Каждый должен практиковаться, чтобы стать хорошим!» И это действительно так, но что практикуют специалисты чтобы ускорить разработку программного обеспечения, и есть ли одна ключевая вещь, которая может иметь огромное значение?

Но даже если я поделюсь им с вами — даже если я подробно изложу его для вас — вам может потребоваться 10 лет, чтобы вырасти и полностью оценить его простоту.

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

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

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

Секрет того, чтобы быть в 10 раз более продуктивным, заключается в овладении абстракцией. Многие разработчики относятся к «абстракции» как к грязному слову. Вы можете услышать совет, например, «не абстрагируйтесь слишком рано» или знаменитое в Zen Python «явное лучше, чем неявное», подразумевая, что конкретное лучше, чем абстрактное. И все это хорошие советы — в зависимости от контекста.

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

Абстракция — ключ к простому коду

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

«Простота — это вычитание очевидного и добавление значимого».
— Джон Маэда: The Laws of Simplicity

Абстракция это не улица с односторонним движением. Она сформирована двумя дополнительными понятиями:

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

«Если вы трогаете одну вещь с глубоким осознанием, вы касаетесь всего».
— Тхих Нхат Хань

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

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

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

Представьте себя программистом, который популяризировал использование операции map в таких языках программирования, как JavaScript. Map абстрагируется от таких деталей, как тип данных, которые вы сопоставляете, тип структуры данных, содержащей данные, и логики итерации, необходимой для перечисления каждого узла данных в структуре данных. Это повысило эффективность каждого приложения, созданного мной за последнее десятилетие.

Джереми Ашкенас сделал несколько таких операций популярными в JavaScript и проложил путь для многих великолепных синтаксических ярлыков, которые мы теперь считаем само собой разумеющимся в JavaScript, впервые применив их в CoffeeScript. Он создал Underscore, которая породила Lodash (все еще самый популярный инструмент для функционального программирования в JavaScript) и Backbone, который популяризировал архитектуру MVC в JavaScript и заложил основу для Angular и React.

Джон Резиг сделал jQuery, который был настолько популярным и влиятельным, что он сформировал самую большую коллекцию повторно инкапсулированных модулей JavaScript (плагинов jQuery), пока через несколько лет не появились стандартные модули Node и модули ES6. API селектора jQuery был настолько влиятельным, что стал основой современного API DOM. Я почти ежедневно получаю пользу от этого API, когда я тестирую компоненты React.

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

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

«Дайте мне достаточно длинный рычаг и точку опоры, на которую я мог бы опереться, и я сдвину с места весь мир.»
— Архимед

Ключ к простоте: секрет, который мы ищем, — это как уменьшить объем кода, который мы создаем, — как сделать намного больше с гораздо меньшим количеством. Когда вы овладеете этим, вы станете программистом в 10 раз лучше. Я гарантирую это.

что такое абстрагирование в информатике. rdkllrbtrth kdpceb. что такое абстрагирование в информатике фото. что такое абстрагирование в информатике-rdkllrbtrth kdpceb. картинка что такое абстрагирование в информатике. картинка rdkllrbtrth kdpceb.

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:

Источник

Зачем нужны абстракции и интерфейсы

И что это вообще такое?

Как в старом анекдоте: про объектно-ориентированное программирование можно рассказать просто и неправильно либо сложно и неправильно. Мы попробуем рассказать про очередной аспект ООП просто.

Зачем это: ООП — одна из главных концепций современной разработки. Она применима не к каким-то конкретным языкам, это скорее способ мышления в программировании. Если вы понимаете ООП, ваш код на любом языке будет чище, читаемее и эффективнее.

В этой статье разберём два сложных понятия из объектно-ориентированного программирования: абстракции и интерфейсы. Это ещё одна ступень в понимании непостижимого.

Основные идеи из ООП

Абстракция

Представьте, что вы попросили нескольких человек описать в общих чертах, что такое телефон и как им пользоваться: пусть это будут бабушка, мама и подруга. Бабушка вспомнит про дисковые телефоны и трубки с витым проводом. Мама расскажет про радиотелефоны, у которых есть база и есть трубка, с которой можно ходить по всей квартире, а подруга начнёт описывать мобильник.

Несмотря на то что рассказы будут сильно отличаться между собой, у них будет несколько общих моментов про телефон:

Получается, что если представить абстрактный телефон, то получится такое устройство с динамиком, микрофоном и средством набора номера.

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

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

Чтобы работать с абстракциями, используют интерфейсы.

Интерфейс

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

Всё это — интерфейсы. Они позволяют работать с объектом, не вникая в то, как он устроен внутри. Если вы умеете работать с интерфейсом номеронабирателя, то вам всё равно, нужно ли крутить диск, нажимать физические кнопки на радиотрубке или давить пальцем на сенсорный экран.

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

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

Есть ещё инкапсулированные, то есть внутренние методы. Например, у микрофона есть публичный метод «Слушать голос», и есть внутренний метод «Преобразовать голос в электрические сигналы». С его помощью он взаимодействует с другими частями нашего абстрактного телефона. Про инкапсуляцию будет отдельный материал, потому что тема большая.

Сложная терминология

Строго говоря, интерфейсы — это не действия, а методы. Сейчас объясним.

В программировании есть операции — это простейшие действия, например, скопировать значение из одной переменной в другую.

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

На языке ООП функции, привязанные к объектам, называются методами. Просто такой термин. По сути это функции, то есть склеенные вместе операции.

Итого: метод — это набор простых действий, которые склеили в единое целое и засунули в объект.

Для чего это всё

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

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

Чтобы такого не было, поступают так:

Источник

Причуды абстракций

что такое абстрагирование в информатике. a5fd52fe7dd306faa01234d00644e3d9. что такое абстрагирование в информатике фото. что такое абстрагирование в информатике-a5fd52fe7dd306faa01234d00644e3d9. картинка что такое абстрагирование в информатике. картинка a5fd52fe7dd306faa01234d00644e3d9.

Что такое абстракция?

Википедия определяет абстракцию и процесс абстрагирования следующим образом:
Абстра́кция (от лат. abstractio — отвлечение) — отвлечение в процессе познания от несущественных сторон, свойств, связей объекта (предмета или явления) с целью выделения их существенных, закономерных признаков; абстрагирование; теоретическое обобщение как результат такого отвлечения.

В европейской философии и логике абстрагирование трактуется как способ поэтапного продуцирования понятий, которые образуют всё более общие модели — иерархию абстракций. Наиболее развитой системой абстракций обладает математика. Степень отвлечённости обсуждаемого понятия называется уровнем абстракции. В зависимости от целей и задач, можно рассуждать об одном и том же объекте на разных уровнях абстракции.

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

Зачем нужна абстракция?

Абстракции выполняют защитную функцию и помогают нам не сойти с ума от переизбытка информации. Представьте, как бы нам жилось, если при письме шариковой ручкой пришлось бы думать о том, что миллиарды молекул чернил взаимодействуют с молекулами бумаги, чтобы получилась буква. Другими словами, не тратя время на ненужные подробности, мы можем ухватить самую суть — взглянуть на проблему «сверху».
что такое абстрагирование в информатике. c2f14bfde236d246798456823849b888. что такое абстрагирование в информатике фото. что такое абстрагирование в информатике-c2f14bfde236d246798456823849b888. картинка что такое абстрагирование в информатике. картинка c2f14bfde236d246798456823849b888.
Если бы не фотография с высоты птичьего полета, можно ли было бы себе представить насколько правильно спроектирована Барселона? Кстати, про пример с шариковой ручкой, читать бы тоже не получилось — начертания одной и той же буквы на письме отличаются даже у одного человека.

Абстрактное мышление — это механизм, который позволяет нам перерабатывать и усваивать кучу новых сведений. Если бы не было абстракции, то единственный вариант для нас — это остаться очень примитивными существами.
что такое абстрагирование в информатике. b922d3294df6db9e2dccdfeb0bc164b5. что такое абстрагирование в информатике фото. что такое абстрагирование в информатике-b922d3294df6db9e2dccdfeb0bc164b5. картинка что такое абстрагирование в информатике. картинка b922d3294df6db9e2dccdfeb0bc164b5.
В Бразилии живет племя небольшое племя индейцев Пираха. Представители этой народности обладают крайне скудным абстрактным мышлением. Их алфавит состоит из трех гласных и восьми согласных. У них нет слов, обозначающих цифры, вместо цифр у них два понятия — несколько и много. У них нет цветов — только понятия светлый и темный, времени и истории — они живут только сегодняшним днем и помнят только то. что помнит старейший из ныне живущих; нет — религии, ремесел, искусства. У них еще много чего нет в нашем привычном понимании. И это все потому, что не развито абстрактное мышление. Правда, справедливости ради, стоит отметить, что при этом они себя ощущают абсолютно счастливыми людьми!

Итак, абстрагирование нам нужно как способ познания и описания окружающего мира, для обмена информацией друг с другом. Абстракции позволяют провести декомпозицию предметной области на набор понятий и связей между ними.
что такое абстрагирование в информатике. b5adbb732661d34ce26d504ddab71bf8. что такое абстрагирование в информатике фото. что такое абстрагирование в информатике-b5adbb732661d34ce26d504ddab71bf8. картинка что такое абстрагирование в информатике. картинка b5adbb732661d34ce26d504ddab71bf8.
На картинке изображен Legoland в Лондоне. Несмотря на то, что все предметы собраны из детского конструктора, мы без труда узнаем в них дома, окна, двери, городские кварталы, людей.

Барьеры и побочные эффекты абстракций

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

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

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

На самой первой картинке изображены две фигуры, собранные из щепок, так что при определенном освещении они отбрасывают «человеческие тени». Мне, например, кажется, что там один силуэт мужской, а другой — женский. Это тоже побочный эффект абстракций. Теперь мы можем классифицировать все фигуры по их тени.

Примеры абстракций

Сфера примененияАбстракцияКомментарий
Целые числаЧисло из кольца Zp, где p = 2^разрядность (8, 16, 32, 64 бита)Данная абстракция позволяет представить целые числа только из отрезка –p/2+1 до p/2. Побочный эффект – проблема переполнения.
Вещественные числаЧисла с плавающей точкойВещественных чисел несчетное число, а чисел с плавающей точкой — всего лишь конечное. Это значит, что несчетное количество вещественных чисел представлены одним числом с плавающей точкой. Побочный эффект – ошибка округления, из-за который два числа нельзя сравнивать с помощью операции сравнения, а лишь по модулю некоторого маленького epsilon |a-b| a == b, или a/b*1000 может сильно отличаться от a*1000/b. Появилась даже целая дисциплина в математике – численные методы, которая изучает как организовать вычисления с плавающей точкой так, чтобы результаты не сильно отличались от вычислений с вещественными числами.
ДеньгиЧисла с плавающей точкойПогрешность округления чисел с плавающей точкой делает, если не невозможным их использование для финансовых операций, то, по крайней мере, сильно усложняет жизнь. В любом случае, я бы сначала подумал в сторону написания отдельного класса для денежных единиц.
ИзображениеМашинная графикаМашинная графика развивается семимильными шагами, чтобы сделать изображение на экране компьютера все более реалистичным.
Программное обеспечениеПроцедураПроцедура является базовым элементом декомпозиции в процедурном программировании. Побочный эффект — процедура жестко заданная последовательность команд, которую невозможно изменить без переписывания самой процедуры.
Программное обеспечениеКлассО классах будем говорить ниже.
Предметная областьАбстракция сущности и связи между сущностямиПобочный эффект — отражает представление, заблуждения, предубеждения и т.д. о предметной области конкретного субъекта.
Бизнес-логикаПроцедураКак уже говорилось выше — побочный эффект процедуры — жесткая последовательность команд. Бизнес-логика же подвержена изменениям, как правило содержит много исключений, о которых пользователи обычно забывают рассказать. Попытка представить бизнес-операцию в виде процедуры часто делает терпит неудачу.
Программное обеспечениеПоток для распараллеливания операцийМногопоточное программирование получилось настолько сложным для восприятия, что немного людей в нем разбирается.
Квадрат — это прямоугольник, у которого все стороны равны.Класс квадрат нельзя наследовать от прямоугольника.Классы — это абстракции. У них есть свои собственные свойства, которые отличаются от математических объектов и которые делают невозможным наследование.

Классы

Гради Буч так определяет ООП:
Объектно-ориентированное программирование — это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.

В этом определении самый важный момент — это иерархия наследования. Потому что именно наследование отличает ООП от всех других методологий.

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

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

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

Второй побочный эффект, который стоит отметить — чужой код всегда менее понятный, чем свой собственный.

что такое абстрагирование в информатике. image loader. что такое абстрагирование в информатике фото. что такое абстрагирование в информатике-image loader. картинка что такое абстрагирование в информатике. картинка image loader.
Разберемся почему так происходит. Когда человек пишет код, для него естественнее двигаться снизу вверх — от более низкоуровневых компонент к более высокоуровневым. Сначала написали один класс, потом второй, который зависит от первого, затем третий, который зависти от первого и второго, четвертый — от третьего и т.д.

Когда же человек пытается понять чужой код, он как раз двигается наоборот — сверху вниз. То есть сначала понимает общую суть, затем разбивает на компоненты, потом пытается понять суть каждого компонента и т.д. Часто эти движения мысли снизу вверх и сверху вниз у разных людей не совпадают. Естественно, что изучающему чужой код было бы легче, если разбиение кода на компоненты совпадало с его собственными убеждениями, как надо делать. Если это не так, придется затрачивать определенные усилия, чтобы понять ход мыслей разработчика. Поэтому, когда кто-то говорит, что здесь «полный хардкод», но если я перепишу, то будет все проще и понятнее. Это всегда 100% правда… Но только для него, для остальных ценность переписывания уже не так очевидна.

Кстати, если ничего не предпринимать специально, то при разработке снизу вверх, код становится сильно связанным между собой, то есть не повторно используемым. Чтобы побороть этот эффект надо следовать принципу инверсии зависимостей (The Dependency Inversion Principle).

Проиллюстрируем как проявляется описанный побочный эффект на простом примере. Многие жители крупных городов закупаются в крупных супермаркетах. Предположим, что жена отправляет мужа за покупками и, чтобы он не забыл, как обычно, чего-нибудь, составляет список «для тех кто в танке».
Постараемся проследить ход ее мыслей:
— Так чего я сегодня буду готовить на ужин?
— Надо приготовить чего-нибудь вкусненькое, чтобы побаловать ребенка.
— Так, нужна будет мука, молоко.
— Кажется в миксере сели батарейки.
— Стоп! Ребенку нужны витамины. Морковь. Буду делать морковный сок. и мандарины. Скоро же Новый год!
— А хлеб дома есть? Нет, кажется, нет.Значит, надо купить!
— Еще надо купить масло.
— Забыла про ребенка — витамины. Купить яблоки.
— Чего-то ручка плохо пишет. Наверное скоро кончатся чернила. Надо купить!
— Так, ребенку надо купить сока.
— А еще игрушку — пусть порадуется.
— Картошка у нас есть на борщ? На борщ хватит, но на неделю нет. Значит тоже надо купить.
— Чуть не забыла учительница просила принести две тетради.
— К борщу нужна сметана.
— Вроде сахар кончился.
— Ребенок любит виноград.
— И еще надо купить бутилированной воды.

Когда приходит муж в магазин то, что он обнаруживает? Указанные в списке товары оказываются в разных частях магазина. Обычно список длинный, поэтому запомнить что-либо, что было уже куплено достаточно трудно. На это накладывается, что какие-то отделы временно закрыты — идет выгрузка товаров, какого-то товара нет в продаже, плюс толчея, зимняя одежда. Более опытные товарищи ходят с карандашом или ручкой с очень озабоченным видом и постоянно смотрят в свой список. Но, в итоге, все равно, что-нибудь да забудешь купить. По своему опыту могу сказать, что это «что-нибудь» окажется самым важным, из-за чего вообще и стоило ехать в магазин.

Еще одно важное наблюдение — невозможно по самим абстракциям определить насколько удачными они получились. Это можно сделать, только если мы попытаемся их использовать на практике. И тут уж выясняется, что одни абстракции лучше подходят для задачи, а другие — хуже. А если еще немного изменить исходные условия, то и прежний «хороший» набор абстракций уже может не работать. Например, второй список покупок из примера перестанет работать, если прийти с ним в другой магазин с иным порядком выкладки товаров. Он станет ничем не лучше, чем первый.
Отсюда вывод — невозможно придумать набор классов, который подойдет на все случаи жизни. В статье The Open-Closed Principle это называется стратегическая замкнутость.

Естественный вопрос, а как сразу создавать хорошие абстракции. Увы, но на этот счет нет точного ответа. Зато со временем выработался набор практик, который говорит, как надо поступать, и обещает, что в этом случае будет хороший результат. К таким практикам относится рефакторинг, стандарты кодирования, code review, объектная гимнастика и т.д. Цель данных практик — направить ход мыслей группы разработчиков в одном направлении, тогда шансов, что чужой код будет понятнее, станет больше. Отношение к каждой из практик у отдельно взятого человека зависит лишь от приобретенного им опыта использования практики. Часто слова «Это не работает» надо интерпретировать как «Я пробовал — у меня не получилось». Нет никаких объективных аргументов «ЗА», равно как и «ПРОТИВ».

Так зачем нужно тогда ООП?

Проведем параллели между естественным языком и ООП

естественный языкООП
Словокласс
ПравилаСинтаксис
ЖанрАрхитектура
литературные приемыпаттерны

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

Меня всегда удивляют, статьи в стиле Почему я люблю X или Почему я не люблю X. Все прекрасно понимают, что X — инструмент. Ведь нет же таких статей про лопату. Хотя, кто знает, ведь ООП существует несколько десятилетий, а лопата несколько тысяч, и быть может где-нибудь в в каменном веке шли жестокие холивары на тему, что лучше лопатка мамонта или мотыга из камня?

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *