1

これが他の場所で回答されている場合は申し訳ありません。私の検索では、探していた回答が得られませんでした。

仮に、書店向けのアプリケーションを作成しているとしましょう。

すべてのデータベース トランザクションを処理するクラスがあります。Database クラスを拡張する 'Book' クラスもあり、独自のコンストラクターから Database コンストラクターを呼び出して、最初に Database クラスをインスタンス化する必要がなくなります。

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

「Book」クラス コンストラクターに参照 ID を渡し、その本に関するデータベースから取得した情報を含むオブジェクトを、特定の本に関連するいくつかのメソッドと共に作成できます。

しかし、データベース内のすべての本もリストしたいと思います。私の質問は、このメソッドと、「Book」などのコンテキストを持たない他のメソッドをどこに配置すればよいかということです。

Database クラスを拡張する単一の「GetStuff」または「Bookshop」クラスを作成できます。このクラスには、これらすべての使い捨てメソッドが含まれます。ただし、これらの孤立したメソッドはプログラム全体で使用されるため、常にロードする必要があります。

1 つのメソッドを格納するクラスを多数作成できますが、メソッドを呼び出すためにクラスをオブジェクトにインスタンス化する必要があり、やり過ぎのように思えます。

それらは一般的な公益事業ではなく、ビジネス モデルの一部です。これらの孤立したメソッドをどこに置くべきですか?

4

3 に答える 3

2

本は本、本は本のコレクション。データベースは、多くの本を永続化するために使用できるものの 1 つであり、それらすべてを再度入力する必要はありません。

xml ファイル、Excel スプレッドシート、さらには Web サービスの場合もあります。

Book と Books を書き、次に次のように書きます。

BookDatabase は、Books GetBooks(); のようなメソッドでデータベースを拡張します。そして void SaveBook(Book argBook); 本当の秘訣は、Book と Books が保存されているものや方法に関係なく動作するようにすることです。

それについて学ぶべきことはまだたくさんありますが、最初にやるべきことは、最初からやり直して、データ オブジェクトを特定の「データベース」に依存させないようにすることです。

于 2013-02-21T00:10:14.300 に答える
2

私がそれを理解していれば、特定の型に関連しているが、型自体の動作を実装していないコードをどこに置くべきかを尋ねています。単一の答えはありません。システムの全体的な設計によれば、それは型の一部である可能性があります.Smalltalkクラスには「クラスフィールド」と「インスタンスフィールド」があり、それには何の問題もありません.または、意味のある場所で終わる可能性があります. それが型自体の外部にあるものに関連している場合、つまり、単にインスタンスの動作ではないという問題ではなく、無関係なものとの相互作用の問題である場合、それを外部に置くことは理にかなっているかもしれません。たとえばBookBookDatabaseBookFormBookWebService、 などがあるかもしれません。これらのクラスの一部にはメンバーがほとんどなくても害はありません。

于 2013-02-21T00:07:45.887 に答える
0

あなたのデザインには深刻な欠陥があるようです。次の 3 つの懸念事項を分離する必要があります。

  1. あなたのドメイン層 (DM): この場合、Book はそれに属します。
  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 に答える