teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

2021/01/02 06:59

投稿

siruku6
siruku6

スコア1382

title CHANGED
File without changes
body CHANGED
@@ -74,6 +74,15 @@
74
74
  ・ManagerはFacadeのつもりです
75
75
  ・今回の質問とは関係ないですが、Managerは、ClientA, ClientBの処理結果を統合してCallerに返却する他のメソッドも多数持っています
76
76
 
77
+ ## 上図のようなクラス設計にした理由(追記2回目)
78
+
79
+ クラス設計の理由を書いていなかったので解説します。
80
+ 当初はCallerA, B...という複数のクラスが、各Clientを五月雨式に呼び出していました。
81
+
82
+ しかし、各Caller間で重複する処理が出てきたことや、可読性が大幅に低下したことがきっかけで、CallerとClientの間に中間クラス(Manager)を設けることを考えつきました。
83
+
84
+ ※この中間クラスをFacadeなどと呼ぶこともあると知ったのはここ数日の話なので、もしかしたらこの呼称は間違っているかもしれません。
85
+
77
86
  ## 各クラスのソース
78
87
 
79
88
  ```python

3

省略したところがわかるようにコメントなどを挿入

2021/01/02 06:58

投稿

siruku6
siruku6

スコア1382

title CHANGED
File without changes
body CHANGED
@@ -72,7 +72,7 @@
72
72
  ・CallerB has Manager
73
73
  ・Manager has ClientA and ClientB
74
74
  ・ManagerはFacadeのつもりです
75
- ・今回の質問とは関係ないですが、Managerは、ClientA, ClientBの処理結果を統合してCallerに返却する役割も持っています
75
+ ・今回の質問とは関係ないですが、Managerは、ClientA, ClientBの処理結果を統合してCallerに返却する他のメソッド多数持っています
76
76
 
77
77
  ## 各クラスのソース
78
78
 
@@ -88,6 +88,7 @@
88
88
  def some_method(self):
89
89
  self.manager.call_client('aaa', variable_a='a', variable_b='b')
90
90
  return result
91
+ # 以下略
91
92
  ```
92
93
 
93
94
  ```python
@@ -110,6 +111,7 @@
110
111
  def some_method_c(self):
111
112
  self.manager.call_client('ccc', variable_c='c')
112
113
  return result
114
+ # 以下略
113
115
  ```
114
116
 
115
117
  ```python
@@ -135,6 +137,7 @@
135
137
  # variable_c を使用する処理
136
138
  c = ....
137
139
  return c
140
+ # 以下略
138
141
  ```
139
142
 
140
143
  ```python
@@ -147,6 +150,7 @@
147
150
  # variable_a, variable_b を使用する処理
148
151
  a = ....
149
152
  return a
153
+ # 以下略
150
154
  ```
151
155
 
152
156
  ```python
@@ -159,4 +163,5 @@
159
163
  # 何らかの処理
160
164
  b = ....
161
165
  return b
166
+ # 以下略
162
167
  ```

2

ソースの誤記の修正

2021/01/02 04:05

投稿

siruku6
siruku6

スコア1382

title CHANGED
File without changes
body CHANGED
@@ -143,8 +143,8 @@
143
143
  def __init__(self):
144
144
  pass
145
145
 
146
- def return_a(self, variable_a):
146
+ def return_a(self, variable_a, variable_b):
147
- # variable_a を使用する処理
147
+ # variable_a, variable_b を使用する処理
148
148
  a = ....
149
149
  return a
150
150
  ```

1

ソースコードや質問の背景を記載

2021/01/02 03:45

投稿

siruku6
siruku6

スコア1382

title CHANGED
File without changes
body CHANGED
@@ -51,4 +51,112 @@
51
51
  - なるべく初心者でも理解しやすい
52
52
  - 循環的複雑度が低くなるようにする
53
53
 
54
- lambda関数とか使ったらもう少しわかりやすくなったりしないでしょうか....。
54
+ lambda関数とか使ったらもう少しわかりやすくなったりしないでしょうか....。
55
+
56
+ ---
57
+
58
+ # 追記 (2021/01/02)
59
+
60
+ ご指摘やいくつかの回答のおかげで、具体的なソースがないと回答のしようがないことがわかりましたので、ソースコードのサンプルを掲載します。
61
+
62
+ ※実際のコードではないので、そのまま実行しても動作しないかエラーになる可能性があります。
63
+ 実際のコードは、各ファイルが数百行に及び、かなり可読性も低い状態のため、大幅に省略することにしました。
64
+
65
+ ## ソースの概要
66
+
67
+ - 以下にクラス図を示します
68
+ ここ数日で勉強したばかりなので、間違っていたらすみません
69
+ ![クラス図](1c2a67c4a7a071f011b46c4c3204ed94.png)
70
+ - 上記の図は以下の関係性を表しています
71
+ ・CallerA has Manager
72
+ ・CallerB has Manager
73
+ ・Manager has ClientA and ClientB
74
+ ・ManagerはFacadeのつもりです
75
+ ・今回の質問とは関係ないですが、Managerは、ClientA, ClientBの処理結果を統合してCallerに返却する役割も持っています
76
+
77
+ ## 各クラスのソース
78
+
79
+ ```python
80
+ # CallerA
81
+ from manager import Manager
82
+
83
+
84
+ class CallerA():
85
+ def __init__(self):
86
+ self.manager = Manager()
87
+
88
+ def some_method(self):
89
+ self.manager.call_client('aaa', variable_a='a', variable_b='b')
90
+ return result
91
+ ```
92
+
93
+ ```python
94
+ # CallerB
95
+ from manager import Manager
96
+
97
+
98
+ class CallerB():
99
+ def __init__(self):
100
+ self.manager = Manager()
101
+
102
+ def some_method_a(self):
103
+ self.manager.call_client('aaa', variable_a='aa', variable_b='bb')
104
+ return result
105
+
106
+ def some_method_b(self):
107
+ self.manager.call_client('bbb')
108
+ return result
109
+
110
+ def some_method_c(self):
111
+ self.manager.call_client('ccc', variable_c='c')
112
+ return result
113
+ ```
114
+
115
+ ```python
116
+ # Manager
117
+ from clients.client_a import ClientA
118
+ from clients.client_b import ClientB
119
+
120
+
121
+ class Manager():
122
+ def __init__(self):
123
+ self.client_a = ClientA()
124
+ self.client_b = ClientB()
125
+
126
+ def call_client(self, method, **kwargs):
127
+ method_dict = {
128
+ 'aaa': self.client_a.return_a,
129
+ 'bbb': self.client_b.return_b,
130
+ 'ccc': self.return_c,
131
+ }
132
+ return method_dict.get(method)(**kwargs)
133
+
134
+ def return_c(self, variable_c):
135
+ # variable_c を使用する処理
136
+ c = ....
137
+ return c
138
+ ```
139
+
140
+ ```python
141
+ # ClientA
142
+ class ClientA():
143
+ def __init__(self):
144
+ pass
145
+
146
+ def return_a(self, variable_a):
147
+ # variable_a を使用する処理
148
+ a = ....
149
+ return a
150
+ ```
151
+
152
+ ```python
153
+ # ClientB
154
+ class ClientB():
155
+ def __init__(self):
156
+ pass
157
+
158
+ def return_b(self):
159
+ # 何らかの処理
160
+ b = ....
161
+ return b
162
+ ```