HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Любое программное обеспечение разрабатывается под конкретную предметную область, например, система аналитики оперирует понятиями "просмотр", "сессия", "воронка", "когорта", а интернет-магазин - "товар", "категория", "платежный шлюз". Все вместе они составляют<a>онтологию предметной области</a>(говорят модель предметной области). Кроме самих понятий онтология содержит и описание их связей. Например, сущность "Пользователь" связана с сущностью "Покупка" как "один ко многим". То есть один пользователь может выполнить сколько угодно покупок, но каждая покупка принадлежит только одному пользователю.</p>
1 <p>Любое программное обеспечение разрабатывается под конкретную предметную область, например, система аналитики оперирует понятиями "просмотр", "сессия", "воронка", "когорта", а интернет-магазин - "товар", "категория", "платежный шлюз". Все вместе они составляют<a>онтологию предметной области</a>(говорят модель предметной области). Кроме самих понятий онтология содержит и описание их связей. Например, сущность "Пользователь" связана с сущностью "Покупка" как "один ко многим". То есть один пользователь может выполнить сколько угодно покупок, но каждая покупка принадлежит только одному пользователю.</p>
2 <p>Модель предметной области - основа коммуникации и взаимопонимания между членами команды. Она не зависит ни от языка программирования, ни от программирования вообще. Не важно кто общается: программисты между собой или программисты с заказчиками, менеджерами или дизайнерами. Все вместе они оперируют<strong>сущностями</strong>и<strong>связями</strong>предметной области и<strong>бизнес-правилами</strong>, используемыми в данной программе. К таким правилам может относиться автоматическое включение скидки при заказе от определенного объема товаров.</p>
2 <p>Модель предметной области - основа коммуникации и взаимопонимания между членами команды. Она не зависит ни от языка программирования, ни от программирования вообще. Не важно кто общается: программисты между собой или программисты с заказчиками, менеджерами или дизайнерами. Все вместе они оперируют<strong>сущностями</strong>и<strong>связями</strong>предметной области и<strong>бизнес-правилами</strong>, используемыми в данной программе. К таким правилам может относиться автоматическое включение скидки при заказе от определенного объема товаров.</p>
3 <p>Важно понимать, что модель на то и модель, что она отражает лишь часть предметной области с некоторой детализацией. Причем, в программах из одной области, но от разных производителей, модель может быть разной. Конечно же, в таких областях, как бухгалтерия, есть некоторый набор фиксированных сущностей, их связей и правил работы, но есть и те вещи, где возможны вариации. В менее формальных областях таких возможностей еще больше.</p>
3 <p>Важно понимать, что модель на то и модель, что она отражает лишь часть предметной области с некоторой детализацией. Причем, в программах из одной области, но от разных производителей, модель может быть разной. Конечно же, в таких областях, как бухгалтерия, есть некоторый набор фиксированных сущностей, их связей и правил работы, но есть и те вещи, где возможны вариации. В менее формальных областях таких возможностей еще больше.</p>
4 <p>Приведу несколько примеров из Хекслета. Количество сущностей - больше сотни, количество связей - много сотен, количество правил посчитать сложно, их тоже много.</p>
4 <p>Приведу несколько примеров из Хекслета. Количество сущностей - больше сотни, количество связей - много сотен, количество правил посчитать сложно, их тоже много.</p>
5 <p>На основе модели предметной области формируется модель данных в коде. Создаются сущности, определяются их связи. Затем строится рабочий код, который оперирует сущностями, исходя из требований (бизнес-правил). На этом этапе возникает вопрос: а как эти сущности отображаются ("мапятся" от англ. "map") на базу данных, ведь именно там в конечном итоге все хранится.</p>
5 <p>На основе модели предметной области формируется модель данных в коде. Создаются сущности, определяются их связи. Затем строится рабочий код, который оперирует сущностями, исходя из требований (бизнес-правил). На этом этапе возникает вопрос: а как эти сущности отображаются ("мапятся" от англ. "map") на базу данных, ведь именно там в конечном итоге все хранится.</p>
6 <p>Самый простой вариант - создавать по таблице на каждую сущность и связывать их через внешние ключи. Именно так и делают в большинстве проектов, но не руками, а используя<strong>ORM</strong>(object-relation mapper). По сути, ORM - фреймворк для данных. С помощью него описываются сущности и их связи, определяется то, как сущность отображается на базу данных (как правило, в полуавтоматическом режиме). ORM берет на себя серьезную часть работы по генерации SQL-запросов, по извлечению данных и кастингу (преобразование типов базы данных в типы целевого языка и обратно), по автоматическому извлечению связей. В итоге получается, что ORM прячет всю работу с базой данных (требуя только правильного конфигурирования) и сама выполняет все необходимые запросы. В сложных случаях их все равно приходится писать самостоятельно, но, как минимум, ORM содержат в себе query builder, который упрощает генерацию sql.</p>
6 <p>Самый простой вариант - создавать по таблице на каждую сущность и связывать их через внешние ключи. Именно так и делают в большинстве проектов, но не руками, а используя<strong>ORM</strong>(object-relation mapper). По сути, ORM - фреймворк для данных. С помощью него описываются сущности и их связи, определяется то, как сущность отображается на базу данных (как правило, в полуавтоматическом режиме). ORM берет на себя серьезную часть работы по генерации SQL-запросов, по извлечению данных и кастингу (преобразование типов базы данных в типы целевого языка и обратно), по автоматическому извлечению связей. В итоге получается, что ORM прячет всю работу с базой данных (требуя только правильного конфигурирования) и сама выполняет все необходимые запросы. В сложных случаях их все равно приходится писать самостоятельно, но, как минимум, ORM содержат в себе query builder, который упрощает генерацию sql.</p>
7 <p>В php таких ORM довольно много, некоторые из них разрабатывались под конкретные фреймворки и поставляются с ними. Посмотрим на пример с фреймворком Doctrine2.</p>
7 <p>В php таких ORM довольно много, некоторые из них разрабатывались под конкретные фреймворки и поставляются с ними. Посмотрим на пример с фреймворком Doctrine2.</p>
8 <p>Определение сущности Photo:</p>
8 <p>Определение сущности Photo:</p>
9 <p>Использование:</p>
9 <p>Использование:</p>
10 <p>Сказать, что описанное выше сложно для новичка - ничего не сказать. Перед работой с ORM нужно сначала научиться основам баз данных. Причем не через программирование, а через прямую работу с базой. Познакомиться с понятием нормализации, внешними и первичными ключами, индексами, планом запроса и научиться работать с sql как для изменения структуры базы данных, так и для манипулирования данными внутри базы. Затем перейти на уровень выполнения запросов из языка программирования. В php для этого используется библиотека PDO. И только затем переходить к ORM. Все это будет далее в курсах.</p>
10 <p>Сказать, что описанное выше сложно для новичка - ничего не сказать. Перед работой с ORM нужно сначала научиться основам баз данных. Причем не через программирование, а через прямую работу с базой. Познакомиться с понятием нормализации, внешними и первичными ключами, индексами, планом запроса и научиться работать с sql как для изменения структуры базы данных, так и для манипулирования данными внутри базы. Затем перейти на уровень выполнения запросов из языка программирования. В php для этого используется библиотека PDO. И только затем переходить к ORM. Все это будет далее в курсах.</p>
11 <p>Вот лишь некоторые темы, вовлеченные в код выше:</p>
11 <p>Вот лишь некоторые темы, вовлеченные в код выше:</p>
12 <ul><li><a>Entity-relation model</a></li>
12 <ul><li><a>Entity-relation model</a></li>
13 <li><a>Domain-driven design</a></li>
13 <li><a>Domain-driven design</a></li>
14 <li>ActiveRecord/DataMapper</li>
14 <li>ActiveRecord/DataMapper</li>
15 <li>Identity map/Unit of Work/Dirty</li>
15 <li>Identity map/Unit of Work/Dirty</li>
16 <li>Миграции</li>
16 <li>Миграции</li>
17 <li>Валидация</li>
17 <li>Валидация</li>
18 <li>Мета-программирование</li>
18 <li>Мета-программирование</li>
19 </ul>
19 </ul>