質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.21%

オブジェクト指向で細かくクラス分けすることについて

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 464

renge

score 17

オブジェクト指向を学習中の初心者です。クラスとかインスタンスだとか、基本的な概念はそこそこには理解できてるつもりです。
そして、実装にあたってオブジェクト指向のエクササイズの9つのルールなるものを知り、それに関するサイトを色々と見てみました。
そこで、このルールに乗っ取るとたくさんのクラスが生まれ、クライアントから樹木状に伸びていくと思います。そうするとそのプロジェクトを初めて見る人にとっては把握するのがむしろ大変になりませんか?
扱いやすいようにしたとしても中身の細かい仕様を見たいときはあると思いますし、そうしたときにAを理解するにはB1とB2を理解する必要があって、B1にはC1とC2があって...というようでは扱いづらいのではないでしょうか?それとも、この手法は一般的には用いられていないものなのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • renge

    2020/11/15 13:25

    miyabi_takatsukさん
    確かにそうですね。hentaimanさんも仰っていたとおり、手段と目的を履き違えてしまったようです。貴重な意見ありがとうございました。

    Zuishinさん
    わかりました。もう少し寝かせてみようと思います。ありがとうございます

    キャンセル

  • hentaiman

    2020/11/15 13:47

    > 「全てのプリミティブ型と文字列型をラップする」というルールなどがありましたが、
    前提条件無しにそれだけ言われても判断つきませんが、問答無用でそれをルールとしているなら間抜けですね。たまたまそれが有効だった開発を経験をした、時の止まったおじいちゃんプログラマーが決めたルールとか?

    > 手段と目的を履き違えてしまったようです。
    とは言うものの、先人達の経験によって築き上げられたデザインパターンは基本的に有用なものなので、デザインパターンに沿って作る事を目的としても結果オーライな事がほとんどでしょう。
    この辺は疑問を感じて質問するよりも手を動かして経験する方が良いかと。

    キャンセル

  • renge

    2020/11/15 17:40

    なるほどです。とりあえず、既存のプロジェクトを細かいクラスにリファクタリングしていこうと思います。いざやってみるとどこまで区切ってクラスで取るかなど色々と難しいですが、自分のできる精一杯デザインパターンを踏襲して経験を積んでいこうと思います。

    キャンセル

回答 4

+4

こんにちは。

クラスを細かく分け、階層構造を作ると追い辛くなるのではという意見は良く理解できます。
しかし、オブジェクト指向におけるクラスの分割、階層化はそもそも「追う」ことを前提にしていません。
「抽象化とは何か」という話になってしまうのですが、クラス分けが実現しているのは「物事を行うために、知らなければならない範囲を小さくする」という概念です。

例えば、とある会社があるとします。この会社の「人事部」に「書類の作成」を依頼する際に、人事部の下に沢山の課があって、どの課にどんな社員が属しているかを考える必要はありません。
例えば、プログラムで「ファイルを読み込む」とき、どうやってファイルパス文字列からデータの格納位置を割り出しているのか知る必要はありません。
例えば、コンピュータを「使う」とき、CPU の中を電気がどのように通っているのかを知る必要はありません。

クラスの分割とは、「知らなければならないこと以外を分離する」という考えのもとで行われるのです。
「A を理解するには B1 と B2 が必要」というのは、言い換えると「A を使うのに B1 と B2 を知る必要はない」ということです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/04 18:13

    補足欄でいろいろな方に教えていただいたのですが、それを実践しているうちに忘れてしまって、返信が非常に遅くなってしまいました。本当に申し訳ないです。
    たしかにクラスの基本的な考えってそのとおりですよね。失念しておりました。非常に参考になる意見ありがとうございました。高評価もたくさんついているので非常に迷いましたが、個人的に自分が開発する際にドキュメントを作るという発想がなかったのでBAを他の方につけさせていただきましたが、自分で開発するにしてもそのクラスの内部を把握していなくても使用できるような構造を心がけようと思います。改めて回答ありがとうございました

    キャンセル

