OOP在哪里放孤儿方法

时间:2013-02-20 23:55:39

标签: oop design-patterns

如果在其他地方已经回答道歉,我的搜索并没有得到我想要的答案。

假设说,我们说我正在为书店建立一个应用程序。

我有一个处理所有数据库事务的类。我还有一个'Book'类,它扩展了Database类,从它自己的构造函数中调用Database构造函数,无需首先实例化Database类:

class Book extends Database {
    __construct($book_id){
        parent::__construct();
        $this->databaseGet("SELECT * FROM..."); // method in Database class
        etc...
    }
}

我可以将引用ID传递给'Book'类构造函数,并创建一个对象,其中包含从数据库中提取的有关该书的信息以及与给定书相关的几种方法。

但我也想列出数据库中的所有书籍。我的问题是,我在哪里放这个方法和其他只是没有“Book”等语境的方法?

我可以创建一个扩展Database类的“GetStuff”或“Bookshop”类,它将包含所有这些一次性使用的方法。但是这需要它一直被加载,因为这些孤立方法将在整个程序中使用。

我可以创建许多包含单个方法的类,但这需要将类实例化为一个对象才能调用该方法,这似乎有些过分。

它们不是通用工具,它们在商业模式中占有一席之地。我应该把这些孤儿方法放在哪里?

3 个答案:

答案 0 :(得分:2)

如果我理解它,你会问到代码应该在哪里与特定类型有关,但是没有实现类型本身的行为。没有一个答案。根据系统的整体设计,它可能是类型的一部分 - Smalltalk类具有“类字段”和“实例字段”,并且没有任何问题 - 或者它可能最终在任何有意义的地方结束。如果它与类型本身外部的某些东西有关 - 也就是说,它不仅仅是一个不是实例行为的问题,而是一个与无关的东西相互作用的问题 - 把它放在外面可能是有意义的。例如,您可能有BookBookDatabaseBookFormBookWebService等等。在某些成员很少的课程中没有任何损害,您永远不会知道何时我想再添加一些。

答案 1 :(得分:2)

书是一本书,书籍是书籍的集合。 数据库是您可以用来保存大量书籍的一件事,因此您无需再次输入它们。

它可以是xml文件,excel电子表格,甚至是web服务。

所以写书和书,然后写一些像

BookDatabase使用类似方法扩展数据库 书籍GetBooks(); 和 void SaveBook(Book argBook); 真正的诀窍是让Book和Books无论存储的方式和方式都能正常工作。

还有很多东西需要学习,但首先要做的是重新开始,不要让你的数据对象依赖于特定的“数据库”。

答案 2 :(得分:0)

似乎你的设计存在严重缺陷。你必须将三个问题分开:

  1. 您的域名层(DM):在这种情况下,Book属于它。
  2. 数据访问层(DAL):处理数据库存储。 Domain Layer根本不了解这一层。
  3. 服务层(SL):处理用例。用例可能涉及来自Domain的多个对象,以及对DAL的调用以保存或检索数据。服务层中的方法执行一个工作单元。
  4. 简化示例:

    // Model Object
            class Book {
               title;
               author:
               isbn;
               constructor(title, author, isbn) {// ...}
               // other methods ...
            }
    
    
    // DAL class
    class BookDataMapper {
             // constructors ...
    
             save(Book book) {}
             Book getById(id) {
               String query = get from book table where book_id = id;
               execute query;
               parse the result;
               Book book = new Book(parsed result);
               return book;
             }
             Book getByTitle(title) {}
             ...
             getAll(){} // returns all books
    
        }
    
    //Service class 
    class BookService {
    
         BookDataMapper bookMapper;
    
    
         buyBook(title) {
            // check user account
    
            // check if book is available
            Book book = bookMapper.getBytitle(title);
    
            if book available
            charge customer
            send the book to ship etc.
    
         }
    }