JavaRush /Курси /Модуль 1: Python Core /Все є об'єктами

Все є об'єктами

Модуль 1: Python Core
Рівень 9 , Лекція 0
Відкрита

1.1 Об'єкти та класи

Сьогодні ти дізнаєшся, як влаштована типова програма на Python. І головна новина: кожна програма на Python складається з класів та об'єктів. Python – це об'єктно-орієнтована мова, і все в ній є об'єктами: числа, рядки, функції і навіть класи є об'єктами.

Так що ж таке класи?

Розпочну з аналогії. Уявіть, що ви хочете зробити невеликий кораблик. Спочатку потрібно зробити креслення, потім віддати його на завод, де за цим кресленням зберуть корабель. Або десяток. Скільки завгодно кораблів. За одним кресленням будуються десятки ідентичних кораблів, ось що важливо.

У програмуванні на Python все точно так само.

Креслення

Програміст — він як проєктувальник. Тільки проєктувальник малює креслення, а Python-програміст пише класи. Потім на основі креслень створюються деталі, а на основі класів — об'єкти.

Спочатку ми пишемо класи (робимо креслення), а потім, під час виконання програми, на основі цих класів Python створює об'єкти. Точно так само, як кораблі створюються на основі креслень.

Креслення одне, але кораблів може бути багато. Кораблі різні, у них різні імена, вони перевозять різні вантажі. Але вони дуже схожі: вони всі — кораблі з ідентичною конструкцією і можуть виконувати аналогічні завдання.

Або ось ще аналогія...

Мурашник

Мурашник — це хороший приклад взаємодії об'єктів. У найпростішому мурашнику є три класи мурах: королева, воїни та робочі мурахи.

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

Це просто ідеальний приклад. У типовій програмі все так само. Є головний об'єкт, який створює об'єкти всіх інших класів. Об'єкти починають взаємодіяти між собою і «зовнішнім світом» програми. Усередині цих об'єктів жорстко запрограмовано їхню поведінку.

Два ці пояснення — це дві сторони однієї медалі. Істина посередині. Перший приклад (про креслення і кораблі) показує зв'язок між класом і об'єктами цього класу. Аналогія дуже сильна. Другий приклад (про мурашник) показує зв'язок між об'єктами, які існують під час роботи програми, і написаними класами.

Спочатку ви повинні написати класи для всіх існуючих у програмі об'єктів, а потім ще й описати їхню взаємодію. Звучить складнувато, але це легше, ніж здається.

У Python всі сутності під час роботи програми є об'єктами, а написання програми зводиться до опису різних способів взаємодії об'єктів. Об'єкти просто викликають методи один одного і передають у них потрібні дані.

Документація

А як дізнатися, які дані передавати в методи? Тут все вже придумано до вас.

Зазвичай у кожного класу є опис, в якому говориться, для чого він створений. Також зазвичай і у кожного публічного методу є опис: що він робить і які дані потрібно в нього передавати.

Щоб використовувати клас, потрібно в загальних рисах знати, що він робить. А також потрібно точно знати, що робить кожен його метод. І зовсім не обов'язково знати, як він це робить. Така собі чарівна паличка.

Давайте подивимось на код — копіювання файлу:


src = open('source.txt', 'r')
dst = open('destination.txt', 'w')
            
for line in src:
    dst.write(line)
            
src.close()
dst.close()
        

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

1.2 Проєктування програми

Проєктування програми — це ціле мистецтво. Це і просто, і складно одночасно. Просто, бо жодних жорстких законів немає: все, що не заборонене — дозволене. Ну а складно теж з цієї причини: дуже багато способів щось зробити, і непросто знайти найкращий.

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

Головне — розуміти, для кого ти пишеш код. Пам'ятай, що твій код призначений для інших програмістів.

Розробка будь-якого продукту — це внесення змін: додали тут, видалили там, переробили тут. І так, маленькими ітераціями, народжуються великі, величезні і гігантські проєкти.

Головна вимога до коду — він має бути зрозумілим іншим програмістам. Неправильний, але зрозумілий код можна виправити. Правильний і незрозумілий код покращити не вийде. Його залишиться тільки викинути.

Так як же писати хороший і зрозумілий код?

Для цього потрібно робити три речі:

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

Що ж стоїть за цими поняттями?

Писати хороший код усередині методів

Якщо у тебе хоча б початковий рівень англійської, можливо, ти звернув увагу, як легко іноді читається код: як речення англійською мовою:

  • class Cat (Pet) – клас Кіт розширює клас ДомашняТварина.
  • while stream: – поки потік не пустий ...
  • a if a < b else b – якщо а менше b, повернути а, інакше повернути b.

