57374


クラスの命名について相談です。  
例えば下記のような2クラスがあった場合、2つ目の「いろいろなArticleを適当に返すクラス」のクラス名はどんな名称が適当に思われますか？

[code]

    class Article:
    
        def __init__(self, caterogy, title):
            self.title = title
            self.category = category
    
    class いろいろなArticleを適当に返すクラス:
    
        def generate_good_aricles(self):
            articles = []
    
            # (省略)categoryやtitleを見ながらなんらかのロジックで10個のArticleをarticlesにつめる処理
    
            return articles
    
[/code]

たとえばこんなのが考えられるかなと。  
1\. 単純に複数のArticleを扱うからArticles(これは一番最悪ですかね？)  
2\. 色々管理するから、AricleManager  
3\. もっと意味をカラフルにしてArticleSelector, ArcicleEditor, ArticleRecommenderなど

もちろんこのクラスが呼び出される文脈などの前条条件によるよって話はあると思います。  
適当に仮定をおいてもらって答えてもらってもいいですし、ジェネラルな範疇での回答でも構いません。

とあるクラスを複数個管理するクラスのクラス名は、上の例に限らず前からかなりの回数困っているので、皆さんのアドバイスを伺いたいです。よろしくおねがいします。


CC BY-SA 4.0
2019-08-15T07:08:54.543
57372
2019-08-16T12:22:54.033
32428
question
python javascript ruby 詳細設計
とあるクラスを複数個管理するクラスの適当なクラス名は？


rubyのタグもついているので、まずRuby on Railsならの話を。  
もしRailsを利用していたら、Articleはモデルになるパターンと思われます。その場合、クラスメソッドでArticleのArrayを返すように実装するのが普通で、それだけで足りる場合も多かったりするので、このパターンで悩むことはなかったりします。また、Article自体が基本的なDB操作も実装したクラスのサブクラスになっているので、

[code]

    # 記事全部
    all = Article.all
    
    # writerのidを指定
    articles = Article.find_by(writer: id)
    
    # 未読だけ
    unreads = Article.unread  # unreadはArticleクラスでwhere(unread: true)などで実装する
    
    # Arrayなので
    unread.each do |article|
      # 何か個々の処理
    end
    
[/code]

Pythonでも、Railsのようなフレームワーク（Djangoなど？）があると思いますので、どういう風になっているか研究すると、悩まずに済むかもしれません。

そして、どうしてもArrayなどでなかったり、拡張するクラスが必要なら、私なら「Articleが集まったら何になる？」という観点で考えます。  
例えばArticleが記事という意味ならば、話題（TopicとかSubject）とか、スレッド（Thread）とか、掲示板（Board）ですね。ただ、Threadは言語的に既に存在したり、プログラム概念的に使われたりするので除外します。  
あとは、自分が作っているものは何かを考えて、それに沿うものを採用するという感じですね。

あと、挙げられたパターンを私が検討するとすると、

  1. Typoの可能性があるので、他の人がメンテナンスする可能性があるのなら、採用しないです。とりあえず、実験で小さいプログラムを組むときや使い捨てのプログラムを組むときは、あまり悩みたくないので使うかもしれません。
  2. 本当に色々な管理（単にArticleが集まっているだけではない場合）なら採用するかもしれません。でも、その場合はArticleだけじゃないことが多いので、この名前にはなりそうにありませんが。
  3. Articleが何になるかすぐ思いつかない時などに仮で使ったりするかもしれません。あとで時間ができたらいい命名がないか考えます。

という感じで、3→2→1の優先順位で考えます。まあ、あまり悩んでも仕方ないので、名前は単純置き換えしやすいものを優先し、実装しているうちにこんな名前がいいかもと思った時に、全置換で置き換えたりします。

こんな感じで参考になるでしょうか？


CC BY-SA 4.0
2019-08-15T08:24:34.850
57374
2019-08-15T08:24:34.850
7900
57372
answer


>   1. 単純に複数のArticleを扱うからArticles(これは一番最悪ですかね？)
>   2. 色々管理するから、AricleManager
>   3. もっと意味をカラフルにしてArticleSelector, ArcicleEditor, ArticleRecommenderなど
>

1は良くないと思います。`いろいろなArticleを適当に返すクラス`は`Article`の集合ではないので。

２も良くないと思います。`Manager`って具体的に何をするのか不明瞭なので、命名のバッドプラクティスとしてよく上げられています。

