Читати книгу - "Занурення в патерни проектування, Олександр Швець"
Шрифт:
Інтервал:
Додати в закладку:
Ви можете цілком успішно працювати, не знаючи жодного патерна. Більше того, ви могли вже не раз реалізувати який-небудь з патернів, навіть не підозрюючи про це.
Але якраз свідоме володіння інструментом відрізняє професіонала від аматора. Ви можете забити цвях молотком, а можете й дрилем, якщо дуже сильно постараєтесь. Але професіонал знає, що головна фішка дриля зовсім не в цьому. Отже, навіщо ж знати патерни?
Перевірені рішення. Ви витрачаєте менше часу, використовуючи готові рішення, замість повторного винаходу велосипеда. До деяких рішень ви могли б дійти й самотужки, але багато які з них стануть для вас відкриттям.
Стандартизація коду. Ви робите менше прорахунків при проектуванні, використовуючи типові уніфіковані рішення, оскільки всі приховані в них проблеми вже давно знайдено.
Загальний словник програмістів. Ви вимовляєте назву патерна, замість того, щоб годину пояснювати іншим програмістам, який крутий дизайн ви придумали і які класи для цього потрібні.
Перш ніж перейти до вивчення конкретних патернів, поговорімо про сам процес проектування, про те, до чого треба прагнути і чого потрібно уникати.
Повторне використання кодуНе секрет, що вартість і час розробки — це найбільш важливі метрики при розробці будь-яких програмних продуктів. Чим менші обидва ці показники, тим більш конкурентним продукт буде на ринку і тим більше прибутку отримає розробник.
Повторне використання програмної архітектури та коду — це один з найбільш поширених способів зниження вартості розробки. Логіка проста: замість того, щоб розробляти щось повторно, чому б не використати минулі напрацювання у новому проекті?
Ідея виглядає чудово на папері, але, на жаль, не весь код можна пристосувати до роботи в нових умовах. Занадто тісні зв’язки між компонентами, залежність коду від конкретних класів, а не абстрактних інтерфейсів, вшиті в код операції, які неможливо розширити, — все це зменшує гнучкість вашої архітектури та перешкоджає її повторному використанню.
На допомогу приходять патерни проектування, які ціною ускладнення коду програми підвищують гнучкість її частин, що полегшує подальше повторне використання коду.
Наведу цитату Еріха Гамми 5, одного з першовідкривачів патернів, про повторне використання коду та ролі патернів у ньому.
Існує три рівні повторного використання коду. На самому нижньому рівні знаходяться класи: корисні бібліотеки класів, контейнери, а також «команди» класів типу контейнерів/ітераторів.
Фреймворки стоять на найвищому рівні. В них важливою є тільки архітектура. Вони визначають ключові абстракції для вирішення деяких бізнес-завдань, представлені у вигляді класів і відносин між ними. Візьміть JUnit, це дуже маленький фреймворк. Він містить усього декілька пов’язаних між собою класів: Test, TestCase та TestSuite. Зазвичай фреймворк має набагато більший обсяг, ніж один клас. Ви вклинюєтесь у фреймворк, розширяючи декотрі його класи. Все працює за так званим голлівудським принципом: «не телефонуйте нам, ми самі вам зателефонуємо». Фреймворк дозволяє вам задати якусь свою поведінку, а потім, коли приходить черга щось робити, сам викликає її. Те ж саме відбувається і в JUnit. Він звертається до вашого класу, коли потрібно виконати тест, але все інше відбувається всередині фреймворка.
Є ще середній рівень. Це те, де я бачу патерни. Патерни проектування менші за об’ємом та більш абстрактні, ніж фреймворки. Вони, насправді, є просто описом того, як парочка класів відноситься і взаємодіє один з одним. Рівень повторного використання підвищується, коли ви рухаєтеся в напрямку від конкретних класів до патернів, а потім до фреймворків.
Ще одною привабливою рисою цього середнього рівня є те, що патерни — це менш ризикований спосіб повторного використання, ніж фреймворки. Розробка фреймворку — це вкрай ризикована й дорога інвестиція. У той же час патерни дозволяють повторно використовувати ідеї та концепції у відриві від конкретного коду.
РозширюваністьЗміни часто називають головним ворогом програміста.
Ви придумали ідеальну архітектуру інтернет-магазину, але через місяць довелося додати інтерфейс для замовлень телефоном. Ви випустили відеогру під Windows, але потім знадобилася підтримка macOS. Ви зробили інтерфейсний фреймворк з квадратними кнопками, але клієнти почали просити круглі.У кожного програміста кільканадцять подібних історій. Є кілька причин, чому так відбувається.
По-перше, всі ми починаємо розуміти проблему краще в процесі її вирішення. Нерідко до кінця роботи над першою версією програми ми вже готові повністю її переписати, оскільки стали краще розуміти деякі аспекти, які не були настільки нам зрозумілими спочатку. Зробивши другу версію, ви починаєте розуміти проблему ще краще, вносите ще зміни і так далі — процес не зупиняється ніколи, адже не тільки ваше розуміння, але ще й та сама проблема може змінитися з часом.
По-друге, зміни можуть прийти ззовні. У вас є ідеальний клієнт, який з першого разу сформулював те, що йому потрібно, а ви все це зробили. Чудово! Аж ось виходить нова версія операційної системи, в якій ваша програма перестає працювати. Бідкаючись, ви лізете в код, щоб внести деякі зміни.
Проте, на це все можна дивитися оптимістично: якщо хтось просить вас щось змінити в програмі, отже, вона комусь все ж таки ще потрібна.
Ось чому вже навіть трохи досвідчений програміст проектує архітектуру й пише код з урахуванням майбутніх змін.
Увага!
Сайт зберігає кукі вашого браузера. Ви зможете в будь-який момент зробити закладку та продовжити читання книги «Занурення в патерни проектування, Олександр Швець», після закриття браузера.