[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ActiveRecord
Страницы: 1, 2, 3, 4, 5, 6
twin
По многочисленным просьбам трудящихся tongue.gif решил я приторочить к фреймворку сервис ActiveRecord. А что, пусть будет все по взрослому.

И вот первая дилема. Как организовать связь объекта с таблицей. Не технически, а гуманитарно. Есть два варианта:
1. Простой. Таблицу называть так же, как класс. Это практикуется в YII к примеру.
2. Продвинутый. Таблицу назвать как класс во множественном числе. User -> users. Как в laravel допустим.

С первым проблемм никаких. Второй потребует плюрализер - скрипт, перводящий слова во множественное число.

Так, как я упоротый велосипедостроитель, взять готовое решение - не наш метод. Соответственно придется довольно серьёзно повозиться.

С одной стороны конечно круто, когда все по науке. С другой - Yii'шники ведь не парятся...
Вопрос такой. Стоит ли овчинка выделки? На сколько это удобно и оправдано, кто что думает?

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Arh
twin
Цитата
Таблицу назвать как класс во множественном числе. User -> users. Как в laravel допустим.

Не вижу смысла так извращаться. Где то была тема про неудобства названий в множественном числе в программировании, всё таки это не литературный язык.
Считай что название это имя, а не описание. cache, user, log, config вместо caches, users, logs, configs

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
twin
Тут дело в сути паттерна ActiveRecord. Он же представляет каждую строку таблицы в виде объекта.

И вот тут дилема. Объект полюбому должен называться User. Один. Это сущность. Но в таблице их много, и таблица лаконичнее звучит как users.

Все же сделаю по науке, к тому же не так сложно оказалось. Плюс профит - отдельный сервис Inflector будет. smile.gif

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Arh
twin
Цитата
Но в таблице их много, и таблица лаконичнее звучит как users.

user ещё лаконичней, на целую букву)

Дело привычки, всем и так понятно что в таблице может быть несколько записей, а "user" это как отражение типа данных в этой таблице. Это как использовать слово "блокнот" вместо "заметки", заметки в блокноте, "config" вместо "settings", настройки конфигурации.
То есть это таблица user, в которой лежат users and their ip and their photo.

В общем я бы не наворачивал кода ради сомнительной "понятливости". Делать склонения имён программных сущностей что бы потом что? Что бы как стихотворение читать?) Сам же учил древнеиндейскому ритуалу.

Да и потом с этими склонениями можно загнаться сильно:
Право доступа под названием user.edit, которое разрешает редактировать пользователей, но оно разрешает редактировать не конкретного, а всех, тогда надо назвать users.edit, да и редактировать можно не один раз.
Директория template хранит шаблон сайта, но он состоит из минишаблонов, всяких там blog.tpl, message.tpl, тогда это уже набор шаблонов (templates), получается фраза "скачай и поставь шаблон" неправильная.
В итоге приходишь к тому что "всё множественное". В директории несколько файлов, базе данных несколько баз, в классе несколько свойств/методов, в переменной несколько символов/слов/предложений)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
twin
Разумно. Но не в этом случае помоему. Тут сама суть в том, что из множества выбирается одно.

Впрочем это опционально, в любой AR можно принудительно установливать любое имя таблицы. А по умолчанию все же так будет прикольнее. Я больше скажу, я уже реализовал это, еще и с переводом CamelCase в under_line.

К тому же фреймворк обучающий, нужно сразу показать, как бороться c тем же Laravel.

Однако спасибо, мысль полезная.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
AllesKlar
Цитата (twin @ 14.03.2018 - 04:13)
Простой. Таблицу называть так же, как класс.

Так а в чем проблемма то?
Основные критерии патерна
  • каждый экземпляр данного класса соответствует одной записи таблицы;
  • при создании нового экземпляра класса (и заполнении соответствующих полей) в таблицу добавляется новая запись;
  • при чтении полей объекта считываются соответствующие значения записи таблицы баз данных;
  • при изменении (удалении) какого-либо объекта изменяется (удаляется) соответствующая ему запись.
class Users {
private __construct() {}
public static createUser() {
return new self;
}
}


$user = Users::createUser();
$user->setName("vasja");
$user->save();
$user->update()
$user->delete();

$user = Users::findById(123);
...



_____________
[продано копирайтерам]
twin
Ну как вариант. Но так все же проще, пользователю достаточно отнаследоваться от сервиса, не нужно ничего мудрить с креатором:
class User extends AR
{

}

