이런 식으로 코딩하는 게 의미가 있을까요? (반응형/함수형 실험)
요즘 조금 실험적인 걸 만들어보고 있습니다. 개념은 대략 Rx의 Observable을 일반 클래스 속성처럼 사용하게 해보자는 건데, 방금 작성한 테스트 코드 모양은 이렇습니다 (파이썬으로 작성했습니다):
def test_map_combinators(self):
class Fixture:
value = from_value(1)
doubled = map_value(value)(ops.map(lambda v: v * 2))
numbers = combine(value, doubled)(lambda o: rx.combine_latest(*o))
combined = combine_latest(value, doubled)(ops.map(lambda v: f"{v[0]} * 2 = {v[1]}"))
zipped = zip_values(value, doubled)(ops.map(lambda v: f"{v[0]} * 2 = {v[1]}"))
combined = []
zipped = []
fixture = Fixture()
observe(fixture.zipped).subscribe(zipped.append)
observe(fixture.combined).subscribe(combined.append)
self.assertEqual(1, fixture.value)
self.assertEqual(2, fixture.doubled)
self.assertEqual((1, 2), fixture.numbers)
self.assertEqual("1 * 2 = 2", fixture.combined)
self.assertEqual("1 * 2 = 2", fixture.zipped)
self.assertEqual(["1 * 2 = 2"], combined)
self.assertEqual(["1 * 2 = 2"], zipped)
fixture.value = 3
self.assertEqual(3, fixture.value)
self.assertEqual(6, fixture.doubled)
self.assertEqual((3, 6), fixture.numbers)
self.assertEqual("3 * 2 = 6", fixture.combined)
self.assertEqual("3 * 2 = 6", fixture.zipped)
self.assertEqual(["1 * 2 = 2", "3 * 2 = 2", "3 * 2 = 6"], combined)
self.assertEqual(["1 * 2 = 2", "3 * 2 = 6"], zipped)
이런 방식으로 복잡한 프로그램을 만드는 게 가능/바람직할까요?
부연하자면, Rx 자체가 아니라 위의 예시처럼 Rx를 클래스 속성 처럼 사용하는 것을 이야기하는 것입니다.
만들고는 있는데 아직은 저도 반신반의하네요.