Почему я должен абстрагировать свой уровень данных?

StackOverflow https://stackoverflow.com/questions/5314697

Вопрос

Принципы ООП были трудно понять, потому что по какой -то причине я никогда не мог применить их к веб -разработке. Когда я разрабатывал все больше и больше проектов, я начал понимать, как некоторые части моего кода могут использовать определенные шаблоны дизайна, чтобы облегчить их чтение, повторное использование и поддерживать, поэтому я начал использовать его все больше и больше.

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

$sql = 'SELECT * FROM table WHERE type = "type1"';'
$result = mysql_query($sql);

while($row = mysql_fetch_assoc($result))
{
    echo '<li>'.$row['name'].'</li>';
}

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

Я не говорю, что абстракция данных - это плохо, я задаю эти вопросы, потому что я пытаюсь правильно разработать свои текущие занятия, и им нужно подключиться к БД, поэтому я решил, что сделаю это Правильно путь. Может, я просто читаю плохие статьи на эту тему :)

Я был бы очень признателен за любые советы, ссылки или конкретные примеры реального жизни на эту тему!

Это было полезно?

Решение

Одним из других преимуществ абстрагирования уровня данных является менее зависевшая от базовой базы данных.

С вашим методом, в тот день, когда вы хотите использовать что -то еще, чем MySQL или изменение именования столбцов или API PHP, касающегося изменения MySQL, вам придется переписать много кода.

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

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

Наконец, легче провести модульное тестирование, если все идет в борьбе с некоторыми классами, чем на каждом страницах из вашего проекта.

Например, в моем недавнем проекте (извините, обмен кодом не возможно), связанные с MySQL функции вызываются только в одном классе. Все, от генерации запросов до объекта, здесь сделано. Так что мне очень важно изменить другую базу данных или повторно использовать этот класс где -то еще.

Другие советы

Подумайте о абстрагировании уровня данных как о способе сэкономить время в будущем.

Используя ваш пример. Допустим, вы изменили имена таблиц. Вам придется перейти к каждому файлу, где у вас есть SQL, используя эту таблицу, и отредактировать его. В лучшем случае это был вопрос поиска и замены n файлов. Вы могли бы сохранить много времени и минимизировать ошибку, если бы вам пришлось только отредактировать один файл, файл, в котором были все ваши методы SQL.

То же самое относится и к именам столбцов.

И это рассматривает только тот случай, когда вы переименуете вещи. Также вполне возможно полностью изменить системы баз данных. Например, ваш SQL может быть не совместим между SQLite и MySQL. Вам придется пойти и отредактировать, еще раз, много файлов.

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

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

Я не человек PHP, но это более общий вопрос, так что здесь идет.

Вы, вероятно, строите что -то маленькое, иногда, хотя даже что -то маленькое/среднее должно иметь абстрактный уровень данных, чтобы он мог расти лучше.

Дело в том, чтобы справиться с СДАЧА

Подумайте об этом, у вас есть небольшой сайт социальной сети. Подумайте о данных, которые вы храните, сведения о профиле, фотографии, друзья, сообщения. Для каждого из них у вас будут страницы, как pictures.php?&uid=xxx.

Затем у вас будет маленький кусочек SQL, который ударил туда с кодом MySQL. Теперь подумайте, насколько легко/сложно было бы изменить это? Вы бы изменили 5-10 страниц? Когда вы сделаете это, вы, вероятно, поймете это неправильно несколько раз, прежде чем тщательно протестировать это.

Теперь подумайте о Facebook. Подумайте о количестве страниц, как вы думаете, будет легче сдача строка SQL на каждой странице!?

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

  1. Это в одном месте, его легче изменить.
  2. Поэтому его легче проверить.
  3. Это легче заменить. (Подумайте о том, что вам нужно сделать, если вам придется переключиться на другую базу данных)

Надеюсь это поможет

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

Разделение различных «слоев» имеет несколько преимуществ.

