21 ошибка программиста PHP. Часть 2 - Неоправданное использование ООП

ОГЛАВЛЕНИЕ

11. Неоправданное использование ООП

Парадигма ООП - замечательный подход к написанию кода. У ООП есть множество неоспоримых преимуществ, самое значительное из которых - возможность использовать заново уже некогда написанный код. Однако все мы рано или поздно осознаём тот факт, что 'PHP - не объектно-ориентированный язык'.
Несмотря на то, что PHP имеет корректно работающую поддержку объектов, использовать объекты там, где можно без них обойтись - недальновидно и неэффективно. Причина? Дело в том, что поддержка парадигмы ООП в PHP реализована не в полном объёме.

Несмотря на присутствие основных элементов, PHP всё-таки не хватает многих "продвинутых" функций (как защищённые члены или закрытые переменные), которые обязательны для "настоящих" объектно-ориентированных языков (например, Java, C++).

Кроме того, поддержка объектов в PHP недостаточно отработана и не очень эффективна. Это означает, что использование парадигмы ООП может существенно снизить скорость выполнения программы.

Примечание: Другими словами, скрипт, работающий на объектах будет исполняться медленнее, как код внутри eval() по сравнению с обычным кодом. Для более наглядных примеров, где использование ООП принимает какие-то уродливые формы, пришлось бы прибегнуть к продвинутым функциям концепциям PHP, некоторые из которых даже незадокументированы. Так что остановимся на этом.

А что же мы сможем без ООП?

Если вы пришли в PHP из Java или C++, где без объектов трудно создать что-либо более или менее серьёзное, то и в PHP вам будет трудно обходиться без них. Но будьте уверены, что серьёзные приложения могут быть написаны и методик и приёмов ООП (PHP был написан на C, а последний, как мы знаем, не поддерживает объектов).

Итак, для тех, кто не привык обходиться без ООП, приведём альтернативные технологии написания связных и расширяемых приложений вне парадигмы ООП:

  • Создание API.
  • Разработка концепции именования (и работа в её рамках).
  • Группирование взаимосвязанных функций в один файл.

Создание API

Соотнесём код программы с тремя уровнями:

  • Первый - собственно рабочие функции.
  • Второй - API функции. Сюда входят функции для построения конкретного приложения.
  • Третий - само приложение:

<?php
// MortgageRate.php (Ипотечный Кредит)

// Уровень первый - внутренние функции
// Внутренние функции для расчёта оптимальной  процентной ставки исходя из времени и размера помесячных выплат

function _mort_find_interest_rate ($total) {
    if (
$total < 30000)
        return (
7.4);
    elseif (
$total > 30000)
        return (
3.2);
    elseif (
$total > 50000)
        return (
2.5);
    else
        return (
1.7);
}

// Уровень второй - API функции

// double calculate_mortgage_rate (int money, int time, int month)
// Рассчитывает процентную ставку исходя из суммы займа, времени погашения и интервала выплат

function calculate_mortgage_rate ($money, $time, $month) {
    
$rate = _mort_find_interest_rate ($money) / 100;
    
$money /= ($time / $month);
    return (
$rate * $money) + $money;
}

?>

<?php
// CalcMortgage.php

// Третий уровень - приложение
// $money, $time и $period получаем  из формы

include_once 'MortgageRate.php';

$price = calculate_mortgage_rate ($money, $time, $period);

print
"Ваша процентная ставка за $period составляет $price";
?>

Разработка концепции именования и работа в её рамках.

Один из самых неприятных моментов при разработке больших приложений - это конфликты пространства имён. Классы его сегментируют. Таким образом, разные классы могут:

  • иметь свойства с одинаковыми именами или
  • содержать в себе методы с одинаковыми именами.

Например, класс Phillips и класс Normal могут одновременно содержать метод с именем screwdriver.

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

Группирование взаимосвязанных функций в один файл

Связанные API функции лучше всего собрать в один файл так же, как связанные методы объединяются в класс. Такие файлы можно представить классами, где каждая функция представляет собой как бы метод этого класса. Так, каждая функция будет иметь ясное определение и прозрачную структуру.

Например, можно было бы все функции, связанные с общением с БД, собрать в файл DB.php.

ООП, как и всё на свете, хорошо в меру

Небольшая оговорка: эта глава была написана не для того, чтобы отговорить вас от использования ООП вообще. Скорее, это была попытка убедить вас не работать с PHP в режиме Java или C++, где ООП - решение номер один.

Проведите тщательный анализ всех выгод и потерь, прежде чем применить объектный подход в PHP.