Pull to refresh

Сущностей много — код один

Reading time2 min
Views2.4K
Как известно в работе вёб программиста часто нужно делать что то достаточно быстро, для этого придумали множество всяческих инструментов ООП, фреймворки и много всего, но как не порождать монстров, а делать всё быстро и качественно?
Часто увлекаясь проектированием получается не то что хотелось бы, от проекта к проекту навык совершенствуется и опыт растёт.
Сейчас хотел бы поделиться своим опытом.

Рассмотрим банальный пример

Посты — Комментарии и пользователи которые всё это генерируют.
У всего есть рейтинг, это и будет нашей проблемой.

мы бы могли поступить например так:

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

Потому предлагаю более гибкий вариант:


Таблица с рейтингом у нас теперь одна, и туда внесено дополнительное поле где указано от чего этот рейтинг.
Правда так проще?

Класс для установки рейтинга будет очень прост (решения для Zend Framework):

class Rating extends Zend_Db_Table_Abstract
{
  public function setRating($item_id, $user_id, $table)
  {
     /*
     * здесь записываем в нашу таблицу с рейтингом, кто проголосвал и за что проголосовал
     * $table - нужно например для того чтобы определить item_type, это может быть именем таблицы
     */
  }
  
  public function getRating($item_id, $table)
  {
    /*
     * Здесь получаем значение рейтинга для какого либо итема,
     * Например при помощи mysql функции count
     */
  }
  
  public function isVoted($item_id, $user_id, $table)
  {
     //Определяем голосовал ли такой то пользователь за такой то итем
  }
}


* This source code was highlighted with Source Code Highlighter.


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

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

P.S: сорри за отвратные картинки.

Tags:
Hubs:
Total votes 18: ↑10 and ↓8+2
Comments36

Articles