Где поставить общие функции в ООП? - PullRequest
3 голосов
/ 03 сентября 2010

Для наглядности предположим, что я создаю простое приложение для блога и у меня есть класс с именем Blog:

Class Blog(){
   __constructor(){
       connectToDatabase();
   }
}

Class BlogPost($id) extends Blog {
    public $title;
    public $body;
    etc.
}

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

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

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

Лучше ли смешивать их все в каком-то классе Utility (), или я должен создать несколько классов, таких как util_commenting (), util_archives ()? Где мне хранить все эти маленькие автономные функции?

Ответы [ 4 ]

1 голос
/ 03 сентября 2010

«Классы для понятий» - это хороший афоризм, который нужно запомнить.

Попробуйте написать несколько историй / сценариев / сценариев использования, чтобы описать, как работает система.

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

Я рекомендую Ребекку Вирфс-Брок "Проект, основанный на ответственности".На ее странице публикаций .

есть хороший обзорный документ .
0 голосов
/ 03 сентября 2010

Это объект постоянного уровня. Обычно это объект доступа к данным (DAO) или хранилище, а не утилита или общая функция.

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

Если бы я писал это на Java, это могло бы выглядеть так:

public class Blog
{
    private Long id;
    private String title;
    private String body;
    private String author;
    private Date publishDate;
    // Other attributes and functions here.   
}

public interface BlogDao
{
    Blog find(Long id);
    List<Blog> find();
    List<Blog> find(Date begDate, Date endDate);
    List<Blog> find(String author);
    void saveOrUpdate(Blog blog);
    void delete(Blog);
}

Был класс, который реализовывал интерфейс BlogDao, используя любую технологию, которую я хотел (JDBC, Hibernate и т. Д.)

0 голосов
/ 03 сентября 2010

В большинстве случаев бесплатные функции следует просто помещать в хорошо именованное пространство имен.Если вы посмотрите на стандартные библиотеки C ++, в std есть ряд бесплатных функций (например, sort).Вы можете создать пространство имен блога с классом блога, содержащимся в (blog :: blog), а затем использовать другие бесплатные функции для работы с блогами в этом пространстве имен.

Им не нужно входить ни в один класси это определенно НЕ лучшие практики для стиля синглтона.

0 голосов
/ 03 сентября 2010

У вас может быть BlogPostRepository или объект базы данных, который может возвращать все BlogPosts.

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