"PHP" / Говнокод #5400 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 vectoroc, (Updated )

Комментарии (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__);" явно выглядет одинаково во всех активных записях этой системы
              Ответить
              • Класс единственный (возможно пока) и первый в своем роде (в этом проекте). А создавался он для взаимодействия с одним модулем. Есть определенный интерфейс, этот класс его реализует.

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

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

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

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8