Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Мешанина VS MCV либо Теория Равновесия

Anna | 31.05.2014 | нет комментариев

Если мы зайдем на сайт говнокод.ру, то мы увидим, что число постов с плохим кодом в разделе PHP больше чем в 3 раза опережает ближайших соперников. Безусловно, на это есть свои поводы — низкий порог вступления, простота языка, присутствие готовых решений, разрешающих не юзать мозг облегчающих решение нормальных задач и т.д… Изредка мне даже становится оскорбительно за репутацию языка и остальных php-программистов.

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

Данные

Возьмем два плана — скрипт, функционал которого описан выше, и базу данных, о которой я так же лаконично упомянул. И условно назовем 1-й маленьким планом, а 2-й — огромным.
Особенности маленького плана:

  • Неимение мотивации, т.к. не люблю дергаться по мелочам
  • Неимение бюджета (500 рублей как-то не серьезно)
  • Сделал и позабыл, никакого растяжения в грядущем

Особенности большого плана:

  • Непрерывное растяжение функционала
  • Специфичность задачи, как следствие — неимение готовых решений
  • Приемлемый бюджет
Как все начинается

Думаю, я не ошибусь, что множество из нас любит увлекательные задачи. Но как быть, когда тебя просят о помощи знакомые люди? Как бы бы за плечами теснее не один солидный план, довольные пользователи и несколько лет навыка, но интернет так узко врос в нашу жизнь, что к нам никогда не перестанут обращаться по мелочам («у моей тёти интернет-магазин кормов для кошек, и ей необходима вероятность оплачивать заказ безналом»; «давай сделаем соцсеть, у меня подлинная идея и через пару месяцев мы будем миллионерами»). Безусловно, дозволено уговорить их в том, что они безрассудны что им это на самом деле не нужно, а дозволено подмогнуть в вере, что когда-нибудь нам помогут в результат. Получаем, что и вознаграждение не особенно огромное, потому что по знакомству, и мотивация одна — сделать стремительней и оставить еще один говносайт, о котором все позабудут через пару месяцев, на просторах интернета.

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

Начинаем писать код

Начну с изложения большого плана. Я Отчетливо понимал, что трудиться над ним мне придется одному, данные обязаны храниться в безопасности, приложение должно получиться расширяемым и легко переносимым с одного сервера на иной либо с одной платформы на иную. А еще все должно быть максимально упрощенно для пользователей, следственно пришлось добавочно принимать меры по фильтрации и обработке вводимых данных, вести подробные логи, сделать подсознательно внятный интерфейс с расчетом на то, что пользоваться им будет умственноотсталая мартышка позже лоботомии.
Добавочно был настроен сервер mysql с репликацией и мониторинг серверов через zabbix с оповещением на почту mail.ru и дальнейшим sms. Все пишется в жанре MCV, чтоб не запутаться и с легкостью вносить метаморфозы в всякий модуль и чтоб система целиком не рухнула в случае неожиданного косяка одного из модулей.

Сейчас по маленькому плану. Такого словосочетания, как «техническое задание», человек, попросивший меня приделать к его сайту отправку электронной почты, не знал. Следственно дюже туманно с утра он написал мне, что бы он хотел видеть в выводе и во каждому остальном доверился мне. Ок, сделаем как хочешь. Срок — 12 часов.

Очаровательный выходной, Удивительная погода, а к вечеру 2 новые серии любимых сериалов. В результате на небольшой план у меня осталось 3 часа.

Казалось бы, времени больше чем довольно, Дабы вставить функцию отправки сообщения,добавления в таблицу в БД, нацепить bootstrap в некое подобие админки и распрощаться с этим заказчиком до скончания столетий, но прирожденное знание находить ненужный геморрой на свою голову будет моим нерушимым подрядчиком задач. Я решил сделать порядочную админку с авторизацией, с настройками отправителя сообщения, редактирования тела и темы сообщения пользователю, оставившему заявку, приделать валидацию форм на клиентской и на серверной стороне. С учетом лени и оставшегося времени — необычные мысли.

Мешанина VS MCV

Может быть я и не такой резкий кодер, но в среднем всякие полгода я ужасаюсь тому, что написал ранее и понимаю, что дозволено было сделать это стремительней, проще и неопаснее. Но темная сторона уговаривает меня, что это, невзирая на то, что сделано кривовато, работает. Вот к чему это приводит:

Огромный план:

Всякий модуль самостоятелен друг от друга. Даже если мы удалим файлы, связанные с пользователями (не из БД, разумеется) система все равно продолжит трудиться в штатном режиме.
В всяком модуле мы имеем такие файлы:
Controller_name,php
Model_name.php
-templates
action_one.php
action_two.php

default.php

Может так и не принято делать, но в данной обстановки это комфортно и разумно.
В результате получаем что если пользователь попадет в пункт
/?item=cars&actions=view_last_week
загрузится модуль Cars и подключится образец view_last_week.php

Небольшой план:

В начале была вписана такая конструкция:

$action=isset($_GET['action']) ? $_GET['action'] : NULL;

switch ($action) {
    case 'read':
        $admin->updateStatus($_GET['id']);
        break;
    case 'delete':
        $admin->deleteMessage($_GET['id']);
    default:
        $admin->view();
        break;
}

Сейчас что у нас в классе $admin

public function view() {

        $messages = $this->getMessages();
        ?>
        <table>
            <thead>
            <th>id</th>
            <th>Номер телефона</th>
            <th>Адрес почты</th>
            <th>Имя</th>
            <th>Ранг</th>
        </thead>
        <tbody>
            <?php
            foreach ($messages as $message) {
                ?>
                <tr>
                    <td><?php echo $message['id']; ?></td>
                    <td><?php echo $message['phone']; ?></td>
                    <td><?php echo $message['mail']; ?></td>
                    <td><?php echo $message['name']; ?></td>
                    <td><?php echo $message['status']; ?></td>       
                    <td><a href="?action=read&id=<?php echo $message['id']; ?>">Прочитано</a></td>
                    <td><a href="?action=delete&id=<?php echo $message['id']; ?>">Удалить</a></td>
                </tr>
                <?php
            }
            ?>
        </tbody>
        </table>

        <?php
    }

    public function getMessages() {
        $query = $this->db->prepare('select * from messages');
        $query->execute();
        $row = $query->fetchAll(PDO::FETCH_ASSOC);
        return $row;
    }

    public function updateStatus($id) {
        $query = $this->db->prepare('UPDATE  messages SET `status` = ? WHERE  id =?');
        $query->execute(array('Прочитано', $id));
        $this->view();
    }

    public function deleteMessage($id) {
        $query = $this->db->prepare('DELETE FROM messages WHERE id = ?');
        $query->execute(array($id));
    }

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

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB