1

抱歉,如果这已在其他地方得到解答,我的搜索并没有得到我正在寻找的答案。

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

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

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

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

但我也想列出数据库中的所有书籍。我的问题是,我应该把这个方法和其他根本没有上下文的方法放在哪里,比如“书”?

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

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

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

4

3 回答 3

2

如果我理解它,您是在问与特定类型相关但不实现类型本身行为的代码应该去哪里。没有单一的答案。根据系统的整体设计,它可能是类型的一部分——Smalltalk 类有“类字段”和“实例字段”,这并没有错——或者它可以在任何有意义的地方结束。如果它与类型本身的外部事物相关——也就是说,它不仅仅是不是实例的行为,而是与外部事物交互的问题——把它放在外面可能是有意义的。例如,您可能有Book, BookDatabase, BookForm,BookWebService等。其中一些成员很少的类没有害处,您永远不知道什么时候

于 2013-02-21T00:07:45.887 回答
2

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

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

所以写书和书,然后写类似的东西

BookDatabase 使用 Books GetBooks() 等方法扩展数据库;和 void SaveBook(Book argBook); 真正的诀窍是让 Book 和 Books 工作,无论它们是什么/如何存储的。

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

于 2013-02-21T00:10:14.300 回答
0

看来您的设计存在严重缺陷。您必须分离三个问题:

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

一个简化的例子:

// 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.

     }
}
于 2013-02-21T18:13:30.127 回答