組み込み開発のためのPython · レッスン 209 / 220

クラスで機器の状態をまとめる

状態と操作を一つの型にまとめ、初期化条件や不変条件を守ります。

クラスは、関連するデータと操作を一緒に扱う仕組みです。必要な状態を限定し、生成直後から有効なオブジェクトになるように設計します。

状態を持つ理由を明確にする

接続先や接続状態を複数の独立変数にすると、組合せによって矛盾が起きることがあります。クラスで状態と操作を束ねる場合も、何を所有するかを明確にし、外部から内部状態を無秩序に変更できない設計にします。単なるデータの束なら、単純な関数やデータクラスの方が適切なこともあります。

資源を持つオブジェクトは閉じ方を決める

通信ポートなどのOS資源を扱うクラスでは、接続・切断・再接続時の状態遷移を明確にします。例外時に開いたままにならないよう、コンテキストマネージャーや明示的な終了メソッドを設計します。複数箇所から同じ資源を閉じる場合の挙動も定義します。

コード例

手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。

class SampleWindow:
    def __init__(self, limit: int) -> None:
        if limit <= 0:
            raise ValueError("limit は正の値が必要です")
        self._limit = limit
        self._values: list[int] = []

    def add(self, value: int) -> None:
        if len(self._values) == self._limit:
            self._values.pop(0)
        self._values.append(value)

    def values(self) -> tuple[int, ...]:
        return tuple(self._values)

手を動かす課題

保存件数を制限するサンプル窓を作り、上限到達後も件数が増えないことをテストしましょう。

参考資料

「6. 型・クラス・データ処理の設計」の章一覧へ