概要
オブジェクト指向でカードゲームを作っています。
そのカードゲームでは大きく分けて、
-
- コスト・攻撃力・体力を持つカード
-
- コスト・効果を持つカード(攻撃力・体力は持っていない)
のような2種類があります。
このようなカードゲームを作ろうと思ったのですが、クラス設計で悩んでいます。
現在の状態
現在、2つの実装方法を考えました。
(あまりオブジェクト指向では使わないpythonですが、自分が使えてサクッと書ける言語がpythonしかなかったため、ご容赦ください。)
下で出てくるdataというのは辞書を想定しています。
※2019-01-05 09:18 コード修正しました。
1つ目
python
1# 共通部分を定義するクラス 2class Card(): 3 def__init__(self, data): 4 self.cost = data['cost'] 5 6# Cardを継承した例1のクラス 7class Type1(Card): 8 def __init__(self, data): 9 super().__init__(data) 10 self.atk = data['atk'] 11 self.hp = data['hp'] 12 13# Cardを継承した例2のクラス 14class Type2(Card): 15 def __init__(self, data): 16 super().__init__(data) 17 self.effect = data['effect'] 18 19# カードがどちらのタイプに属するかを判別し、適切なインスタンスを返す関数 20def classify_card(data): 21 if data.type == 1: 22 return Type1(data) 23 elif data.type == 2: 24 return Type2(data) 25 else: 26 print('error') 27 28if __name__ == '__main__': 29 # dataは事前でもらっているものとする 30 card = classify_card(data)
1つ目は、classify_card関数を作成して、事前に与えられているtypeから適切なインスタンスを返す方法です。
考えられるメリットは「管理が楽」で、共通部分、タイプ1、タイプ2とキレイに分かれているため、見た目でどのタイプがどのパラメータを持っているかがわかりやすいです。
また、dataの中身も必要な情報のみを格納すればいいため、スッキリすると考えています。
デメリットが「処理が大変」です。
例えば、全部のカードの攻撃力を参照するといった処理を考えるとき、Type2のカードが1枚でもあったらエラーを起こしてしまいます。
2つ目
python
1# 例1も2もこのクラスで作成 2class Card(): 3 def __init__(self, data): 4 self.cost = data['cost'] 5 self.atk = data['atk'] 6 self.hp = data['hp'] 7 self.effect = data['effect'] 8 9if __name__ == '__main__': 10 # dataは事前にもらっているものとする 11 card = Card(data)
2つ目は、関数などを作成せずに、すべてのパラメータを1つのクラスで管理する方法です。
考えられるメリットは、「処理が楽」で、1つ目のプログラムのように、いちいちtypeを参照して処理を変更するといったことなく、すべてのカードに同じ処理を適用できると考えています。
デメリットは、「複雑性の向上」です。
1つのインスタンスの中に必要のないパラメータが複数種類存在してしまうことが多くなり、不必要な部分で不必要な参照が行われてしまう可能性が考えられます。
お聞きしたいこと
このような状況下では、どちらの設計がいいでしょうか。
また、今後にパラメータが増える予定があるとしたら、どちらの設計がいいでしょうか。
どちらも良くない・そもそもオブジェクト指向を使うのがよくないなどありましたら、代替案を提案していただけると勉強になります。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/05 00:35 編集
2019/01/05 03:52 編集
2019/01/05 05:00
2019/01/05 05:16 編集
2019/01/05 22:59
2019/01/06 07:16