オブジェクト指向で、データモデルを生成するクラスにはどんな名前をつけるべき？


オブジェクト指向の初学者です。データモデル？を生成するクラスの命名に困っています。

以下のような、モデルの生成・編集・削除などをするクラスのことはオブジェクト指向ではなんと呼ぶのでしょうか？また、こうしたオブジェクト指向のクラスの責任の分け方を学ぶためには何を参照するのがよいでしょうか。

[code]

    # このクラスが"データモデル"です。
    Class User():
        self.name = ""
        self.age = 0
    
    # このクラスの命名に悩んでいます。
    Class UserFromDatabase():
        self.db = DBClient()
    
        def make_user():
            data = self.db.create({table: "user"})
            return User(data)
    
        def get_user(id):
            data = self.db.get({table: "user", id: id})
            return User(data)
    
        def delete_user(id):
            self.db.delete({table: "user", id: id})
    
        ......
    
[/code]

ご教授いただければ幸いです。




# このオブジェクトの名称について

`UserFromDatabase` のようなオブジェクトを呼ぶ名前はいくつか存在するようです。

ドメイン駆動設計やクリーンアーキテクチャにおける言葉遣いでは  
正に永続化システム(RDBMSなど)からデータを引き出して  
`Model` のインスタンスを検索・取得・構築するためのクラスのことを `Repository` と呼びます。

また別の有名な名称としては Core J2EE Patternsというデザインパターン集で提起された `DAO` (DataAccessObject)
があります。  
ただし `DAO` の役割は、永続化システムそのものを後から置き換えできるように準備するものです  
そのため基本的にはDAOは、永続化システムに対応して1つだけ準備するという考え方をする(傾向がある)ので、  
`User` に関するデータベース操作だけを書いたコードでは少し範囲が足りていないかもしれません。

そのためこの場合は `UserRepository` とするのが適切だと思います。

# 学び方

さてオブジェクトの責任の分け方を学ぶ方法ですが、  
デザインパターンの本や、アーキテクチャの本を読むと良いでしょう。  
特にデザインパターンは直接的にうまいやり方をカタログ的に教えてくれるので、最初に学ぶのには良いと思います。