$user = new User;
$user->setName("vasja");
$user->save();
$user->update()
$user->delete();


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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
sergeiss
twin, лично я за то, чтобы названия легко читались в контексте. Существенно упрощается/ускоряется восприятие кода. Это и в sql "select user from users where...", это и названия коллекций/массивов в языках программирования. Коллекция actions, один элемент (например, при обработке в цикле) action. Массив tools, один элемент tool. И так везде и всегда. Не запутаешься в коде.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Игорь_Vasinsky
Цитата
Он же представляет каждую строку таблицы в виде объекта.

в народе - принято говорить не объект, а модель

Цитата
$user->setName("vasja");

эту чепушию каждый сам для себя распишет, достаточно работать с свойствами модели

$model = (yii::$app->request->post('id')) ? Model::findOne(['id' => $id]) : new Model;

$model->name = 'Ivan';
$model->age = 24;

if($model->save()){
....
}



к тому же в Yii есть load в модель - можно просто ассоц. массив передать

$data[
'Model' => [
'name' => 'Ivan',
'age' => 24
]
];


if($model->load($data) && $model->validate()){
$model->save();
}


миграции так же можешь перенять в свой фреймворк.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
twin
Вообще то тут речь об ActiveRecord. Причем тут Yii'шные модели? Ты бы хоть его AR расписал, а то наворотил бес знает чего)))

Миграции в планах, для того и затеял эту фигню))) Сам я этим не пользуюсь. Как сказал как то Ron, уныло это smile.gif

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
AllesKlar
twin
Цитата (Игорь_Vasinsky @ 14.03.2018 - 15:38)
эту чепушию каждый сам для себя распишет, достаточно работать с свойствами модели

Не будем плодить холивар по-поводу необходимости геттеров и сеттеров.
Просто, что случиться, если написать (с точки зрения php все законно!)
$model->age = "Столько не живут";

А в базе поле age на секундочку int8 smile.gif

_____________
[продано копирайтерам]
twin
Цитата (AllesKlar @ 14.03.2018 - 14:18)
Не будем плодить холивар по-поводу необходимости геттеров и сеттеров.

Не будем. smile.gif Дело в том, что в AR свойства, это название полей таблицы. И тут это вообще не критично. Сеттеры тут просто излишни. И обычно ими не пользуются.

Если понадобятся другие свойства, то нужно думать. А вообще я сам толком не понял, для чего Игорь это написал.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Arh
sergeiss
Цитата
twin, лично я за то, чтобы названия легко читались в контексте. Существенно упрощается/ускоряется восприятие кода. Это и в sql "select user from users where...", это и названия коллекций/массивов в языках программирования. Коллекция actions, один элемент (например, при обработке в цикле) action. Массив tools, один элемент tool. И так везде и всегда. Не запутаешься в коде.

Я для коллекций обычно использую слово list, которое явно указывает что там список.
Например в том же классе User будет метод User->get(1), а если нужно получить всех пользователей тогда User->getList(), как тут быть с буквой s? Делать другой класс Users->get() или методу добавлять s User->gets();? Ну что бы читалось)
Тоже самое с переменными, есть $user, есть $userList. По мне "легкочтение" заключается в том, что бы сразу броситься в глаза, $user|$userList этом плане более легко заметнее чем $user|$users.
И сразу понятно от куда эта переменная пришла $userList = User->getList().
Цитата
"select user from users where..."

На практике такого нет мне кажется. Есть что то вроде "select id from user where...", ИМХО это проще читается, чем дополнительно изворачивать язык произнося s

Ну и если пофилософствовать, то таблица это сущность, с которой можно производить какие то действия, удалить там или переименовать. Она как ящик, как коробка, со своим названием, со своей структурой. Таблица это "она", ну или "он", если рассматривать как контейнер. А мы называем её/его "они" - users, как будто их много. Но она одна, значит users это не имя таблицы, это её описание, это то что она хранит, получается сама таблица безымянная. А хранить она может много всякого, тогда надо в описании перечислять что она хранит. То есть допустим таблица links, хранит не только ссылки, но и их названия и дату создания, в таком случае её надо описывать так links_and_their_description_and_their_creation_time.
ИМХО лаконичнее дать ей имя вместо описания, назвать её link, тогда и класс будет Link, и переменная $link = Link->get(1)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
Ron
Цитата (twin @ 14.03.2018 - 18:07)
Как сказал как то Ron, уныло это

Что именно уныло, AR или миграции? Не припоминаю, если честно, хотя теоретически могло быть, мне ближе Doctrine2. Миграции штука классная, сохранение состояния структуры БД в репозитории.

twin, а ты меня с какой целью в топик приглашаешь? wink.gif

chee
А чем тебе пропел не нравится, зачем обязательно свое писать?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.