Delphi інкапсуляція, Різне, Програмування, статті

Не ходіть діти в Африку гуляти


Нещодавно я був на Всеросійському з'їзді вчителів інформатики (http://it.teacher.msu.ru/). Без всякого сумніву, це було дуже корисний захід. Іноді починаєш читати Хабре-подібні форуми на тему "як правильно вчити дітей програмуванню", і мозок переходить у стан тихої ейфорії від усвідомлення змістовності дискусії і бронебійно аргументів. Однак це не дозволяє повністю усунути сумніви на тему "а самі-то холіварщікі працюють вчителями?" На з'їзді мені вдалося побути серед вчителів, послухати безліч цікавих доповідей, ознайомитися з широким спектром саме професійних думок, а також висловити ряд власних міркувань.


Тільки не подумайте, що зроблена спроба протиставити автора і вчителів інформатики, тому що ваш покірний слуга в певний період часу (ні, вчителем не работалJ) навчав дітей об'єктно-орієнтованого програмування. Веселе заняття – на голій консолі розповідати дітвора про поліморфізм в С + +! Це до того, що я був абсолютно в темі.


Чого там тільки не було! І навчання COM-технології в 8 класі, і гра в інтелектуально-алгоритмічні пазли, і віртуальні світи … аж завидно стало. Що випало на долю нашого покоління в шкільні роки? Програмування в кодах на MK-61? Вибачте, захопився. Зате відразу згадав, що таке "стік".


Однією з головних озвучених проблем, що стосуються методології викладання та застосовності мов програмування для навчання в школі, виявилося наступне: "Як нам викладати школярам ООП?" або навіть у більш жорсткій постановці "У жодному разі не можна викладати ООП у школі!".


Мотивація


Не буду переказувати зміст поняття "мотивація". На побутовому рівні все і так розуміють, а в нетрі психології лізти неефективно. Вже дуже там багато різних теорій і підходів. Але єдино близьким мені методом "мотивування" школярів є дати можливість зробити щось. Ні, не щось, а цілком конкретну "виріб".


У професійних педагогів є навіть такий термін "проектне навчання". Уявити собі це легко, якщо подумати про курсовий або дипломному проекті. Прошу вибачення, якщо у когось у пам'яті виникли негативні спогади.


Вчителю інформатики сучасні діти ставлять три питання:
– Ви навчіть нас зламувати сайти?
– Ви навчіть нас писати комп'ютерні ігри?
– Скільки ви отримуєте?


Хоча б один з цих трьох питань потрібно відповісти прямо і максимально позитивно, щоб зберегти авторитет. Я знаю потрібну відповідь на одне з цих питань, але він пов'язаний з ООП.


Об'єктно-орієнтоване мислення


Побіжний погляд на інформацію по посиланнях "інкапсуляція" не викликав почуття захоплення, характерного у разі прочитання диспутів "яка мова програмування крутіше". От би таку енергію – та в мирне русло! Взагалі, читаючи пояснення ООП (в цілому) і інкапсуляції (зокрема), складається враження, що нас "за вуха тягнуть", а ми – впираємося. Нас умовляють, а ми відмовляємося. Нам показують, що інкапсуляція корисна, а ми не довіряємо. Нам потрібні аргументи і факти.


Нам не потрібні аргументи. Досить фактів.


Ми сприймаємо навколишній світ образами. Сприйняття – біологічна функція. Формування цілісного образу об'єкта. Природа створила наш мозок об'єктно-орієнтованим. Нас не треба вчити об'єктно-орієнтованого аналізу. Нам тільки потрібно показати графічну нотацію. Або розповісти, як використовувати об'єктно-орієнтована мова для написання програм.


Інкапсуляція


Інкапсуляція – перша парадигма об'єктно-орієнтованого підходу. Парадигма – сукупність ідей і понять, що визначають стиль програмування. Об'єктно-орієнтована мова (наприклад, Delphi) дозволяє використовувати відповідні парадигми, тобто писати в об'єктно-орієнтованому стилі.


Можна уподібнити парадигми програмування правилам спортивної гри. Сукупність ідей і понять, що визначають стиль гри. М'яч, ворота, ігрове поле. Або: ворота, ключка, шайба, ковзани. Клас, об'єкт, поле, метод, властивість. Такі поняття об'єктно-орієнтованої гри мозку.


Я йду в школу. Я (об'єкт) йду (виклик методу) в школу (параметр методу, інший об'єкт).
Гоблін нападає на ельфа. Гоблін (об'єкт) нападає (метод) на ельфа (параметр методу, інший об'єкт).
Ми сприймаємо образи, ми мислимо образами, ми розмовляємо образами. Що тут потрібно пояснювати?


Інкапсуляція – "в капсулі". В оболонці. Немає більш безгоспних змінних і функцій. Вони знаходяться усередині якого-небудь класу. Клас – та сама оболонка. Клас у програмному коді відображає образ і містить в собі складові об'єкта. Проекція образу в мозку на програмний код.


