PHP / Codeigniter Dry Принцип работы моделей - PullRequest
0 голосов
/ 12 марта 2019

Допустим, я делаю веб-приложение для сайта обмена историями в Интернете.

У нас есть таблицы: жанр, теги, content_warning только с 2 столбцами в качестве идентификатора и имени.например: жанр = 1 - романтика, 2 - действие и т. д.

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

Так что у меня будут эти функции в моей story_model :

public function get_genre(){
$genre = array();
$query = $this->db->get('genre');
foreach($query->result() as $row){
$genre[$row->genre_id] = $row->genre_name;
}
return $genre;
}

public function get_tags(){
$tags = array();
$query = $this->db->get('tag');
foreach($query->result() as $row){
$tags[$row->tag_id] = $row->tag_name;
}
return $tags;
}

public function get_content_warnings(){
$content_warning = array();
$query = $this->db->get('content_warning');
foreach($query->result() as $row){
$content_warnings[$row->content_warning_id] = $row->content_warning_name;
}
return $content_warning;
}

Правильно ли сказать, что я повторяю себя в вышеуказанных 3 функциях?поэтому я написал бы один код, например:

public function sample_get($table){
    $data = array();
    $query = $this->db->get($table);
        foreach($query->result_array() as $row){
            $data[$row[$table.'_id']] = $row[$table.'_name'];
        }
    return $data;
}

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

Как бы я назвал свою функцию выше?3 отдельные функции легко назвать, так как они очень прямолинейны, и вы знаете, что делает функция, прочитав ее имя.

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

Account_model:

public function get_userid($username){
$this->db->select('user_id');
$this->db->from('user');
$this->db->where('username', $username);
$query = $this->db->get();

foreach($query->result() as $row){
$user_id = $row->user_id;
}
return $user_id;
}

story_model:

public function get_stories($user_id){
$stories = array();

$this->db->select('story_id, story_name');
$this->db->from('story');
$this->db->where('user_id', $user_id);//author
$query = $this->db->get();

foreach($query->result() as $row){
$stories[$row->story_id] = $row->story_name;
}

return $stories;
}

будут ли две вышеупомянутые функции гарантированно сухими идификациями?

Или давайте изменим вторую функцию, чтобы получить только story_id, который совпадал бы с функцией account_model для получения user_id.они тогда должны были бы высохнуть?

но я не совсем понимаю, когда я решу высушить свои функции?так как я буду использовать много функций get для извлечения данных, тогда я просто выберу одну функцию get?

1 Ответ

0 голосов
/ 12 марта 2019

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

/**
  * Use the common function internally, but do not expose it publicly
  */
private function sample_get($table){
    $data = array();
    $query = $this->db->get($table);
        foreach($query->result_array() as $row){
            $data[$row[$table.'_id']] = $row[$table.'_name'];
        }
    return $data;
}

/**
  * Use well-named functions that are exposed to be used publicly
  */
public function get_content_warnings(){
    return $this->sample_get('content_warning');
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...