私なら、３の線で検討するべきかと思います。  
記事をチョイスして返すので、`Curator`（キュレーター）とか、`ArticlePicker`なんかを思いつきました。  
正直、どういうロジックで記事を選定するのか、他のモデルにはどんなものがあるとか、そういった点も考慮する必要がありそうなので、何がベストなのかは一概に言えないと思いますが・・・ご参考になれば幸いです。


CC BY-SA 4.0
2019-08-16T01:15:07.543
57387
2019-08-16T01:15:07.543
9608
57372
answer


Rails であれば、 @sanadan
さんの回答で必要十分かとは思います。一方、いくつかの言語を並列して挙げられているので、なるべく汎用的なクラス命名の関する答えが欲しいのかな、とも思っています。

クラスをどのように命名して、プログラムを整理していくかの話で、そこそこ重要になる知見は、個人的には DDD であると思っています。 DDD
の意義や意図は別の記事などに譲るとして、そこでひとつ特徴的だなと思うのは、「永続化を取り扱うクラスに対して Repository
というクラスを命名する」だと思います。

つまり、今回のケースでの "generate_good_articles" メソッドについてですが、これはおそらく、データベースから "good" な
article
を引っ張ってくるメソッドなのかな、と思っています。それは、必然、データベースにどのようにデータが格納されているかについての情報を知っていないと、実装することは難しそうだと推察できます。

そのように、データベースについての知見を持っていて、実際に、ドメインのオブジェクトである Article
たちをデータベースの情報から構築するクラスは何かを考えた場合、なので DDD 的には、このクラスは ArticleRepository
なのではないかな、と思っています。

* * *

追記として、今回の例示されているコードは python だと思っています。 python だと、永続化のライブラリとして、一番有名なのは
sqlalchemy であると思っています。 sqlalchemy であった場合、 generate_good_articles
のシグネチャは以下のようになると思っています。

[code]

    // クラスではなくただの関数
    def generate_good_articles(session):
        articles = []
        // session を用いてなんらかの select を行うコード
        // session.query(Article) 的な。
        return articles
    
[/code]

このようにコードを整理していくと、もしかしたらクラスを作る必要はないかもしれません。全体の設計次第ではありますが。


CC BY-SA 4.0
2019-08-16T04:49:54.800
57399
2019-08-16T04:49:54.800
754
57372
answer


# 前提

ご自身で書かれたソースは

`generate_good_aricles`というメソッドの **のみ** を持ったクラスですね。

加えて、質問に

> 2つ目の「いろいろなArticleを適当に返すクラス」のクラス名はどんな名称が適当に思われますか？

とありますことから

回答の対象となっている **クラスは1つのメソッドしか持たない** という **前提で回答を書きます** 。

また、蛇足かもですが、質問のタイトルは

> とあるクラスを複数個管理するクラスの適当なクラス名は？

と「管理」という用語をお使いですが、質問内容自体は、オブジェクトをジェネレートしているコードが掲載されており、あまり管理らしさはないように感じます。

# 回答

オブジェクト指向では

**クラス名** を **名詞**  
**メソッド名** を **動詞**

とすることで読みやすいコードとなることが知られています（このように推奨されることが多いです）。

さて、質問の通り、メソッドを1つだけ持つクラス名に適切な名詞をつけることが難しいことがあります（強引に名前をつけたとしても、Hogeマネージャとなってしまったり、クラス名自体を動詞にしてしまいたい等）。

こういった場合、サービスという名前をつけることがあります。

下記に例となるソースをRubyで書きました

[code]

    class GenerateGoodAriclesService
      def initialize(title:, category:)
        @title = title
        @category = category
      end
    
      def execute()
        # @titleと@categoryをもとにArticleの配列を返す
      end
    end
    
    GenerateGoodAriclesService.new(title: 'タイトル', category: 'カテゴリ').execute
    
[/code]

クラス名は `動詞（操作の内容） + Service`とし、イニシャライザーで、生成するオブジェクトに必要な材料をもらいます。

本当に生成する処理は `execute` というような素朴な名前がつけられていることが多いです。

* * *

前提条件が私の書いたものと異なり  
「永続化されたオブジェクトから該当のものを取り出す」や  
「DDDの文脈に置けるドメインから該当オブジェクトを取得する」  
といったものなのであれば、他の方の書いた回答が参考になると考えられます。


CC BY-SA 4.0
2019-08-16T11:10:04.257
57407
2019-08-16T12:22:54.033
2019-08-16T12:22:54.033
9008
9008
57372
answer