実装を共有するという目的で継承を使うべきではないでしょう。(使ってはいけない、ぐらいまで言ってもいいかも)
継承は、インタフェースを共通にする目的で使うべきです。
質問のコードは「メッセージを組み立てる」という機能と「チャンネルを保有する」という機能が混じっています。
「メッセージを組み立てる」部分も、「メッセージの部品を定義する」という機能と、「部品となるメッセージを組み合わせる」という機能が混じっています。
このあたりを機能でクラスを分離すると、
python
1class Fragment:
2 def get_message(self):
3 raise NotImplemented
4
5
6class Greeting(Fragment):
7 def __init__(self):
8 self.message = {
9 "type": "section",
10 "text": {
11 "type": "mrkdwn",
12 "text": (
13 "こんにちは" # <- ここに生成クラス特有のメッセージを入れたい。
14 ),
15 }
16 }
17
18 def get_message(self):
19 return self.message
20
21
22class Divider(Fragment):
23 def get_message(self):
24 return {"type": "divider"}
25
26
27class Template:
28 def __init__(self, contents, channel=None):
29 self.contents = contents # contents must be list of Fragment
30 self.channel = channel
31
32 def get_message_payload(self):
33 return {
34 "blocks": [c.get_message() for c in self.contents],
35 }
36
37
38greeting = Template([Greeting(), Divider()])
39print(greeting.get_message_payload())
みたいになるかなと思います。
これだとGreeting
とDivider
が抽象度が合ってません。
python
1class Fragment:
2 def get_message(self):
3 raise NotImplemented
4
5
6class Markdown(Fragment):
7 def __init__(self, text):
8 self.message = {
9 "type": "section",
10 "text": {
11 "type": "mrkdwn",
12 "text": text,
13 }
14 }
15
16 def get_message(self):
17 return self.message
18
19
20class Divider(Fragment):
21 def get_message(self):
22 return {"type": "divider"}
23
24
25class Template:
26 def __init__(self, contents, channel=None):
27 self.contents = contents # contents must be list of Fragment
28 self.channel = channel
29
30 def get_message_payload(self):
31 return {
32 "blocks": [c.get_message() for c in self.contents],
33 }
34
35
36greeting_markdown = Markdown('こんにちは')
37divider = Divider()
38
39greeting = Template([greeting_markdown, divider])
40print(greeting.get_message_payload())
と変えていくでしょう。
基本1つのクラスが1つの部品になるようにしていきます。正解があるわけではないので一例として。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/21 01:10