質問編集履歴

4

2021/01/02 06:59

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -150,6 +150,24 @@
150
150
 
151
151
 
152
152
 
153
+ ## 上図のようなクラス設計にした理由(追記2回目)
154
+
155
+
156
+
157
+ クラス設計の理由を書いていなかったので解説します。
158
+
159
+ 当初はCallerA, B...という複数のクラスが、各Clientを五月雨式に呼び出していました。
160
+
161
+
162
+
163
+ しかし、各Caller間で重複する処理が出てきたことや、可読性が大幅に低下したことがきっかけで、CallerとClientの間に中間クラス(Manager)を設けることを考えつきました。
164
+
165
+
166
+
167
+ ※この中間クラスをFacadeなどと呼ぶこともあると知ったのはここ数日の話なので、もしかしたらこの呼称は間違っているかもしれません。
168
+
169
+
170
+
153
171
  ## 各クラスのソース
154
172
 
155
173
 

3

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

2021/01/02 06:58

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -146,7 +146,7 @@
146
146
 
147
147
  ・ManagerはFacadeのつもりです
148
148
 
149
- ・今回の質問とは関係ないですが、Managerは、ClientA, ClientBの処理結果を統合してCallerに返却する役割も持っています
149
+ ・今回の質問とは関係ないですが、Managerは、ClientA, ClientBの処理結果を統合してCallerに返却する他のメソッド多数持っています
150
150
 
151
151
 
152
152
 
@@ -178,6 +178,8 @@
178
178
 
179
179
  return result
180
180
 
181
+ # 以下略
182
+
181
183
  ```
182
184
 
183
185
 
@@ -222,6 +224,8 @@
222
224
 
223
225
  return result
224
226
 
227
+ # 以下略
228
+
225
229
  ```
226
230
 
227
231
 
@@ -272,6 +276,8 @@
272
276
 
273
277
  return c
274
278
 
279
+ # 以下略
280
+
275
281
  ```
276
282
 
277
283
 
@@ -296,6 +302,8 @@
296
302
 
297
303
  return a
298
304
 
305
+ # 以下略
306
+
299
307
  ```
300
308
 
301
309
 
@@ -320,4 +328,6 @@
320
328
 
321
329
  return b
322
330
 
331
+ # 以下略
332
+
323
- ```
333
+ ```

2

ソースの誤記の修正

2021/01/02 04:05

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -288,9 +288,9 @@
288
288
 
289
289
 
290
290
 
291
- def return_a(self, variable_a):
291
+ def return_a(self, variable_a, variable_b):
292
-
292
+
293
- # variable_a を使用する処理
293
+ # variable_a, variable_b を使用する処理
294
294
 
295
295
  a = ....
296
296
 

1

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

2021/01/02 03:45

投稿

siruku6
siruku6

スコア1382

test CHANGED
File without changes
test CHANGED
@@ -105,3 +105,219 @@
105
105
 
106
106
 
107
107
  lambda関数とか使ったらもう少しわかりやすくなったりしないでしょうか....。
108
+
109
+
110
+
111
+ ---
112
+
113
+
114
+
115
+ # 追記 (2021/01/02)
116
+
117
+
118
+
119
+ ご指摘やいくつかの回答のおかげで、具体的なソースがないと回答のしようがないことがわかりましたので、ソースコードのサンプルを掲載します。
120
+
121
+
122
+
123
+ ※実際のコードではないので、そのまま実行しても動作しないかエラーになる可能性があります。
124
+
125
+ 実際のコードは、各ファイルが数百行に及び、かなり可読性も低い状態のため、大幅に省略することにしました。
126
+
127
+
128
+
129
+ ## ソースの概要
130
+
131
+
132
+
133
+ - 以下にクラス図を示します
134
+
135
+ ここ数日で勉強したばかりなので、間違っていたらすみません
136
+
137
+ ![クラス図](1c2a67c4a7a071f011b46c4c3204ed94.png)
138
+
139
+ - 上記の図は以下の関係性を表しています
140
+
141
+ ・CallerA has Manager
142
+
143
+ ・CallerB has Manager
144
+
145
+ ・Manager has ClientA and ClientB
146
+
147
+ ・ManagerはFacadeのつもりです
148
+
149
+ ・今回の質問とは関係ないですが、Managerは、ClientA, ClientBの処理結果を統合してCallerに返却する役割も持っています
150
+
151
+
152
+
153
+ ## 各クラスのソース
154
+
155
+
156
+
157
+ ```python
158
+
159
+ # CallerA
160
+
161
+ from manager import Manager
162
+
163
+
164
+
165
+
166
+
167
+ class CallerA():
168
+
169
+ def __init__(self):
170
+
171
+ self.manager = Manager()
172
+
173
+
174
+
175
+ def some_method(self):
176
+
177
+ self.manager.call_client('aaa', variable_a='a', variable_b='b')
178
+
179
+ return result
180
+
181
+ ```
182
+
183
+
184
+
185
+ ```python
186
+
187
+ # CallerB
188
+
189
+ from manager import Manager
190
+
191
+
192
+
193
+
194
+
195
+ class CallerB():
196
+
197
+ def __init__(self):
198
+
199
+ self.manager = Manager()
200
+
201
+
202
+
203
+ def some_method_a(self):
204
+
205
+ self.manager.call_client('aaa', variable_a='aa', variable_b='bb')
206
+
207
+ return result
208
+
209
+
210
+
211
+ def some_method_b(self):
212
+
213
+ self.manager.call_client('bbb')
214
+
215
+ return result
216
+
217
+
218
+
219
+ def some_method_c(self):
220
+
221
+ self.manager.call_client('ccc', variable_c='c')
222
+
223
+ return result
224
+
225
+ ```
226
+
227
+
228
+
229
+ ```python
230
+
231
+ # Manager
232
+
233
+ from clients.client_a import ClientA
234
+
235
+ from clients.client_b import ClientB
236
+
237
+
238
+
239
+
240
+
241
+ class Manager():
242
+
243
+ def __init__(self):
244
+
245
+ self.client_a = ClientA()
246
+
247
+ self.client_b = ClientB()
248
+
249
+
250
+
251
+ def call_client(self, method, **kwargs):
252
+
253
+ method_dict = {
254
+
255
+ 'aaa': self.client_a.return_a,
256
+
257
+ 'bbb': self.client_b.return_b,
258
+
259
+ 'ccc': self.return_c,
260
+
261
+ }
262
+
263
+ return method_dict.get(method)(**kwargs)
264
+
265
+
266
+
267
+ def return_c(self, variable_c):
268
+
269
+ # variable_c を使用する処理
270
+
271
+ c = ....
272
+
273
+ return c
274
+
275
+ ```
276
+
277
+
278
+
279
+ ```python
280
+
281
+ # ClientA
282
+
283
+ class ClientA():
284
+
285
+ def __init__(self):
286
+
287
+ pass
288
+
289
+
290
+
291
+ def return_a(self, variable_a):
292
+
293
+ # variable_a を使用する処理
294
+
295
+ a = ....
296
+
297
+ return a
298
+
299
+ ```
300
+
301
+
302
+
303
+ ```python
304
+
305
+ # ClientB
306
+
307
+ class ClientB():
308
+
309
+ def __init__(self):
310
+
311
+ pass
312
+
313
+
314
+
315
+ def return_b(self):
316
+
317
+ # 何らかの処理
318
+
319
+ b = ....
320
+
321
+ return b
322
+
323
+ ```