在OOP中放置一般功能的位置?

时间:2010-09-03 11:24:01

标签: oop inheritance

为了便于说明,我们假设我正在构建一个简单的博客应用程序,并且有一个名为Blog的类:

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

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

blogpost类可以实例化为表示特定博客帖子的对象。但是当我想列出数据库中的所有记录时,我必须将该功能放在其他地方。

我可以将它放在Blog类中,但假设我有许多这样的函数不适用于特定对象,我应该把它们放在哪里?

或许我正在写一行日志文件。有一个'logfile'类包含一个将传递的字符串写入文本文件的单个函数似乎很愚蠢。

最好将它们全部放在某个Utility()类中,还是应该创建几个类,如util_commenting(),util_archives()?我应该在哪里存储所有这些小的独立功能?

4 个答案:

答案 0 :(得分:1)

“概念课”是一个值得记住的好格言。

尝试编写一些故事/场景/用例来描述系统的工作原理。

您可能会发现免费功能最终会出现在满足某些故事所需的组中。

我推荐Rebecca Wirfs-Brock的“责任驱动设计”。她overview paper上有一个很好的publications page

答案 1 :(得分:0)

您可以拥有BlogPostRepository或Database对象,它可以返回所有BlogPost。

答案 2 :(得分:0)

这是一个持久层对象。通常它是数据访问对象(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);
}

有一个类使用我想要的任何技术(JDBC,Hibernate等)实现了BlogDao接口。

答案 3 :(得分:0)

大多数情况下,自由函数应该放在一个命名良好的命名空间中。如果你看一下C ++标准库,std中有很多免费函数(例如sort)。您可以创建一个博客命名空间,博客类包含在(blog :: blog)中,然后可以使用其他实用程序免费函数来处理该命名空间中的博客。

他们不需要进入任何课程,这绝对不是采用单身人士风格的最佳做法。