1. PHP / Говнокод #7757

    +147

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    <?php
    /*
    	Виджет для формы логина
    */
    class UserLogin extends CWidget
    {
    	public function run()
    	{
                $model = new Login;
                if(!Yii::app()->user->isGuest)
                {
                    $this->render('loginOut', array('model'=>$model));
                } else {
                    $this->render('loginForm', array('model'=>$model));
                }
    	}
    }
    
    /**
     * модель логина
     */
    class Login extends CFormModel
    {
    	public $login;
    	public $pass;
    	public $rememberMe;
    
    	private $_identity;
    
    	public function rules()
    	{
                return array(
                    // username and password are required
                    array('login, pass', 'required', 'message'=>'поле {attribute} не может быть пустым'),
                    // rememberMe needs to be a boolean
                    array('rememberMe', 'boolean'),
                    // password needs to be authenticated
                    array('pass', 'authenticate'),
                );
    	}
    
    	/**
    	 * Declares attribute labels.
    	 */
    	public function attributeLabels()
    	{
                return array(
                    'login'=>'Логин',
                    'pass'=>'Пароль',
                    'rememberMe'=>'Запомнить',
                );
    	}
    
    	/**
    	 * Authenticates the password.
    	 * This is the 'authenticate' validator as declared in rules().
    	 */
    	public function authenticate($pass,$params)
    	{
                $this->_identity=new UserIdentity($this->login,$this->pass);
                if(!$this->_identity->authenticate())
                    $this->addError($pass, empty($params['message'])?'неправильный лоин или пароль':$params['message']);
    	}
    
    	/**
    	 * Logs in the user using the given username and password in the model.
    	 * @return boolean whether login is successful
    	 */
    	public function login()
    	{
                if($this->_identity===null)
                {
                    $this->_identity=new UserIdentity($this->login,$this->pass);
                    $this->_identity->authenticate();
                }
                if($this->_identity->errorCode===UserIdentity::ERROR_NONE)
                {
                    $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
                    Yii::app()->user->login($this->_identity,$duration);
                    return true;
                } else {
                    return false;
                }
    	}
    }

    Запостил: xyzdsnxyz, 03 Сентября 2011

    Комментарии (22) RSS

    • И ??
      Ответить
    • >CFormModel
      За таоке(C-prefix) именование - "Повбивав би, блядь!"(с).
      Ответить
      • И в чем такая ненависть? Автор фреймверка "забронировал" префикс "C" для core-классов. End of story.
        Чем плохо C-prefix именование?
        Ответить
        • >И в чем такая ненависть?
          Разрыв шаблона после MFC не только у меня...
          >префикс "C" для core-классов
          CrFormModel, CoreFormModel... не, менее очевидно?
          >Чем плохо C-prefix именование?
          http://insidecpp.ru/art/23/
          Ответить
          • И что? Я тоже не люблю венгерскую нотацию, но в Yii она применяется только для системных классов и это очень удобная конвенция в данном конкретном случае. CoreFormModel - тоже норм, но это была бы уже другая конвенция. В Yii используется "C"-префикс для классов и "I"-префикс для интерфейсов. Я сам лично использую еще "A" для абстрактных классов.
            А вот переменные сплошь и рядом называть sText, iAge и т.д. - вот это уже бред. Я сам, помнится, пользовался венгерской нотацией некоторое время, пока не понял, что это - .овно и мне не требовались какие-то статьи в интернете, чтобы это понять самостоятельно.
            А то, что у вас там после MFC расстройства какие-то, что любая конвенция именования классов при помощи префиксов вас так сильно беспокоит, ну... могу посочувствовать, если хотите.
            Ответить
            • >Я сам лично использую еще "A" для абстрактных классов
              А при необходимости изменить архитектуру — "слов нет, одни эмоций"(с).

              >В Yii используется "C"-префикс для классов
              > Автор фреймверка "забронировал" префикс "C" для core-классов
              Так для всех классов или только для core-классов? Или для всех core-классов?

              >А то, что у вас там после MFC расстройства какие-то...
              Обратите внимание: I — для интерфейсов, С — для классов это
              общепринятая конвенция именования типов данных для многих ООП ЯП.
              Из 10 программистов как минимум 9 предположат, что CFormModel - Calss From Model, но уж никак не Core.
              У автора получился нахлёст конвенций.
              [obviousness]
              Т. е., для осваивающего архитектуру какого-то фреймворка программиста, время, при использовании
              стандартных решений архитектором, будет значительно меньше.
              [/obviousness]
              Исходя из выше сказанного, имеем: оригинальность именования оправданная не прагматизмом, но непонятно чем.
              Ответить
              • Необходимость изменить архитектуру при правильном дизайне изначальной - достаточно редкое явление. Для переименования чего угодно уже давным-давно в современных IDE есть специальные рефакторинг-методы.

                "C" забронирован в Yii для всех core-классов.

                9 программистов из 10 (в этом случае: 9 нормальных, 1 - говнокодер) прочитают документацию к фреймверку, где написано, что и как именуется, что в каких директориях находится и прочие конвенции. Зайдите на форум коммьюнити фреймверка и попробуйте найти хоть 1 тему, где кто-то был бы не согласен с конвенцией и поймете, что не только я один считаю конвенцию вполне приемлемой.

                [obvious]Чтобы прочитать 2 строчки текста, в которых говорится, что имена всех core-классов фреймверка начинаются с "C" нужно меньше 10 секунд, поэтому время на освоение не будет значительно меньше[/obvious]

                Оригинальность? [sarcasm]Ну да "C" префикс для классов - жутко оригинально - как и додумались до такого?[/sarcasm]
                Ответить
                • >Для переименования чего угодно уже давным-давно в современных IDE
                  Согласен, но: IDE современные, а восприятие с той же скоростью не работает, особенно на длительных интервалах в больших проектах.

                  >поэтому время на освоение не будет значительно меньше
                  А после продолжительного опыта с тем же MFC, тоже не будет?
                  Некоторая инертность восприятия присуща всем человекаобразным, а зная это, возможно, есть смысл предусмотреть такой момент.
                  Впрочем, дело личное...

                  Моё мнение таково: если и использовать C-префикс конвенцию, при именовании типов данных, то очевидно, делать это в контексте общепринятой конвенции, обратное - не прагматично.
                  В случае фреймворка Yii, 3 литеры (ore — Core) добавили бы только понятности.

                  >как и додумались до такого?
                  [wikipediaface] http://ru.wikipedia.org/wiki/Венгерская_нотация [/wikipediaface]
                  Ответить
        • Я бы, наверное, поместил классы в namespace Core, типа Yii::Core::WhatElse. Не люблю префиксы.
          Ответить
          • Насколько я помню, первый релиз Yii появился до релиза PHP 5.3, т.е. неймспейсов еще не было. Будут ли делать не знаю, если честно, - уже год как не участвую активно в жизни проекта, хотя за релизами слежу и иногда даже новые фичи опробую.
            Ответить
            • то есть
              Yii::app()
              объявил автор кода?
              Ответить
              • Автор фреймверка. Это - обычный вызов статической функции. Неймспейсы тут ни при чем.
                Ответить
    • xyzdsnxyz решил весь Yii сюда перетащить? Ну не говнокод же это. Поэтому, минус 1.
      Ответить
    • Хотя тут есть 1 косяк все-же:
      UserLogin должен жить в отдельном файле так, что spl_autoload мог бы его найти, но это больше замечание, чем придирка. Опять же - это не говнокод.
      Ответить
    • А еще подлиннее нельзя было? Фабрику там навернуть, стопицот классов и чтоб иерархия была многоэтажная? :)
      Ответить
      • Прошу указать, что тут лишнее.

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

        Arris, почему бы вам свой функционал аутентификации пользователей не выложить, а я найду (почти уверен в этом) чем он хуже представленного тут в этом "говнокоде". Идет?
        Ответить
        • Ну почему же каждый? Не каждый.

          Имхо, лишнее тут общая перегруженность кода наворотами. Впрочем, это общая беда 99% современных проектов.

          Учитывая что мой функционал был наглухо необъектным, любитель объектов его объявит ересью по умолчанию. Но он работал :)

          К тому же любые два неидентичных куска кода можно, сравнив, найти, чем один хуже другого. Или лучше другого.
          Ответить
          • Тут нет "наворотов" :) В смысле, тут все так, как "доктор прописал".
            class Login:
            - определение полей формы (public-properties)
            - инстанс identity (будет типа CWebUser или унаследованном от него. Хранит всю информацию о пользователе, т.к. у нас форма авторизации, это нам надо)
            - правила валидации данных, переданных из формы + темплейты ошибок, если валидация не прошла. Правила валидации можно не указывать, но тогда я бы может и заплюсовал бы этот "ГК".
            - attributeLabels - сопоставление human-readable названий идентификаторам полей. Тоже можно не указывать, но лучше это хранить в модели - обеспечивает консистентность данных (не надо будет потом по всему коду менять "Логин" на "Имя"). Для интернациональных проектов можно делать 'name' => Yii::t('Имя'), что, опять же, очень удобно.
            - функция аутентификации
            - функция логина
            Для последних 2х все в комментах к функциям написано :-)

            Просто нужно знать фреймверк (к стати, очень рекомендую ;) ). Ничего "навороченного" тут нет.

            P.S. я не "любитель объектов" :)
            пишу и так и эдак, в зависимости от задачи
            Ответить
            • Спасибо за подробные объяснения. К сожалению, в большинстве современных фреймворков человеку, плохо знакомому с ООП, без поллитры не разберешься ;)
              Ответить
              • Ну это косяк самого человека, мульти пардигмность языка обязывает чела кодившого на нем знать все возможные аспекты.
                Ответить
              • Хотя-бы основы ООП надо знать ;-) Еще ООП - это удобно, хотя сначала может быть и не совсем понятно. Это уже давно забытое мной чувство, но по-моему, у меня были какие-то проблемы с осознанием:
                - где надо ООП, где не надо
                - чего там куда наследовать
                - какие нафиг модификаторы доступа
                - че за интерфейсы
                - чем абстрактный класс отличается от обычного
                - нафига вообще абстрактный класс нужен если нельзя создать его инстанс
                - что за перегрузки операторов
                - почему надо имплементировать интерфейсы
                - зачем разработчики языка вообще написали стандартные интерфейсы
                и т.д.
                Ответить
    • уже все что нужно сделал и разобрался нет необходимости раздувать данный код излишними коментами... yii рулит...
      Ответить

    Добавить комментарий