Як проводити рефакторинг?
Відео: Андрій Гордієнко - Рефакторинг коду з використанням PostSharp
У попередній статті ми з Вами розібрали що таке рефакторинг. А в цій статті ми розберемо приклад рефакторінга конкретного працюючого коду. Після прочитання цієї статті Ви дізнаєтесь, як проводити рефакторинг.
Припустимо, у нас є такий PHP-код:
lt ;?php
$ array = array() -
for($ i =0- $ i lt;100000- $ i++){
$ array[$ i]= $ i-
}
$ result =0-
for($ i =0- $ i lt; count($ array) - $ i++){
$ result += round($ array[$ i]* sqrt($ i)) -
}
echo $ result-
?gt;
Це правильно працюючий код, проте, він далеко не ідеальний. Наша з Вами завдання збільшити швидкодію і зменшити кількість коду. Що стосується стилістики, то тут проблем ніяких немає: все зрозуміло і все прекрасно читається.
Відео: BEM (БЕМ) & SMACSS - Sass методології для організації проектів
Почнемо з швидкодії. Я вже писав, як дізнатися час виконання скрипта, тому повторюватися не буду.
Отже, заміривши час роботи даного скрипта у мене вийшло приблизно 0.30 секунди. Перше, що можна відразу виправити - це створення масиву. Справа в тому, що в PHP є дуже проста функція range (), яка робить все рівно так само, як і у нас, тільки швидше:
Відео: Як провести вихідні з користю?!
lt ;?php
$ array = range(0,99999) -
$ result =0-
for($ i =0- $ i lt; count($ array) - $ i++){
$ result += round($ array[$ i]* sqrt($ i)) -
}
echo $ result-
?gt;
Час виконання вже 0.24 секунди, непогано виграли, плюс кількість коду різко скоротилося.
Тепер розберемо дуже популярний вид дублювання, а саме у вказівці умови виходу з циклу. В даному коді ми в кожній ітерації обчислюємо довжину масиву. Але навіщо? Адже вона постійна і не змінюється. Цю «помилку» допускають практично всі професіонали, в тому числі, і я. В основному, просто за звичкою, тому що так пишуть всі. І варто зазначити, якщо масив не дуже великий, то з точки зору читабельності так і варто залишити, але коли масив величезний, то треба писати так:
lt ;?php
$ array = range(0,99999) -
$ result =0-
$ count = count($ array) -
for($ i =0- $ i lt; $ count- $ i++){
$ result += round($ array[$ i]* sqrt($ i)) -
}
echo $ result-
?gt;
Час виконання вже 0.17 секунди, а це вже великий виграш у часі.
Тепер займемося кількістю коду. Ми вже з Вами в цьому напрямі попрацювали, і нам залишилося лише прибрати непотрібні фігурні дужки у циклу. Вони там просто не потрібні, оскільки всередині циклу всього лише один оператор. В результаті, код вийшов таким:
lt ;?php
$ array = range(0,99999) -
$ result =0-
$ count = count($ array) -
for($ i =0- $ i lt; $ count- $ i++) $ result += round($ array[$ i]* sqrt($ i)) -
echo $ result-
?gt;
Можна було ще, звичайно, взагалі обійтися без масиву, а в циклі підставляти замість $ Array [$ i], просто $ i, але припустимо, що за умовами завдання нам потрібно було створити масив. Все, рефакторинг ми завершили і давайте підведемо підсумок. Продуктивність скрипта збільшилася майже в 2 рази, кількість рядків зменшилася в 1.5 рази. Як бачите, навіть в такому, здавалося б, простому скрипті, ми примудрилися так сильно все поліпшити. А вже про ті ж двигуни, я взагалі мовчу, там можна вічно проводити рефакторинг.
- Що нового в php7.1: поліпшення обробки $ this.
- Що таке фільтри в php.
- Як дізнатися знак зодіаку за датою народження в php
- Як дізнатися час виконання скрипта
- Php: безпека. Що таке xss.
- Що таке рефакторинг?
- Як прописати суму, число, цифри прописом в excel
- Сума і числа прописом українською мовою
- Багаторівневе меню на php і mysql
- Сортування двовимірного масиву на php
- Застосування curl
- Функція sscanf в php
- Тестування php-скриптів через curl
- Створення графіків на php
- Цикли в php
- Проста галерея на php
- Парсинг bb-кодів
- Довідкові змінні php
- Створення динамічної функції на php
- Схиляння слів на php
- Створення і перебір масивів в php