

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

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

[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]

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


CC BY-SA 4.0
2018-11-27T00:45:59.103
50657
2018-11-28T15:21:59.803
26110
question
python
オブジェクト指向で、データモデルを生成するクラスにはどんな名前をつけるべき？


Pythonコードのコーディング規約
pep8では、クラスの命名は次のようになっていますが、CapWords（単語の頭文字を大文字にしてつなげる）を使えとしか書いてありません。

<https://www.python.org/dev/peps/pep-0008/#class-names>

> Class Names
>
> Class names should normally use the CapWords convention.
>
> The naming convention for functions may be used instead in cases where the
> interface is documented and used primarily as a callable.
>
> Note that there is a separate convention for builtin names: most builtin
> names are single words (or two words run together), with the CapWords
> convention used only for exception names and builtin constants.

少なくも、Pythonの公式マニュアルや入門書にはClassの命名については何も書いてないので、自分の好きなように命名すればいいのではないでしょうか。

また、質問にある`User`クラスのようなものであれば、Pythonではクラスにせずにtupleやdictを使って処理し、UserFromDatabase
の方はモジュールにしてしまう方が処理が速いため、Java, C#, Ruby
のようにはクラスを多用しません。そのため、Pythonでクラスの命名規則を解説をしているものは少ないと思います。

Pythonの中で、質問のようなクラスを使うのは`Django`とか`SQLAlchemy`とかなのでそれらを勉強してみるのもいいかもしれません。また、Python3.7で導入された`Data
Classes`を使って見るのもいいのではないですか。また、Java, C#, Ruby 等の命名規則を準用するというのもいいかもしれません。


CC BY-SA 4.0
2018-11-27T04:41:20.853
50664
2018-11-28T09:38:16.620
2018-11-28T09:38:16.620
15171
15171
50657
answer


オブジェクト指向界隈の名付け方からするとそれはUserFactoryとか、delete機能などもついてるのでUserManagerとかになると思いますが、僕はDBConnectorとかのほうがいいと思います。

何故ならば、クラスが保持しているメンバ変数はDBの接続に関する内容であり、それこそがクラスの存在意義そのものだからです。  
僕はすぐにクラスを作りません。まず新しい名前空間を作り関数を書き始めます。それでは不都合が発生する場合にのみクラスを作成します。

設問者の例ですと、DBの接続という **状態**
をコントロールするためにクラス化が意味を持ちます。DBに保存するデータがなんであるのかはそのクラスの本質ではないと思いますし、User型が満たすべき条件の定義はUser型内部で定義すべきだと思います。  
例えばDBにUserデータ以外のものを保存したくなった時、例えばBlogデータを格納したいとなったときに、UserManagerという名前をつけてしまっているとそれとは別のBlogManagerクラスを作ることになります。これでは再利用性が低いクラスを量産することが目に見えています。クラスを作るたびにDBに格納しようとするたびにManagerクラスを作りたいかどうかという視点が重要だと思います。


CC BY-SA 4.0
2018-11-27T13:53:34.870
50681
2018-11-27T13:53:34.870
25980
50657
answer


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

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

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

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

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

# 学び方

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


CC BY-SA 4.0
2018-11-27T16:41:51.633
50688
2018-11-27T16:41:51.633
30827
50657
answer