Как реорганизовать лучшие функции модели в CakePHP? - PullRequest
4 голосов
/ 06 декабря 2009

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

У меня есть функции модели, которые извлекают данные и связанные с ними данные. Пример:

$ this->> StudentAssignments студентов-();

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

Что бы вы предложили, ребята?

Ответы [ 3 ]

1 голос
/ 07 декабря 2009

Что следует иметь в виду при проведении такого рода рефакторинга ...

Обычно в моих моделях будут функции Model-> getSomethingAndSomethingElse. Эти функции являются общедоступными и предназначены для вызова в качестве замены для выполнения сложных (или любых) вызовов поиска из контроллера.

Затем я обычно собираю в модели небольшую коллекцию частных функций. В вашем случае у меня может быть что-то вроде ...

Студент-> getStudentAssigmentsWithQuestions

, который затем вызывает некоторые частные функции, т.е.

Student-> getStudent, который может вызывать Student-> joinStudentAssignment, который, в свою очередь, может вызывать Assignment-> joinAssignmentQuestion и т. Д.

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

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

1 голос
/ 06 декабря 2009

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

$this->Student->getStudentAssignmentsWithQuestions

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

Чтобы защитить аргумент проекта: Ваш метод выполняет только одну задачу; он получает задания ученика с вопросами каждого задания.

0 голосов
/ 07 декабря 2009

Нет, если вы строго обеспокоены рефакторингом кода, вы должны разбить этот BLOB-объект на более простые функции, которые выполняют одну задачу, как вы сказали. Да, вы будете больше поражать свою базу данных, но, учитывая, насколько легко работать с кэшированием в cakephp, производительность не должна быть проблемой. И если это так, то вам не стоит беспокоиться о рефакторинге кода на этом этапе.

...