有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

c#将检索与单独类中的类相关的数据的方法放在单独的类中或不放在单独的类中

考虑下面的简化类:

class Book {
   string title;
   Author author;
}

很简单。然而,当添加像getBookFromDatabase(int bookId)这样的方法时,这应该作为static方法放在同一个类中,还是而不是放在一个单独的(即)^{-类中

用法示例:

Book b = Book.getBookFromDatabase(42);

Book b = BookManager.getBookFromDatabase(42);

我确实意识到这在某种程度上是一个品味的问题,但遵循OOP指南的最佳选择是什么


共 (3) 个答案

  1. # 1 楼答案

    我更喜欢使用Repository从备份存储中重新水化对象。下面的内容可能是一个很好的起点

    public interface IBookRepository{
        Book Load(int id);
        void Save(Book book);
    } 
    

    这样,您就可以拥有一个存储库的多个不同实现,而不必与使用数据库联系在一起。例如,您可能有一个InMemoryBookRepository可用于测试,而一个DatabaseBookRepository可用于类似产品的环境

    在风格上,我也会避免使用静态方法,比如:

    BookManager.getBookFromDatabase(42);
    

    测试更难,生成的代码更紧密地耦合在一起,这将使测试和更改更加困难

    你可以看看这个StackOverflow question,从哪里了解关于实现存储库的更多信息MicrosoftMartin Fowler也更详细地描述了它

  2. # 2 楼答案

    我假设您的Book类是一个域/业务类,因此将从数据库检索数据的责任放在类本身上,这是在数据库和业务层之间创建高度耦合,这违反了良好设计的原则

    我建议你阅读http://en.wikipedia.org/wiki/GRASP_(object-oriented_design

    如果你准备好了,那就给我一份

    应用UML和模式:面向对象分析、设计和迭代开发简介——克雷格·拉曼著 ISBN13:978-0131489066

    这本书是关于软件开发的最受欢迎的书之一,受到强烈推荐

  3. # 3 楼答案

    视情况而定

    如果Book类的所有行为都是存储从数据库中检索到的字段,那么只需添加从数据库中获取数据的行为,即getBookFromDatabase(int bookId)在同一个类上,因为所有的课程都将关注从数据库中检索一本书,并将其连贯地呈现给程序的其他部分

    然而,如果您希望Book类具有额外的行为,可能是特定于您的应用程序的某些图书业务逻辑,那么将业务逻辑持久性逻辑分开可能更有意义

    这里的指导启发应该是Single Responsibility Principle,关于它有plenty of other questions on stackoverflow

    另请记住,另一个相关的注释是static methods are death to testability