HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <h2>Изобретаем ООП</h2>
1 <h2>Изобретаем ООП</h2>
2 <p>Большая часть кода, который мы до этого момента рассматривали, была написана в процедурном стиле: мы использовали переменные и код, их изменяющий. В этом курсе мы научимся писать<em>объектный код</em>. Объектно-ориентированное программирование (ООП) расширяет<em>процедурное программирование</em>, которое является ступенью развития<em>императивного программирования</em>. Позволим себе маленький экскурс в историю и по шагам подойдем к самой идее ООП.</p>
2 <p>Большая часть кода, который мы до этого момента рассматривали, была написана в процедурном стиле: мы использовали переменные и код, их изменяющий. В этом курсе мы научимся писать<em>объектный код</em>. Объектно-ориентированное программирование (ООП) расширяет<em>процедурное программирование</em>, которое является ступенью развития<em>императивного программирования</em>. Позволим себе маленький экскурс в историю и по шагам подойдем к самой идее ООП.</p>
3 <p>Итак,<em>императивное программирование</em>- описание в виде кода последовательности действий, выполнив которые, компьютер выдаст нужный нам результат. Действия выполняются друг за другом, данные от действия к действию передаются с помощью переменных.</p>
3 <p>Итак,<em>императивное программирование</em>- описание в виде кода последовательности действий, выполнив которые, компьютер выдаст нужный нам результат. Действия выполняются друг за другом, данные от действия к действию передаются с помощью переменных.</p>
4 <p>В какой-то момент появляется необходимость выбирать между несколькими путями достижения результата или же повторить некий набор действий несколько раз. Тут на сцену выходит<em>структурное программирование</em>, которое предоставляет нам<em>управляющие структуры</em>- циклы, условные конструкции.</p>
4 <p>В какой-то момент появляется необходимость выбирать между несколькими путями достижения результата или же повторить некий набор действий несколько раз. Тут на сцену выходит<em>структурное программирование</em>, которое предоставляет нам<em>управляющие структуры</em>- циклы, условные конструкции.</p>
5 <p>Программы становятся все больше и со временем становятся слишком сложны для понимания - слишком много действий записано подряд, слишком велика вложенность циклов и условий. Тут на помощь приходит процедурное программирование. И приносит с собой возможность взять самостоятельный кусок кода, снабдить именем, убрать с глаз долой и дальше использовать только это самое имя - так появляются процедуры. В дальнейшем процедуры учатся принимать параметры и возвращать результат вместо использования внешних переменных.</p>
5 <p>Программы становятся все больше и со временем становятся слишком сложны для понимания - слишком много действий записано подряд, слишком велика вложенность циклов и условий. Тут на помощь приходит процедурное программирование. И приносит с собой возможность взять самостоятельный кусок кода, снабдить именем, убрать с глаз долой и дальше использовать только это самое имя - так появляются процедуры. В дальнейшем процедуры учатся принимать параметры и возвращать результат вместо использования внешних переменных.</p>
6 <p>Появление процедур - очень важный шаг. С этого момента программист может<em>расширять язык</em>, дополнять его новыми "словами". Новые слова делают код более понятным, ведь они, как правило, тесно связаны с предметной областью. Кода становится меньше, но каждый шаг начинает нести больший смысл: мелкие детали, вроде сложения чисел, прячутся за именами, означающими действия более высокого уровня - мы уже оперируем не числами, а<em>сущностями</em>, вроде товаров в корзине, пользователей системы, персонажей игры.</p>
6 <p>Появление процедур - очень важный шаг. С этого момента программист может<em>расширять язык</em>, дополнять его новыми "словами". Новые слова делают код более понятным, ведь они, как правило, тесно связаны с предметной областью. Кода становится меньше, но каждый шаг начинает нести больший смысл: мелкие детали, вроде сложения чисел, прячутся за именами, означающими действия более высокого уровня - мы уже оперируем не числами, а<em>сущностями</em>, вроде товаров в корзине, пользователей системы, персонажей игры.</p>
7 <p>Одновременно с процедурами появляются и<em>структуры данных</em>, позволяющие эти самые сущности собирать из отдельных элементов, типа строк и чисел. И тут есть небольшая путаница: структурное программирование названо не в честь структур данных, а именно в честь управляющих структур.</p>
7 <p>Одновременно с процедурами появляются и<em>структуры данных</em>, позволяющие эти самые сущности собирать из отдельных элементов, типа строк и чисел. И тут есть небольшая путаница: структурное программирование названо не в честь структур данных, а именно в честь управляющих структур.</p>
8 <p>Теперь мы имеем процедуры и сущности, которыми они оперируют. И довольно часто одно неотделимо от другого. Процедуры, работающие с персонажем игры, работают только с ним, но не применимы к товарам в корзине. К тому же нам все время нужно где-то хранить эти самые структуры. Вот тут-то и появляется ООП со словами: "Вы можете объединить процедуры и данные в единое целое, которое мы назовем<em>объект</em>.".</p>
8 <p>Теперь мы имеем процедуры и сущности, которыми они оперируют. И довольно часто одно неотделимо от другого. Процедуры, работающие с персонажем игры, работают только с ним, но не применимы к товарам в корзине. К тому же нам все время нужно где-то хранить эти самые структуры. Вот тут-то и появляется ООП со словами: "Вы можете объединить процедуры и данные в единое целое, которое мы назовем<em>объект</em>.".</p>
9 <h2>Сложность, абстракция, слои, протекание</h2>
9 <h2>Сложность, абстракция, слои, протекание</h2>
10 <p>Сокрытие деталей реализации за неким понятием и оперирование в дальнейшем этим понятием как цельной сущностью, называется<em>абстрагированием</em>- получением<em>абстракции</em>. Абстракция позволяет нам думать о важных качествах сущности, и напротив - не думать о том, что менее существенно. Например, нам удобно "просто перемещать" персонажа игры по игровому полю и не думать о представлении координат персонажа в памяти.</p>
10 <p>Сокрытие деталей реализации за неким понятием и оперирование в дальнейшем этим понятием как цельной сущностью, называется<em>абстрагированием</em>- получением<em>абстракции</em>. Абстракция позволяет нам думать о важных качествах сущности, и напротив - не думать о том, что менее существенно. Например, нам удобно "просто перемещать" персонажа игры по игровому полю и не думать о представлении координат персонажа в памяти.</p>
11 <p>Введение абстракций, так же как и добавление в язык управляющих структур и процедур, позволяет<em>управлять сложностью</em>. Если взять одну большую задачу и сравнить два решения: структурную программу и написанную в объектном стиле, то строчек кода в первой может оказаться даже меньше. Но каждый отдельно взятый кусок объектной программы будет проще понять, ведь в структурной программе везде видны детали реализации и за ними очень сложно увидеть общую логику.</p>
11 <p>Введение абстракций, так же как и добавление в язык управляющих структур и процедур, позволяет<em>управлять сложностью</em>. Если взять одну большую задачу и сравнить два решения: структурную программу и написанную в объектном стиле, то строчек кода в первой может оказаться даже меньше. Но каждый отдельно взятый кусок объектной программы будет проще понять, ведь в структурной программе везде видны детали реализации и за ними очень сложно увидеть общую логику.</p>
12 <blockquote><p>Разница в удобстве написания и чтения кода будет видна и при сравнении структурного кода с процедурным. Структуры данных тоже упрощают написание сложного кода. Ведь процедуры и структуры данных - такие же средства абстрагирования.</p>
12 <blockquote><p>Разница в удобстве написания и чтения кода будет видна и при сравнении структурного кода с процедурным. Структуры данных тоже упрощают написание сложного кода. Ведь процедуры и структуры данных - такие же средства абстрагирования.</p>
13 </blockquote><p>Процесс абстрагирования редко завершается: сначала вводятся одни абстракции (персонажи, противники, игровое поле), затем это все прячется за новым<em>уровнем (слоем) абстракции</em>(армия игрока, осада замка, битва в космосе), а затем за еще более высоким (игровая сессия, игра). Кроме того, возможность что-то обобщить и абстрагировать может возникать и при изменении существующего кода.</p>
13 </blockquote><p>Процесс абстрагирования редко завершается: сначала вводятся одни абстракции (персонажи, противники, игровое поле), затем это все прячется за новым<em>уровнем (слоем) абстракции</em>(армия игрока, осада замка, битва в космосе), а затем за еще более высоким (игровая сессия, игра). Кроме того, возможность что-то обобщить и абстрагировать может возникать и при изменении существующего кода.</p>
14 <p>Хорошее разделение на уровни абстракции позволяет на каждом уровне рассуждать только о сущностях этого уровня абстракции - без необходимости спускаться ниже или подниматься выше. Если же, находясь на одном уровне, приходится заглядывать на другие, то мы имеем дело с "протекающими" ("дырявыми", "leaking") абстракциями.</p>
14 <p>Хорошее разделение на уровни абстракции позволяет на каждом уровне рассуждать только о сущностях этого уровня абстракции - без необходимости спускаться ниже или подниматься выше. Если же, находясь на одном уровне, приходится заглядывать на другие, то мы имеем дело с "протекающими" ("дырявыми", "leaking") абстракциями.</p>
15 <p>Как говорил классик Джоэл Спольски: "Все нетривиальные абстракции протекают". При этом вы можете работать с этими "протечками" и контролировать их. Если введение какой-то абстракции способно<em>уменьшить сложность</em>в одном месте без сильного увеличения сложности программы в целом, то стоит подумать о том, чтобы абстракцию ввести. В этом обдумывании и заключается управление сложностью - важная часть работы программиста.</p>
15 <p>Как говорил классик Джоэл Спольски: "Все нетривиальные абстракции протекают". При этом вы можете работать с этими "протечками" и контролировать их. Если введение какой-то абстракции способно<em>уменьшить сложность</em>в одном месте без сильного увеличения сложности программы в целом, то стоит подумать о том, чтобы абстракцию ввести. В этом обдумывании и заключается управление сложностью - важная часть работы программиста.</p>
16 <h2>Разные сложности</h2>
16 <h2>Разные сложности</h2>
17 <p>Выше мы много раз использовали слово "сложность". Важно уточнить: в этом уроке речь не шла о сложности выполнения программы с точки зрения компьютера. Компьютеру тем проще выполнять программу, чем проще код, поэтому с его точки зрения идеальная программа - императивная, без всех этих объектов и процедур. Вот только код гораздо чаще читают люди, чем компьютер. Поэтому нам нужно думать о сложности кода для понимания человеком.</p>
17 <p>Выше мы много раз использовали слово "сложность". Важно уточнить: в этом уроке речь не шла о сложности выполнения программы с точки зрения компьютера. Компьютеру тем проще выполнять программу, чем проще код, поэтому с его точки зрения идеальная программа - императивная, без всех этих объектов и процедур. Вот только код гораздо чаще читают люди, чем компьютер. Поэтому нам нужно думать о сложности кода для понимания человеком.</p>