несколько функций – одна большая функция в PHP?

поэтому я пишу класс DataBase который будет слоем инкапсуляции между PHP Controller и MySQL View .

 interface iDataBase { public function drug($action, $drug); public function company($action, $company); public function activeIngredient($action, $activeIngredient); } 

Сначала я думал о том, чтобы сделать все сеттеры и геттеры отдельными, как getAllDrugs (), updateDrug (), removeDrug (), getForUpdate (), getDrug () и так один, но потом я понял, что я загрязняю интерфейс базы данных со слишком большим количеством функций, плюс это очень мелкомасштабная версия, я рассматриваю возможность добавления гораздо большего числа классов и гораздо более функциональных возможностей. Таким образом, вместо использования множества функций, которые я только что установил для 3. $action , определит, что именно пользователь хочет делать с определенным классом. поэтому на данный момент возможны следующие действия: "add", "getAll", "getForUpdate", "update", "remove"

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

Является ли мое решение хорошей практикой? Я уверен, что у многих из вас была такая же проблема, как вы ее решили? Возможны ли какие-либо проблемы?

PS Drug, Company, ActiveIngredient – все классы

Функция должна иметь четко определенные, узкие обязанности с четко определенными минималистскими типами возврата. Если вы начнете создавать «божественные функции», которые делают все и кухонную раковину, в зависимости от того, какие аргументы вы проходите, вы сильно входите на территорию труднодоступного спагетти-кода. Вам не нужна функция, которая выполняет A и возвращает B, если вы передаете ее X, но C и возвращает D, если вы передаете ее Y и т. Д. …

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

 public function findUserById($id) public function findUserByEmail($email) public function updateCompanyName($id, $newName) 

Если вы обнаружите, что у вас есть общий код между этими функциями, унифицируйте код за кулисами, чтобы он был DRY:

 public function findUserById($id) { return $this->find('SELECT * FROM user WHERE id = ?', $id); } public function findUserByEmail($email) { return $this->find('SELECT * FROM user WHERE email = ?', $email); } protected function find($query, $arg) { ... } 

Не начинайте наоборот, думая, что вам «нужны только X, Y и Z», которые кажутся достаточно похожими, чтобы быть объединенными в один метод, а затем выяснение наличия небольших различий между X, Y и Z и засорения вашего кода специальные случаи для каждого. Это просто приводит к функциям, которые являются либо гигантскими, либо вообще общими, они в основном ничего не делают сами по себе.

То, что вы, вероятно, ищете, называется TableDataGateway (акцент мой):

Шлюз данных таблицы содержит все SQL для доступа к одной таблице или представлению: выбирает, вставляет, обновляет и удаляет. Другой код вызывает его методы для всего взаимодействия с базой данных.

Это означает, что у вас будет один универсальный адаптер базы данных, например объект PDO. Вы вводите это в свои различные TDG. Затем TDG использует этот адаптер для данных CRUD из базы данных.

пример

 class CompanyTableGateway { private $dbAdapter; public function __construct(DBAdapter $dbAdapter) { $this->dbAdapter = $dbAdapter; } public function create($name, $street, $whatever) { $this->dbAdapter->exec( 'INSERT INTO companies …' ); } public function findById($id) { return $this->dbAdapter->exec( sprintf('SELECT * from companies where id = %d', $id) ); } // more methods … } 

Если у вас несколько таких шлюзов, вы можете абстрагировать общую CRUD-логику в абстрактном классе, а затем расширить от нее конкретные шлюзы.

Затем вы будете использовать TableModule или аналогичный другой объект для вызова методов на отдельных шлюзах.

Бесконечное обсуждение «Разделение проблем и принцип одиночной ответственности».

  • Разделение проблем (SoC) – это процесс разбивки компьютерной программы на отдельные функции, которые как можно меньше перекрывают функциональность. Вызывает озабоченность любой интерес или фокус в программе. Как правило, проблемы являются синонимом функций или поведения. http://en.wikipedia.org/wiki/Separation_of_concerns

  • Единый принцип ответственности (СРП) – каждый объект должен нести единую ответственность и что все его услуги должны быть узко согласованы с этой ответственностью. На некотором уровне Cohesion считается синонимом SRP. http://en.wikipedia.org/wiki/Single_responsibility_principle

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

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

Примером этого может служить таблица «Пользователи». Что вы можете сделать с этой таблицей?

  1. Создайте
  2. Обновить
  3. Удалить

Затем вы расширите класс Super Database Class с классом пользователей, который будет иметь геттеры и сеттеры для каждой функции, которую вы хотите иметь, то есть:

 class Users extends DatabaseClass { public function update ( $params ) { // Make the code for an update, and let the SuperClass execute the code. ... } public function add ( $params ) { ... } public function delete ( $params ) { ... } } 

Это позволит вам позже, легко добавить дополнительные функции в таблицу Users и оптимизировать запросы специально для таблицы / данных, которые вы используете.