Улучшение качества кода в [закрытом] CakePHP

Увеличение размера кучи - это не «исправление», это «штукатурка», на 100% временная. Это снова рухнет в другом месте. Чтобы избежать этих проблем, напишите высокопроизводительный код.

  1. Используйте локальные переменные везде, где это возможно.
  2. Убедитесь, что вы выбрали правильный объект (EX: выбор между String, StringBuffer и StringBuilder)
  3. Используйте хорошую систему кодирования для вашей программы (EX: Использование статических переменных VS не статических переменных)
  4. Другие вещи, которые могут работать с вашим кодом.
  5. Попытайтесь двигаться с многозаходной резьбой
13
задан DanCake 3 July 2009 в 20:35
поделиться

3 ответа

Чтобы добавить новую переменную, вам необходимо создать плагин и реализовать точку расширения org.eclipse.ui.editors.templates.

Вы должны внести подкласс org.eclipse.jface.text.templates.TemplateVariableResolver, который будет реализовывать различные методы разрешения, чтобы разрешить заполнитель для желаемых значений.

См. здесь для получения справки по точке расширения и примера который вносит переменные ant.

Как говорит Мэтт Б., вам часто просто нужно определить свой текст как шаблон, поэтому реализация переменной для этого является излишним.

] = $ this-> Auth-> user ();

Замены для $ _ POST :