Так зроблено спеціально. Python — один з кількох мов, у яких легко писати самодокументований код: код, який зрозумілий без коментарів. У хорошому коді в Python багато методів читаються просто як речення англійською мовою.

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

У Python прийнято писати легко читаний код. Бажано, щоб кожен метод повністю поміщався на екран (довжина методу — 20–30 рядків). Це норма для всього Python-ком'юніті. Якщо код можна покращити, його потрібно покращити.

Найкращий спосіб навчитися писати хороший код — постійна практика. Пиши багато коду, вивчай чужий код, проси більш досвідчених колег зробити рев'ю твого коду. І пам'ятай, що в той момент, коли ти собі скажеш «і так зійде», твій розвиток зупиниться.

Вирішити, які сутності мають бути у програмі

Тобі потрібно писати код, зрозумілий для інших програмістів. Якщо 9 з 10 програмістів при проєктуванні програми зроблять у ній класи A, B і C, то і ти теж повинен зробити у своїй програмі класи A, B і C. Ти повинен писати код, зрозумілий для інших.

Чудовий, працюючий, швидкий, нестандартний код — це поганий код.

Тобі потрібно вивчати чужі проєкти: це найкращий, найшвидший і найпростіший спосіб перейняти всю мудрість, яка десятиліттями накопичувалася в ІТ-індустрії.

І, до речі, у тебе вже є під рукою відмінний, популярний, добре документований проєкт — Python SDK. Почни з нього.

Розбирай класи і структури класів. Думай, чому одні методи зроблені статичними, а інші — ні. Чому у методів саме такі параметри, а не інші. Чому саме такі методи, чому класи називаються саме так і знаходяться саме у таких пакетах.

Коли ти почнеш розуміти відповіді на всі ці питання, ти зможеш писати код, зрозумілий іншим.

Однак хочу застерегти тебе від розбору коду в методах Python SDK. Код багатьох методів був переписаний з метою максимізації швидкості роботи — його читабельність під великим питанням.

Правильно розділяти програму на логічні частини

Будь-яку програму зазвичай розділяють на частини або модулі. Кожна частина відповідає за свій аспект програми.

Ось у комп'ютера є системний блок, монітор, клавіатура, і це все окремі, мало залежні частини. Більше того, їхня взаємодія стандартизована: USB, HDMI і т.п. Зате якщо ти проллєш каву на клавіатуру, ти можеш просто помити її під краном, висушити і користуватися далі.

А ось ноутбук — це приклад монолітної архітектури: логічні частини ніби й є, але інтегровані набагато сильніше. У Macbook Pro, щоб почистити клавіатуру, треба розібрати половину ноутбука. А пролитий на ноутбук кави — привід замовити новий. Тільки не кави.

1.3 Створення своїх класів

Коли ти тільки починаєш програмувати, важливо починати з малого — вчитися створювати власні класи.

Ти їх, звісно, вже створював, але тобі треба вчитися розуміти, які класи мають бути у програмі, як вони мають називатися, які у них мають бути методи. І як вони мають взаємодіяти один з одним.

Список сутностей

Якщо ти не знаєш, з чого почати, почни з початку.

На самому початку проєктування програми ти можеш просто виписати на листок список сутностей (об'єктів), які мають бути у програмі. А потім запрограмувати їх за таким принципом: кожна сутність — окремий клас.

Приклад

Припустимо, ти хочеш написати гру у шахи. Тобі знадобляться такі сутності: шахова дошка і 6 типів фігур. Фігури ходять по-різному, мають різну цінність — логічно, що це окремі класи. І взагалі, на самому початку, чим більше класів — тим краще.

Зустріти програміста-початківця, який замість двох класів написав би десять — велика рідкість. Ось замість десяти написати два, а то і один — це початківці люблять. Тож більше класів, пані програмісти. І твій код стане зрозумілішим для всіх, окрім, можливо, тебе 😛

Шахи

Припустимо, ми вирішили писати класи для шахів: як би ці класи виглядали?

Шахова дошка — це просто масив 8 на 8? Краще зроби для неї окремий клас, який всередині зберігає посилання на масив. Тоді у клас «шахова дошка» ти зможеш додати багато корисних методів, які, наприклад, перевіряють, що клітина порожня чи зайнята.

Загалом, на початку завжди можна керуватися принципом: Програма має різні Сутності, а у Сутності є тип. Ось цей тип — це і є клас.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