Код на Delphi скаже краще довгих пропозицій.


Goblin1.Attack(Elf1); / / Гоблін № 1 атакує Ельфа № 1


А що таке "гоблін"?


З чого формується образ "гобліна"? Сила атаки, здоров'я, можливість переміщатися, можливість атакувати інші об'єкти. Дві змінні і дві функції, об'єднані загальним поняттям. Що таке: об'єднані загальним поняттям? З точки зору написання об'єктно-орієнтованого коду ці дві змінні і дві функції оголошені усередині класу.


У нашій голові немає безгоспних змінних (якихось елементів пам'яті з ім'ям, здатних зберігати значення). Ми не думаємо в категоріях "функція" – набір дій, виконуваних над абстрактним набором вхідних параметрів.


Мислення образами, програмування образами (класами і об'єктами) – більш природно, ніж оперування змінними та функціями. Нас так задумала природа.


А що таке "приховування"?


Дивно, але тут єдиної думки немає. Часом складається враження, що приховування і є інкапсуляція, а інкапсуляція потрібна для приховування змінних або методів класу. Напевно, логічно (виходячи із значення слів) вважати таким чином.


Інкапсуляція – принцип програмування, коли змінні і функції (процедури) поміщаються в клас. Клас – обмежена область програмного коду, що має назву, в яку поміщені змінні і функції (Процедури). А сенс робити клас? Сенс тільки в тому, щоб максимально наблизити структуру програмного коду до тих образів, які у нас в голові. Як не дивно – для того, щоб було простіше програмувати. Природніше. Зручніше. Приємніше. Не треба ходити на руках або скакати на одній нозі. Робимо так, як нас задумала природа.


Помістили ми щось в оболонку. У нашому випадку змінні і функції (процедури). Але частина з них потрібно закрити, щоб не зіпсувати роботу. В автомобілі є двигун. Зовні він закритий капотом, а від салону ізольований різними панелями. Щоб бруд не потрапляла. І щоб пальці в нього не тицяли. Для блага ж пасажирів. Двигун знаходиться в своєму закритому відсіку. А "назовні" виведені лише кнопки, важелі і педалі. Їх можна (і безпечно) чіпати. З їх допомогою ми управляємо автомобілем. Також і з класами. Частина змінних і функцій ховаються в ім'я безпеки. Інша частина – спеціально робиться доступною, відкритою. Приховування – ізоляція вмісту класу від зовнішнього світу (решти програмного коду). Програміст (творець) класу сам повинен вирішити, що заховати для дотримання безпеки, а що "вивести назовні "як органів управління. Для Delphi частину вмісту класу ховається в розділі private (закритий розділ), а частина – розташовується під директивою public (відкритий розділ).


Інтерфейс


Інтерфейс – відкрита, доступна частина вмісту класу. Навіщо частину вмісту класу відкривається (робиться доступною)? Щоб з об'єктом можна було взаємодіяти. Взаємодія з автомобілем виконується за допомогою його інтерфейсу – кермо, педалі, важелі, кнопки. Якщо неправильним чином спроектувати інтерфейс, клас не буде працювати. Якщо прибрати педаль газу, то автомобіль не зрушить з місця. Однак виводити вихлопну трубу в салон теж не варто. Подібні міркування виглядають тривіально. Але це зайвий раз доводить всю тривіальність (в позитивному значенні) приховування в рамках об'єктно-орієнтованого підходу.


Сенс вчити ООП


Тут головне зрозуміти, що ООП – не мета навчання. Напевно, неправильно говорити "а тепер, діти, ми вивчимо ООП". Повертаючись до теми "мотивації" і "програмування ігор", слід зазначити, що така наступна ланцюжок міркувань цілком ефективна:
"Мотивація -> програмування ігор -> вивчення ООП". Таким чином, ми вивчаємо ООП для того, щоб отримати можливість програмувати складні завдання.


Ми думаємо об'єктно-орієнтованим чином, ми програмуємо об'єктно-орієнтованим чином. Тому ніколи інші мови програмування (логічні, функціональні, наприклад) не будуть настільки природними і, отже, широко поширеними. Вивчати подібні мови аналогічно пізнанню санскриту або арамейської.


Delphi назавжди


І ось тут складно переоцінити ефективність Delphi як мови програмування для викладання інформатики в школі. Природно, на "драйві", на особистісних якостях вчителя можна пройти етап "змінних, циклів, масивів і функцій ". Але в якийсь момент потрібно буде почати" діставати кроликів з шапки ". І тут плавно класичний Pascal починає обростати об'єктно-орієнтованими можливостями, перетворюючись в Delphi. Це стосується і принципу візуального програмування, і можливостями використовувати об'єктно-орієнтовані парадигми. Напевно, немає іншої такої ж ефективної середовища навчання.


А те, що Delphi – професійний інструмент розробки комерційно успішних програм – додатковий мотив. "Діти, ми працюємо в професійному середовищі програмування":
http://www.embarcadero.com/rad-in-action/application-showcase


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*