Ім'я файлу: Модуль 4 КПЗ 1ЛК .docx
Розширення: docx
Розмір: 27кб.
Дата: 16.01.2022
скачати
Пов'язані файли:
Лекція 2 ОС ВІНДОВС .docx
Основні характеристики ОС Linux. лк3 docx.docx
ОПЕРАЦІЙНІ СИСТЕМИ лк1 .docx
Windows2_guide.docx
Тестування .pdf

Модуль 4. УДОСКОНАЛЕННЯ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ.

Тема 1. Поняття рефакторингу.

1. Цілі рефакторинга

Рефакторинг - це процес зміни вихідного коду програми без зміни його зовнішньої поведінки.

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

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

Принципи рефакторингу

  1. Рефакторинг (Refactoring): зміна у внутрішній структурі програмного забезпечення, що має на меті полегшити розуміння його роботи та спростити модифікацію, не торкаючись спостерігається поведінки.

  2. Проводити рефакторинг (Refactor): змінювати структуру програмного забезпечення, застосовуючи ряд рефакторингів, не торкаючись його поведінки.

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

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

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

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

(реінжиніринг — це фундаментальне переосмислення і радикальне перепроектування бізнес-процесів з метою досягнення істотного поліпшення якості функціонування.)

2. Причини застосування рефакторинга


Рефакторинг потрібно застосовувати постійно при розробці коду. Основними стимулами його проведення є наступні завдання:

  1. необхідно додати нову функцію, яка недостатньо вкладається в прийняте архітектурне рішення;

  2. необхідно виправити помилку, причини виникнення якої відразу не ясні;

  3. подолання труднощів у командній розробці, які обумовлені складною логікою програми.

Перерахуємо основні ознаки ("попереджувальні знаки" – Мартін Фаулер називав їх "smells"), що вказують на потребу в рефакторингу:

o   Є дублювання коду

o   Метод занадто довгий

o   Цикл занадто довгий або занадто велика вкладеність циклів

o   Клас має погану внутрішню зв'язність

o   Інтерфейс класу не забезпечує достатній рівень абстракції

o   Список параметрів занадто довгий

o   Зміни, що вносяться в клас, мають сегментний характер

o   Зміни вимагають паралельну модифікацію багатьох класів

o   Різні ієрархії класів повинні модифікуватися паралельно

o   Пов’язані між собою дані, що використовуються разом, не організовані в один клас

o   Метод використовує більше членів іншого класу, ніж свого

o   Базовий тип перевизначено

o   Клас не має достатньої функціональної навантаженості

o   В ланцюгу викликів методів є ланцюг параметрів, що передаються

o   Проміжний об’єкт не робить нічого власного

o   Клас занадто зв’язаний з іншим класом

o   Метод має погане ім’я

o   Поля є public

o   Клас-нащадок використовує тільки невелику кількість з методів класу-предка

o   Коментарі використовуються для пояснення складного коду

o   Використовуються глобальні змінні

o   Метод потребує код ініціалізації перед викликом або пост-код після виклику

o   Програма вміщує код, який здається таким, що "може знадобитись колись"

Розглянемо деякі з них.

Дублювання коду

Воно майже завжди означає, що при початковому проектуванні коду не було правильно проведено декомпозицію. Дублювання коду заставляє програміста вносити паралельні зміни. Це суперечить широко відомому принципу DRY - Don’t Repeat Yourself( Не Повторюйте Самі).

Метод занадто довгий

В об’єктно-орієнтованому програмуванні методи величиною більші за екран рідко бувають потрібні і зазвичай означають спробу впхнути принципи структурного програмування в об’єктно-орієнтовану програму.

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

Інтерфейс класу не забезпечує достатній рівень абстракції

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

Зміни, що вносяться в клас, мають сегментний характер

Іноді клас вирішує 2 або більше чітко визначених задач. Якщо так трапляється, програміст модифікує або одну частину класу, або іншу, але дуже рідко зміни зачіпають обидві одночасно. Це явна ознака того, що клас повинен бути розбитим на декілька в чіткій відповідності з задачами.

Пов’язані між собою дані, що використовуються разом, не організовані в один клас.

Якщо є набір змінних, які багаторазово використовуються разом, варто подумати над об’єднанням їх в клас.

В ланцюгу викликів методів є ланцюг параметрів, що передаються

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

Метод має погане ім’я

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

Поля є public

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

Коментарі використовуються для пояснення складного коду

Коментарі є важливими, але вони не повинні слугувати для пояснення поганого коду. Поганий код не потрібно пояснювати – його потрібно переписувати.

3. Ознаки поганого коду

Багато в чому при рефакторінгу краще покладатися на інтуїцію, засновану на досвіді. Проте є деякі видимі проблеми в коді . Що вимагають рефакторинга:

  1. дублювання коду;

  2. довгий метод;

  3. великий клас;

  4. довгий список параметрів;

  5. "Заздрісні" функції - це метод, який надмірно звертається до даних іншого об'єкта;

  6. надлишкові тимчасові змінні;

  7. класи даних;

  8. не GROUP дані.

5. Методи рефакторинга


Найбільш вживані  методи рефакторинга:

  • Зміна сигнатури методу (Change Method Signature)

  • Інкапсуляція поля (Encapsulate Field)

  • Виділення класу (Extract Class)

  • Виділення інтерфейсу (Extract Interface)

  • Виділення локальної змінної (Extract Local Variable)

  • Виділення методу (Extract Method)

  • Генералізація типу (Generalize Type)

  • Вбудовування (Inline)

  • Введення фабрики (Introduce Factory)

  • Введення параметра (Introduce Parameter)

  • Підйом методу (Pull Up Method)

  • Спуск методу (Push Down Method)

  • Перейменування методу (Rename Method)

  • Переміщення методу (Move Method)

  • Заміна умовного оператора поліморфізмом (Replace Conditional with Polymorphism)

  • Заміна спадкування делегуванням (Replace Inheritance with Delegation)

  • Заміна коду типу підкласами (Replace Type Code with Subclasses)


5.1. Зміна сигнатури методу (Change Method Signature)


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

5.2. Інкапсуляція поля (Encapsulate field)


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

5.3. Виділення методу (Extract Method)


Виділення методу полягає у виділенні з довгого і / або вимагає коментарів коду окремих фрагментів і перетворенні їх в окремі методи, з підстановкою відповідних викликів в місцях використання. У цьому випадку діє правило: якщо фрагмент коду потребує коментаря про те, що він робить, то він повинен бути виділений в окремий метод. Також правило: один метод не повинен займати більше ніж один екран (25-50 рядків, в залежності від умов редагування), в іншому випадку деякі його фрагменти мають самостійну цінність і підлягають виділенню. З аналізу зв'язків виділяється фрагмента з навколишнім контекстом робиться висновок про перелік параметрів нового методу і його локальних змінних.

5.4. Переміщення методу (Move Method)


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

5.5. Заміна умовного оператора поліморфізмом (Replace Conditional with Polymorphism)


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

Основні принципи:

  • спочатку слід створити базовий клас і потрібне число підкласів;

  • в деяких випадках слід провести оптимізацію умовного оператора шляхом Виділення методу ";

  • можливе використання Переміщення методу ", щоб помістити умовний оператор в вершину ієрархії спадкоємства;

  • вибравши один з підкласів, потрібно конкретизувати в ньому поліморфний метод базового класу і перемістити в нього тіло відповідної гілки умовного оператора;

  • повторити попередню дію для кожної гілки умовного оператора;

  • замінити весь умовний оператор викликом поліморфного методу базового кла

скачати

© Усі права захищені
написати до нас