web-dev-qa-db-ja.com

コンストラクターの辞書に値を追加すると、「コンストラクターは機能しないはずです」という違反になりますか?

this の質問に対するフォローアップのいくつか。

プレーヤーのPlayerattributesを保持する辞書呼び出しHealthを持つManaクラスがあるとします。この例ではPythonを使用しますが、読み続けるとわかるように、私の質問は言語に依存しません。

Playerコンストラクターで、要素をディクショナリに追加しても大丈夫ですか?

例:

class Player:

    def __init__(self, name, health, mana):
        self._name = name
        # Using type hints to indicate the types the dictionary contains
        self._attributes: Dict[str,int] = {}
        self._attributes["Health"] = health
        self._attributesplayer_details["Mana"] = mana

その理由は、正しい辞書がコンストラクターに渡されることを確認するために多くの検証が必要になるためです。

次のことを確認する必要があると考えてください。

  • 辞書には正しい数の要素が含まれています。この場合は2です。
  • HealthManaの両方が辞書にあります
  • 値は正しく設定されています。この場合、ゲームの開始時に両方とも100に設定されています。

上記の例では、HealthManaが100を超えていないことを確認する必要があります。どのように保存されているかは、外部コードには関係ありません。

この例は、constructorが機能してはならないというガイドラインに違反していますか?もしそうなら、どのように修正すればよいですか?

3
user306112

これは単なる初期化なので、問題ありません。オブジェクトを設定するコンストラクターのポイント。これはオブジェクトの設定なので、問題ありません。

「コンストラクターは機能してはならない」と言うときは、コンストラクターがオブジェクトのセットアップ以外のことをしてはならないことを意味します。たとえば、次のことはコンストラクターには適切ではなく、willは最終的に頭痛の種になります。

  • 辞書へのアイテムの追加どこか別の場所(構築中のオブジェクトの一部ではありません)。
  • ファイルの作成
  • 一部のハードウェアを初期化しています
  • リモートシステムとの通信(これはmayリモートシステムの状態に影響がなければ大丈夫です)
  • 画面にメッセージを表示する
  • ユーザーがボタンをクリックするのを待つ
3
user253751