checkベストアンサー

+2

そこで、このルールに乗っ取るとたくさんのクラスが生まれ、クライアントから樹木状に伸びていくと思います。そうするとそのプロジェクトを初めて見る人にとっては把握するのがむしろ大変になりませんか?

そのために普通のプロジェクトではドキュメントを作成します。

ドキュメントのスコープや形式は色々ありますが、それらはシステムを理解する手助けをするものである、という共通の目標があります。

あなたのプロジェクトに今後入ってくるメンバーが把握するのが大変だ、と感じるようであれば、把握するために必要になるドキュメントを作成してください。

また、設計段階で抽象化のレベルをちゃんと意識して、適切な命名を行っていれば、ある程度構造を把握するための手助けにもなります。まず抽象度の高いものに着目し、具象的な命名となっているもの(つまり詳細な実装)をひとまず飛ばして読み進めることで、大まかな設計の意図はある程度汲み取れます。

質問文で提起している問題点はクラスの関係性についてのものだと思いますが、これを表現するためのUMLという記法もあります。関係をビジュアルとして表現できるため、ドキュメントとしてUMLを書いたり、コードからUMLを生成するツールを使うなどして、補助的に利用する場合もあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/04 18:05

    回答有り難うございます!皆さんに補足欄などで教えていただき、自分で色々とやっているうちに回答を見せていただくのが本当に遅くなってしまいました。
    ドキュメントを作ろうという意見は非常に納得いたしましたので、ベストアンサーをつけさせていただきます

    キャンセル

+2

「オブジェクト指向エクササイズ」の9のルールというのは、ToughtWorks アンソロジーという本の中で Jeff Bay 氏が紹介している方法ですが、
これはあくまでも、よいオブジェクト指向プログラミングができるようになるための「練習方法」であって、「思考停止してこれに従っていれば自動的に良いプログラムが出来上がる魔法の方法」ではありませんし、これらのルールはそのまま本番で適用することを意図したものではありません。
他の回答者さんも言っているように、「小さいクラスがふさわしいときは小さくするのが良い。そうでないときは小さいクラスにはしない」というのが実際のプログラマーが考えていることですが、これはトートロジーであって、「どういうときに小さいクラスにするのが良いのか?」「小さいクラスにはどういう利点があって、どういう欠点があるのか?」というのは、実際に自分で小さいクラスを実装してみなければ「体得」することはできません。

詳しいことが知りたれば、書籍を読んでください。ネットでアマチュアが書いた無料の記事や、Q&Aサイトで聞いただけではわからない知識というものは、あります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/01/04 18:09 編集

    補足欄で皆様に教えていただいたとおり、自分で色々とやっていたら忘れてしまい、返信が遅くなって本当に申し訳ないです。
    なるほど、自分でやってみることが大切なのですね。クラスでかくのが億劫になっていましたが、また挑戦してみようと思います。個人的に自分の状況に合う方にベストアンサーをつけさせていただきましたが、非常に参考になる意見でした。ありがとうございました

    キャンセル

+1

オブジェクト指向やらクラスやらと言っても、コードの構造がわかりやすいようにやってるモノなので、あなたの思うようにすればいいと思います。

まあ、言語の学習度合いや、経験などでそのわかりやすさってのは変わってきますんで、ベテランさんが提唱するわかりやすさってのは初心者のあなたは理解しづらいと思います。

まずはとにかくいろいろやってみて経験を積んでいくことでしょうね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/11/15 11:13

    い、いや、そんなすぐにBAださいでも、いろんなひとの意見を聞いてみればどーでしょうw

    キャンセル

  • 2020/11/15 11:19

    おっしゃるとおりですね。
    すみません、気づかず誤タップしていました。申し訳ないですが、BA外させていただきます...

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る