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

    +158

    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
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    class Relay {
      protected $_data = array();
      protected $_devices;
      static protected $_db_fields = array();
    
      function getId() {
        return $this->_data['id'];
      }
      static function load($id) {
        if ($id) {
          $select = db_select('relay', 'r');
          $select->fields('r');
          $select->condition('r.id', $id);
          $relay = $select->execute()->fetchObject(__CLASS__);
          return $relay;
        }
      }
      function save() {
        foreach (array_diff(array_keys($this->_data), self::_getPureDbFields('relay')) as $field) {
          $this->_data['data'] = $this->_data[$field];
        }
    
        if ($this->getId()) {
          drupal_write_record('relay', $this->_data, array('id'));
        }
        else {
          drupal_write_record('relay', $this->_data);
        }
        $this->_saveDevices();
      }
      protected function _saveDevices() {
        if ($this->getId()) {
          $delete = db_delete('relay_devices');
          $delete->condition('relay_id', $this->getId());
          $delete->execute();
    
          foreach ((array)$this->_devices as $device) {
            $device = (array) $device;
            foreach (array_diff(array_keys($device), self::_getPureDbFields('relay_devices')) as $field) {
              $device['data'] = $device[$field];
            }
    
            drupal_write_record('relay_devices', $device);
          }
        }
      }
      function getDateFrom() {
        return $this->_data['date_from'];
      }
      function getDateDuration(){
        return $this->_data['date_duration'];
      }
      function getDateTo(){
        return $this->getDateFrom() + $this->getDateDuration();
      }
      function getDevices(){
        $this->_ensureDevicesLoaded();
        return $this->_devices;
      }
      protected function _ensureDevicesLoaded() {
        if (!is_array($this->_devices)) {
          $select = db_select('relay_devices', 'rd');
          $select->fields('rd');
          $select->condition('rd.relay_id', $this->getId());
          $query = $select->execute();
    
          $this->_devices = array_map('drupal_unpack', $query->fetchAll());
        }
        return is_array($this->_devices);
      }
      function __construct($data = NULL) {
        if (is_array($data)) {
          foreach ($data as $key => $value) {
            $this->_data[$key] = $value;
          }
        }
        elseif (is_string($this->_data['data']) && !empty($this->_data['data'])) {
          drupal_unpack($this);
        }
      }
      function __set($name, $value) {
        return $this->_data[$name] = $value;
      }
      function __get($name) {
        return $this->_data[$name];
      }
      static protected function _getPureDbFields($table) {
        if (!isset(self::$_db_fields[$table])) {
          $schema = drupal_get_schema($table);
          $fields = $schema['fields'];
          unset($fields['data']);
          self::$_db_fields[$table] = array_keys($fields);
        }
    
        return self::$_db_fields[$table];
      }
    }

    Запостил: vectoroc, 26 Января 2011

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

    • Резюмируйте.
      Ответить
      • говно
        Ответить
        • не просто а оопное друпальное говно. Не хватает только абстрактных методов.

          А методы то
          function getDateFrom() {
          return $this->_data['date_from'];
          }
          function getDateDuration(){
          return $this->_data['date_duration'];
          }
          function getDateTo(){
          return $this->getDateFrom() + $this->getDateDuration();
          }

          Красота ....
          Ответить
          • это сарказм?
            я, вообщем-то, запостил, потому что подумал - занесло меня куда-то. проще надо писать...
            Ответить
        • больше говно-комментариев, больше!)
          Ответить
          • Вам действительно непонятно почему класс Relay -- говно с точки зрения ООП?
            Ответить
            • объясните. реализация говно, а почему сам класс говно, не понимаю.
              Ответить
              • Про реализацию мы и говорим) Интерфейс тут ActiveRecord. Я считаю что для серьезных систем AR не подходит (и Фаулер тоже так считает), но если в системе почти нет сложной логики -- то сойдет и AR.

                А вот с имплементацией хуже: копи-паст литералов и обращение к глобальным функциям друпала. Последнее -- хуже всего, так как класс впринципе не тестируем.
                Ну и много бойлерплейта, который наверняка раскопипащен в 10 таких же классов.
                Например конструкция " $select->execute()->fetchObject(__CLASS__);" явно выглядет одинаково во всех активных записях этой системы
                Ответить
                • Класс единственный (возможно пока) и первый в своем роде (в этом проекте). А создавался он для взаимодействия с одним модулем. Есть определенный интерфейс, этот класс его реализует.

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

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

                    Тогда релей станет тестируемым.
                    Ответить

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