<?php
    ...
    //foreach ($_POST as $key => $value) {
    foreach ($this->params['form'] as $key => $value) {
    ...
    //if (isset($_POST['test_ipn'])) {
    if (isset($this->params['form']['test_ipn'])) {
    ...
?>

Урок 2 : представления предназначены для совместного использования (с пользователем )

Документированный код «Компилирует премиальную информацию и отправляет пользователя в Paypal» не отправляет пользователя в PayPal. Вы выполняете перенаправление в представлении?

<?php
    function redirect($premiumId) {
        ...
        $this->redirect($url . '?' . http_build_query($paypalData), 303);
    }

Перенаправляете в конце вашего контроллера и удаляете представление. :)

Урок 3 : Управление данными относится к уровню модели

<?php
class PremiumSite extends AppModel {
    ...
    function beforeSave() {
        if ($this->data['PremiumSite']['type'] == "1") {
            $cost = Configure::read('App.costs.premium');
            $numberOfWeeks = ((int) $this->data['PremiumSite']['length']) + 1;
            $timestring = String::insert('+:number weeks', array(
                'number' => $numberOfWeeks,
            ));
            $expiration = date('Y-m-d H:i:s', strtotime($timestring));
            $this->data['PremiumSite']['upfront_weeks'] = $weeks;
            $this->data['PremiumSite']['upfront_expiration'] = $expiration;
            $this->data['PremiumSite']['cost'] = $cost * $numberOfWeeks;
        } else {
            $this->data['PremiumSite']['cost'] = $cost;
        }
        return true;
    }
    ...
}
?>

Урок 4 : Модели не только для доступа к базе данных

Переместите документированный код «Включает премиум-сайт после оплаты» в модель PremiumSite , и вызовите его после оплаты:

<?php
class PremiumSite extends AppModel {
    ...
    function enable($id) {
        $transaction = $this->find('first', array(
            'conditions' => array('PaypalNotification.id' => $id),
            'recursive' => 0,
        ));
        $transactionType = $transaction['PaypalNotification']['txn_type'];

        if ($transactionType == 'subscr_signup' ||
            $transaction['PaypalNotification']['payment_status'] == 'Completed') {
            //New subscription or payment
            ...
        } elseif ($transactionType == 'subscr-cancel' ||
            $transactionType == 'subscr-eot') {
            //Subscription cancellation or other problem
            ...
        }
        return $this->saveAll($data);
    }
    ...
}
?>

Вы бы позвонили из контроллера, используя $ this-> PaypalNotification-> PremiumSite-> enable (...); , но мы не собираемся этого делать, поэтому давайте смешаем все вместе ...

Урок 5 : Источники данных - это здорово

Преобразуйте ваши взаимодействия PayPal IPN в источник данных, который используется моделью.

Конфигурация находится в app / config / database.php

<?php
class DATABASE_CONFIG {
    ...
    var $paypal = array(
        'datasource' => 'paypal_ipn',
        'sandbox' => true,
        'api_key' => 'w0u1dnty0ul1k3t0kn0w',
    }
    ...
}
?>

Источник данных имеет дело с запросами веб-сервисов ( app / models / datasources / paypal_ipn_source.php )

<?php
class PaypalIpnSource extends DataSource {
    ...
    var $endpoint = 'http://www.paypal.com/';
    var $Http = null;
    var $_baseConfig = array(
        'sandbox' => true,
        'api_key' => null,
    );

    function _construct() {
        if (!$this->config['api_key']) {
            trigger_error('No API key specified');
        }
        if ($this->config['sandbox']) {
            $this->endpoint = 'http://www.sandbox.paypal.com/';
        }
        $this->Http = App::import('Core', 'HttpSocket'); // use HttpSocket utility lib
    }

    function validate($data) {
       ...
       $reponse = $this->Http->post($this->endpoint, $data);
       ..
       return $valid; // boolean
    }
    ...
}
?>

Пусть модель выполняет работу ( app / models / paypal_notification.php )

Уведомления сохраняются, только если они действительны, сайты доступны только в том случае, если уведомление сохранено

<?php
class PaypalNotification extends AppModel {
    ...
    function beforeSave() {
        $valid = $this->validate($this->data);
        if (!$valid) {
            return false;
        }
        //Minor change to use item_id as premium_site_id
        $this->data['PaypalNotification']['premium_site_id'] = 
            $this->data['PaypalNotification']['item_number'];
        /*
        $this->data['PaypalNotification'] = am($this->data, // use shorthand functions
            array('premium_site_id' => $this->data['item_number']));
        */
        return true;
    }
    ...
    function afterSave() {
        return $this->PremiumSite->enable($this->id);
    }
    ...
    function validate($data) {
        $paypal = ConnectionManager::getDataSource('paypal');
        return $paypal->validate($data);
    }
    ...
?>

Контроллеры не работают. ( app / controllers / paypal_notifications_controller.php )

«Вы - пост? Нет? .. Значит, меня даже не существует». Теперь это действие просто кричит: «Я сохраняю опубликованные уведомления PayPal!»

<?php
class PaypalNotificationsController extends AppModel {
    ...
    var $components = array('RequestHandler', ...);
    ...
    function callback() {
        if (!$this->RequestHandler->isPost()) { // use RequestHandler component
            $this->cakeError('error404');
        }
        $processed = $this->PaypalNotification->save($notification);
        if (!$processed) {
            $this->cakeError('paypal_error');
        }
    }
    ...
}
?>

Бонусный раунд : используйте предоставленные библиотеки вместо собственного PHP

. Примеры следующего см. В предыдущих уроках:

28
ответ дан 1 December 2019 в 19:41
поделиться

Одна возможность:

String imgRegex = "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>";

- это возможность (при совпадении без учета регистра). Это немного беспорядок, и он намеренно игнорирует случай, когда кавычки не используются. Чтобы представить его, не беспокоясь о побегах строк:

<img[^>]+src\s*=\s*['"]([^'"]+)['"][^>]*>

Это соответствует:

  • один или несколько символов, которые не являются > (т.е. возможные другие атрибуты)
  • src
  • необязательный пробел
  • =
  • необязательный пробел
  • начальный разделитель ' или "
  • источник изображения (который может не включать одинарные или двойные кавычки)
  • конечный разделитель
  • , хотя выражение на этом можно остановить, я затем добавил:
    • ноль или более символов, которые не являются > (другие возможные атрибуты)
    • > , чтобы закрыть tag

На заметку:

1
ответ дан 1 December 2019 в 19:41
поделиться

За исключением всего того, что было отмечено deizel (отлично post btw), запомните один из основных принципов торта: толстые модели, худые контроллеры . Вы можете проверить этот пример , но основная идея состоит в том, чтобы поместить все ваши вещи, связанные с изменением данных, в ваши модели. Ваш контроллер должен (в основном) быть просто связующим звеном между вашими моделями и представлениями. Ваш PremiumSitesController :: index () является прекрасным примером того, что должно быть где-то в вашей модели (как указано deizel).

Крис Хартджес также написал книгу о рефакторинге , вы можете взглянуть на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.

Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)

Ваш PremiumSitesController :: index () является прекрасным примером того, что должно быть где-то в вашей модели (как указано deizel).

Крис Хартджес также написал книгу о рефакторинге , вы можете взглянуть на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.

Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)

Ваш PremiumSitesController :: index () является прекрасным примером того, что должно быть где-то в вашей модели (как указано deizel).

Крис Хартджес также написал книгу о рефакторинге , вы можете взглянуть на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.

Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)

index () - прекрасный пример того, что должно быть где-то в вашей модели (как указано deizel).

Крис Хартджес также написал книгу о рефакторинге , вы можете захотеть взгляните на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.

Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)

index () - прекрасный пример того, что должно быть где-то в вашей модели (как указано deizel).

Крис Хартджес также написал книгу о рефакторинге , вы можете захотеть взгляните на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.

Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)

вы можете взглянуть на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.

Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)

вы можете взглянуть на него, если действительно хотите научиться (это не бесплатно, но дешево). Кроме того, у Мэтта Карри есть один с классным названием: Super Awesome Advanced CakePHP Tips , и это совершенно бесплатно для загрузки. Обе версии хороши для чтения.

Я также хотел бы добавить свою собственную статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)

Я также хотел бы добавить свою статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)

Я также хотел бы добавить свою статью о торте, который, как мне кажется, важен для качества кода в торте: Форматирование и читаемость кода . Хотя я понимаю, если люди не согласны ..: -)

5
ответ дан 1 December 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: