質問編集履歴

4

回答を受けて問題を明確化しました

2024/01/08 16:01

投稿

yutoml
yutoml

スコア9

test CHANGED
File without changes
test CHANGED
@@ -1,12 +1,26 @@
1
- ## 1.知りたいこと
1
+ ## 1.概要
2
2
 
3
3
  データの操作を行うクラスに、例えばcsvやjson形式のファイルに対する入出力を行うメソッドを実装するべきなのか悩んでいます。
4
+
5
+ ほかの有名なパッケージではデータをファイルに保存するメソッドはクラス内で実装されています。
6
+ 一方ソフトウェア工学に基づけばファイルに保存するメソッドはクラス外に実装するべきだと思われます。
7
+
8
+ どちらの実装も可能です。
9
+ 将来的なクラスの改変を想定されるときどちらの実装が望ましいでしょうか?
4
10
 
5
11
  ## 2.背景、状況
6
12
 
7
13
  私は仕事の効率化のために個人的に少しばかりPythonを触っているものです。
8
14
  検索や並び替えなど簡単なデータの操作を行うクラスを実装しようと考えています。
9
15
  現時点ではファイルからデータを読み取ることをほとんど前提としています。
16
+
17
+ 想定している前提状況
18
+
19
+ * クラス外からファイルに保存するのに必要なデータを完全に復元できるだけの情報にアクセスできる
20
+ * ただしクラス外から得られるデータはそのままでは適切にファイルに保存できず、保存に際してクラス内での実装に依存した処理が必要になる
21
+ * 例えばクラス初期化に際して与えたlist[float]の数列がクラス外からアクセスするとnumpy.ndarrayとして得られるなど
22
+
23
+ 問題は上記の前提状況でクラス外とクラス内どちらにファイルに保存するメソッドを実装するべきかというものです。
10
24
 
11
25
  ## 3.調査したこと
12
26
 
@@ -50,7 +64,15 @@
50
64
 
51
65
  先に述べた通り、自分は最近になってSOLID原則などを知るようになった者で上記の自分の考えが正しいのか全く自身がありません。
52
66
  周りには質問できるようなひとがいないためこちらで質問させていただきます。皆さんのご意見を伺いたいです。
67
+
68
+ 将来的なクラスの改変も予想されるときに
69
+ 1. クラス外にファイルへの入出力のメソッドを実装する
70
+ 2. クラス内にファイルへの入出力のメソッドを実装する
71
+ どちらがより**理想的で望ましい**実装方法でしょうか?
72
+
53
73
  よろしくお願いいたします。
74
+
75
+ ## 6.最後に
54
76
 
55
77
  またteratailでの質問はこれが初めてなので質問場所が適切でなかった場合や、タグ付けが正しくないなどあるかもしれません。
56
78
  その際はご指摘の上、ご容赦頂ければ幸いです。

3

見出しにわかりやすく変更しました

2024/01/07 14:06

投稿

yutoml
yutoml

スコア9

test CHANGED
File without changes
test CHANGED
@@ -1,16 +1,16 @@
1
- ## 知りたいこと
1
+ ## 1.知りたいこと
2
2
 
3
3
  データの操作を行うクラスに、例えばcsvやjson形式のファイルに対する入出力を行うメソッドを実装するべきなのか悩んでいます。
4
4
 
5
- ## 背景、状況
5
+ ## 2.背景、状況
6
6
 
7
7
  私は仕事の効率化のために個人的に少しばかりPythonを触っているものです。
8
8
  検索や並び替えなど簡単なデータの操作を行うクラスを実装しようと考えています。
9
9
  現時点ではファイルからデータを読み取ることをほとんど前提としています。
10
10
 
11
- ## 調査したこと
11
+ ## 3.調査したこと
12
12
 
13
- ### ほかのパッケージでの実装
13
+ ### 3.1ほかのパッケージでの実装
14
14
 
15
15
  pandasやほかの自分が利用しているパッケージを3つほど思いつく限り参考にしてみたところ、すべて入力する処理は独立した関数として分割されていますが、出力はインスタンスメソッドとして実装されていました
16
16
 
@@ -28,7 +28,7 @@
28
28
  conn.commit()
