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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

3回答

7209閲覧

classの配下にclassを作るかどうか

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

2グッド

0クリップ

投稿2018/08/16 12:29

ずっと独学でやっていたのですが、最近大きめのアプリを作るようになり、コードが3000行に近づいてきたため、オブジェクト指向できちんと整理する必要を感じています。
オブジェクト指向については、書籍やwebで読んで勉強した程度です。

いま疑問に思っているのが、明らかにある特定のclassの配下でしか用いられないclassをどのように定義したらいいのかということです。

たとえば、
Gakkyu > Student
という関係があり、
・Gakkyuは複数のStudentを保持する
・Studentは基本的にGakkyuの配下でしか使われない
とします。
その場合の書き方として以下の2通りが考えられると思います。

その1

python

1Class Gakkyu(): 2 def __init__(self,data): 3 data > 適宜の処理:self.students = [StudentA,StudentB,StudentC,...] 4 5 def sum_methods(self): 6 .... 7 8Class Student(): 9 def __init__(self,name,no): 10 self.name=name 11 self.no=no 12 13 def sum_methods(self): 14 ....

その2

python

1Class Gakkyu(): 2 def __init__(self,data): 3 data > 適宜の処理:self.students = [StudentA,StudentB,StudentC,...] 4 5 def sum_methods(self): 6 .... 7 8 Class Student(): 9 def __init__(self,name,no): 10 self.name=name 11 self.no=no 12 13 def sum_methods(self): 14 ....

素朴な考えとして、Studentが確実にGakkyuの配下にあるのなら、ClassもGakkyuの配下におくほうが自然な感じがします。
しかしClassを並列においているケースも見かけるように思います。

この場合、
(1)原則的にどちらの方法をとるべきでしょうか
(2)その理由はなんでしょうか、(原則的なやり方のメリット、原則的でないやり方のデメリットなど)

この点についてアドバイスをいただけると幸いです。
よろしくお願いいたします。

LouiS0616, Hirobou👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

原則的にどちらの方法をとるべきでしょうか

個人的には、前者です。内部クラスにはしません。

その理由はなんでしょうか

Gakkyuが保持しているのはあくまでStudentのインスタンスだからです。
Studentクラスを内部に保持する妥当性をあまり感じません。

私なら、次のように書くような気がします。

Python

1class _Student: 2 ... 3 4class Gakkyu: 5 ...

万が一 Studentクラスを利用する場面が増えたとしても、自然に対応可能ですので。


一方、クラス固有の例外クラスなどは内部に定義しても良いのではないでしょうか。
固有の例外クラスをホイホイ転用されては困りますし、ネストもそこまで深くなりません。

投稿2018/08/16 12:55

編集2018/08/16 14:14
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/16 23:03

ありがとうございます! たしかにひな形の下にひな形があることはなんとなく違和感はありました(全てのgakkyuインスタンスがstudentクラスをいちいち保持するのか??など、変な感じ) やたらネストが深くなったり、結局そのクラスが巨大化するのと同じになりそうだとか…。 フラット方式で試してみたいと思います。
guest

0

pythonはモジュールがあるので、同時に使うものなどはそちらでまとめれば良いと思います。

3000行はただごとではないので、幾つかのファイルに分けて(pythonではファイルがそのままモジュールになりますから、うまく分ければコードの見通しもよくなって一石二鳥)、冗長な部分を削りましょう。

投稿2018/08/16 13:58

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/08/16 23:09

ありがとうございます! 今のところ、main + module(全部入り)の2ファイルになっていました。確かにモジュール自体きちんと分割していったほうがよさそうです。ちなみに、1モジュールの行数に目安はあるでしょうか。たとえばメソッドは10行から20行におさめよなんて話があったりしますが、モジュールにもそういうのあるのでしょうか。
hayataka2049

2018/08/17 00:01 編集

あまり聞きません。言語やプロジェクトによって相応しい行数は変わってくるでしょうし、それより適切な粒度で意味的にまとまっていて疎結合になっていることの方が大事ですね。
hayataka2049

2018/08/17 00:08

ただし個人的には、長いと心情的につらいという理由から、pythonならコメント行抜きで500行未満くらいを好みます。
guest

0

ベストアンサー

この場合内部クラスにしないのが一般的だと思います。

現実にあてはめると
教師と生徒の関係さえあれば、学級が無くとも生徒は存在出来るのではないでしょうか。
内部クラスにした場合、使う場合も拡張する場合も、生徒と学級が関係することになり、個人的には違和感があります。
つまり、参照関係と定義の内包関係は別の話題と考えるべきなのです

このように現実に当てはめて考えていると、
内部クラスが必要なケースというのはあまり多くありません。

では、どういうときに作るかというと、
他の回答者の方も言われているように固有の例外クラスの定義だったり
処理の都合上情報をまとめておきたい場合など、
現実のモデルではなく、プログラム上のモデルの表現で作ることが多いと思います。

投稿2018/08/17 13:26

mitsu-wan

総合スコア136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問