13강 / 20강
압력 제어기 — 프로토콜을 모르는 장비 감싸기
시리얼 · 어댑터 계층
지금까지 다룬 장치는 우리가 밑바닥까지 아는 것이었습니다. 압력 제어기는 다릅니다 — 제조사가 만든 완성된 상자이고, 안이 어떻게 생겼는지 우리는 모릅니다.
이런 장치를 다루는 요령이 어댑터 계층입니다. 남의 약속을
우리 약속의 모양으로 감싸 버립니다(3강의 Protocol).
class PressureSource(Protocol): # 우리가 정한 약속
def set_mbar(self, v: float) -> None: ...
def read_mbar(self) -> float: ...
def safe(self) -> None: ... # 3강에서 정한 공통 약속
class VendorPressureAdapter: # 남의 SDK 를 우리 모양으로
def __init__(self, sdk): self._sdk = sdk
def set_mbar(self, v): self._sdk.SetPressure(self._ch, v) # 이름이 제각각이다
def read_mbar(self): return self._sdk.GetPressure(self._ch)
def safe(self): self._sdk.SetPressure(self._ch, 0)
장비가 죽는 것보다 나쁜 것은 죽었는데 우리가 모르는 것입니다. 타임아웃이 그 둘을 가릅니다.
Python
브라우저에서 실행
읽기는 마음껏, 쓰기는 조심스럽게
읽기 — 다시 해도 된다
CRC 오류나 타임아웃이면 그냥 다시 읽으면 됩니다.
세상에 아무 일도 안 일어납니다.
tenacity 로 지수 백오프를 걸어 두십시오.쓰기 — 함부로 다시 하면 안 된다
“100 µL 넣어라” 를 보냈는데 응답이 없었습니다. 안 들어간 걸까요,
들어갔는데 응답만 못 온 걸까요? 그냥 다시 보내면 200 µL 가 들어갑니다.
규칙은 이것입니다 — 쓰기를 재시도하기 전에 먼저 읽어서 실제 상태를 확인한다. 읽을 수 없는 장치라면 재시도하지 말고 결함으로 올립니다(→ 19강).
🤔 확인 문제
장비에 “설정압 1200 mbar” 를 보냈는데 응답이 없었다. 올바른 대응은?
해설 응답이 없다고 명령이 안 들어간 것은 아닙니다. 압력은 덮어쓰기라 비교적 안전하지만, “몇 µL 넣어라” 같은 누적되는 명령이면 두 배가 들어갑니다. 읽어 보고 쓰는 습관을 들이십시오.
🤔 확인 문제
어댑터 계층을 두는 실용적 이득은?
해설 압력 제어기는 견적제이고 대안이 여럿입니다(
/mech 14강). 어댑터가 그 선택을 나중으로 미룰 수 있게 해 줍니다.