29
29
  ```
30
30
 
31
- ### ソフトウェア工学的な原則
31
+ ### 3.2ソフトウェア工学的な原則
32
32
 
33
33
  自分は最近になってSOLID原則などを知るようになった程度なので以下の考えはきちんと理解できていない人間のものだと思います。
34
34
 
@@ -42,7 +42,7 @@
42
42
  * 1.[きれいなコードを書くためにSOLID原則を学びました① \~単一責任の原則\~](https://qiita.com/suzuki0430/items/b13c7c1f637e7cd2146d)
43
43
  * 2.[設計におけるオブジェクトの責務分配に有効なものさし -凝集度と結合度-](https://www.ogis-ri.co.jp/otc/hiroba/technical/Cohesion_Coupling/Cohesion_Coupling.html)
44
44
 
45
- ## 自分なりの考え
45
+ ## 4.自分なりの考え
46
46
 
47
47
  ファイルからインスタンスを作成する際(入力時)にはクラスのインターフェースに従って入力すればよいので分割するのは簡単ですが、出力する側も分割する場合はクラスの内部につよく依存した形に実装されるように思われます。
48
48
  例えば数列をクラスの中ではNumpy.ndarrayで保存していた場合、これらをjson形式で保存する関数は数列の部分をlist形式にキャストして保存する必要があります。これはクラス外の実装がクラス内の実装に強く依存しており結合度の高い実装になってしまうように思われます。

2

誤字の修正と自分の意見を明確にいたしました。

2024/01/07 14:04

投稿

yutoml
yutoml

スコア9

test CHANGED
File without changes
test CHANGED
@@ -46,6 +46,7 @@
46
46
 
47
47
  ファイルからインスタンスを作成する際(入力時)にはクラスのインターフェースに従って入力すればよいので分割するのは簡単ですが、出力する側も分割する場合はクラスの内部につよく依存した形に実装されるように思われます。
48
48
  例えば数列をクラスの中ではNumpy.ndarrayで保存していた場合、これらをjson形式で保存する関数は数列の部分をlist形式にキャストして保存する必要があります。これはクラス外の実装がクラス内の実装に強く依存しており結合度の高い実装になってしまうように思われます。
49
+ したがって自分が実装するならクラスの内部にファイルの入出力にかかわるメソッドを実装します。
49
50
 
50
51
  先に述べた通り、自分は最近になってSOLID原則などを知るようになった者で上記の自分の考えが正しいのか全く自身がありません。
51
52
  周りには質問できるようなひとがいないためこちらで質問させていただきます。皆さんのご意見を伺いたいです。

1

調査したことなどが書かれていないとの指摘を受けたため追記いたしました。

2024/01/07 14:01

投稿

yutoml
yutoml

スコア9

test CHANGED
File without changes
test CHANGED
@@ -8,9 +8,46 @@
8
8
  検索や並び替えなど簡単なデータの操作を行うクラスを実装しようと考えています。
9
9
  現時点ではファイルからデータを読み取ることをほとんど前提としています。
10
10
 
11
- pandasやほかの自分が利用ているパッケージを3つほど思いつく限り参考にしてみたところ、すべて入力は分割されていますが(e.g. `pandas.read_csv() -> pandas.DataFrame`)、出力はクラスで実装されていました(e.g. `pandas.DataFrame.to_csv()`).
11
+ ## 調査した
12
12
 
13
+ ### ほかのパッケージでの実装
14
+
15
+ pandasやほかの自分が利用しているパッケージを3つほど思いつく限り参考にしてみたところ、すべて入力する処理は独立した関数として分割されていますが、出力はインスタンスメソッドとして実装されていました
16
+
17
+ ```python
18
+ # pandasの場合
19
+ # ファイルからの読み込み(クラスとは独立した関数)
20
+ dataframe : pandas.DataFrame = pandas.read_csv("data.csv")
21
+ # ファイルへの出力(インスタンスメソッド)
22
+ dataframe.to_csv("data.csv")
23
+
24
+ # sqliteの場合
25
+ # dbへの接続(クラスとは独立した関数)
26
+ conn : sqlite3.Connection = sqlite3.connect("data.db")
27
+ # dbへの書き込み(インスタンスメソッド)
28
+ conn.commit()
29
+ ```
30
+
31
+ ### ソフトウェア工学的な原則
32
+
33
+ 自分は最近になってSOLID原則などを知るようになった程度なので以下の考えはきちんと理解できていない人間のものだと思います。
34
+
35
+ SOLID原則における単一責任の原則に基づけば、考えているクラスはデータの改変や操作に集中するべきで、データの保存に関しては分割するべきであるように思われます。
13
- 最近になってSOLID原則などを知るようになったで自分ではこれは単一責任しているから分けるべきなのか、ファイルの入出力はほとんど必要な作業だから凝集度を上げるために一つにまとめるべきなのか判断できません。
36
+ ~一方でデータ操作付随してファイルの入出力はほとんど必要な作業であるで、凝集度を上げるために一つにまとめるべきなのか判断できません。~
37
+ 凝集度を勘違いしていました。凝集度の視点では操作と保存が分割することは欠点にはならないと理解しました。
38
+
39
+ 参考1でもデータを取り扱うクラスと保存するクラスで分割しているようです。
40
+
41
+ 参考 :
42
+ * 1.[きれいなコードを書くためにSOLID原則を学びました① \~単一責任の原則\~](https://qiita.com/suzuki0430/items/b13c7c1f637e7cd2146d)
43
+ * 2.[設計におけるオブジェクトの責務分配に有効なものさし -凝集度と結合度-](https://www.ogis-ri.co.jp/otc/hiroba/technical/Cohesion_Coupling/Cohesion_Coupling.html)
44
+
45
+ ## 自分なりの考え
46
+
47
+ ファイルからインスタンスを作成する際(入力時)にはクラスのインターフェースに従って入力すればよいので分割するのは簡単ですが、出力する側も分割する場合はクラスの内部につよく依存した形に実装されるように思われます。
48
+ 例えば数列をクラスの中ではNumpy.ndarrayで保存していた場合、これらをjson形式で保存する関数は数列の部分をlist形式にキャストして保存する必要があります。これはクラス外の実装がクラス内の実装に強く依存しており結合度の高い実装になってしまうように思われます。
49
+
50
+ 先に述べた通り、自分は最近になってSOLID原則などを知るようになった者で上記の自分の考えが正しいのか全く自身がありません。
14
51
  周りには質問できるようなひとがいないためこちらで質問させていただきます。皆さんのご意見を伺いたいです。
15
52
  よろしくお願いいたします。
16
53