1) Он аккуратно организует вашу базу кода. Если вам нужно внести изменения, вы сразу узнаете, где нужно внести изменения и где найти код. Это может быть не так уж много, если вы работаете над проектом самостоятельно, но с более крупной командой преимущества могут быстро стать очевидными. Эта точка на самом деле довольно тривиальна, но я все равно добавил его. Реальная причина - номер 2 ..

2) Вы должны попытаться разделить вещи, которые могут потребоваться независимо друг от друга. В вашем конкретном примере возможно, что вы хотели бы изменить логику DB / Data Access, не влияя на пользовательский интерфейс. Или вы можете изменить пользовательский интерфейс, не влияя на доступ к данным. Я уверен, что вы можете увидеть, как это сделано невозможным, если код смешан друг с другом.

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

3) повторное использование. Написание кода доступа к данным может стать довольно повторяющимся. Это еще более повторяется, когда вам нужно переписать код доступа к данным для каждой записи, которую вы записываете. Всякий раз, когда вы замечаете что -то повторяющееся в коде, будильные колокольчики должны звонить. Повторность, подвержена ошибкам и вызывает проблему обслуживания.

Я уверен, что вы видите те же вопросы, которые появляются на разных страницах? Это может быть разрешено, поставив эти запросы ниже в вашем уровне данных. Это помогает облегчить техническое обслуживание; Всякий раз, когда изменяется имя таблицы или столбца, вам нужно только исправить одно место в вашем уровне данных, которое ссылается на него вместо того, чтобы проходить через весь ваш пользовательский интерфейс и потенциально что -то упустить.

4) тестирование. Если вы хотите использовать автоматизированный инструмент для проведения модульного тестирования, вам понадобится все красиво отделено. Как вы будете тестировать свой код, чтобы выбрать все записи клиентов, когда этот код разбросан по всему вашему интерфейсу? Это намного проще, если у вас есть конкретная функция SelectAllCustomers в объекте доступа к данным. Вы можете проверить это однажды здесь и убедиться, что это будет работать для каждой страницы, которая ее использует.

Есть больше причин, по которым я позволю другим людям добавить. Главное, что нужно убрать, - это то, что отделение слоев позволяет одному слою изменяться, не позволяя изменению проселовать на другие слои. Поскольку база данных и пользовательский интерфейс являются областями приложения / веб -сайта, которые изменяют наиболее часто, это очень хорошая идея, чтобы они были отдельными и хорошо изолированными от всего остального и друг друга.

С моей точки зрения, чтобы распечатать только список элементов в таблице баз данных, ваш фрагмент более подходит: быстрый, простой и ясный.

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

Рассмотрим простую CMS с авторами, статьями, тегами и перекрестной справочной таблицей для статей и тегов.

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

Вы повторите этот запрос с некоторыми небольшими изменениями в профиле автора и результатах поиска тегов.

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

// Home page
$articles = $db->getTable('Article')->join('Author a')
    ->addSelect('a.name AS author_name');
$first_article_tags = $articles[0]->getRelated('Tag');

// Author profile
$articles = $db->getTable('Article')->join('Author a')
    ->addSelect('a.name AS author_name')->where('a.id = ?', $_GET['id']);

// Tag search results
$articles = $db->getTable('Article')->join('Author a')
    ->addSelect('a.name AS author_name')
    ->join('Tag')->where('Tag.slug = ?', $_GET['slug']);

Вы можете уменьшить оставшееся повторение кода, инкапсулирующее его в моделях и рефакторировать код выше:

// Home page
$articles = Author::getArticles();
$first_article_tags = $articles[0]->getRelated('Tag');

// Author profile
$articles = Author::getArticles()->where('a.id = ?', $_GET['id']);

// Tag search results
$articles = Author::getArticles()
    ->join('Tag')->where('Tag.slug = ?', $_GET['slug']);

Есть и другие веские причины, чтобы абстрагировать более или менее, с его плюсами и минусами. Но, по моему мнению, для большей части веб -проекты, основной этот: P

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top