openlang

두 정수의 처리는 어느 알고리즘이 맡을까요?

부분 검토

각 인자가 서로 다른 메서드의 조건을 만족한다면, f(2, 3)에는 어떤 수치 계산 규칙을 적용해야 할까요?

가상의 Julia API에 f(x::Integer, y::Number)와 f(x::Number, y::Integer)가 있다고 해 볼게요. 첫 번째는 첫 인자가 정수일 때 쓰도록 고른 알고리즘이고, 두 번째는 두 번째 인자가 정수일 때 쓰도록 고른 알고리즘이에요. f(2, 3.0)과 f(2.0, 3)은 두 경우를 나눠 주지만, 두 인자가 모두 정수이면 두 메서드의 교집합에 들어가요. 어느 시그니처도 두 인자 전체를 놓고 더 구체적이지 않아서 이 호출은 모호해져요.

명시적인 f(x::Integer, y::Integer) 메서드로 겹침을 해소할 수는 있어요. 그런데 이 메서드는 수학적으로 어떤 동작을 해야 할까요? 정수 쌍을 별도 경우로 다룰까요, 아니면 기존 알고리즘 하나를 의도적으로 선택할까요? 디스패치를 정리하다 보니 원래 두 메서드가 답하지 않았던 설계 문제가 드러나네요.

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    먼저 같은 정수 쌍에 대해 각 알고리즘이 어떤 의미를 의도하는지 적어 보겠어요. 여기에는 두 가지 판단이 있어요. 인자들은 두 메서드의 정의역에 모두 속하고, 설계자는 그 영역에서 두 알고리즘이 같은 수학적 결과를 약속하는지도 정해야 해요.

    그렇다면 교집합 메서드에서 하나를 의도적으로 고르고, 공통 영역을 다루는 예시를 둘 수 있어요. 그렇지 않다면 모호함을 없애려고 메서드만 추가해도 중요한 선택은 설명되지 않아요. 정수인 경우에 별도의 의미를 명시하거나, 호출자가 연산을 선택하는 방식을 다시 살펴야겠어요.

    구현은 그 뒤에 고르겠어요. 기존 메서드에 도달하려고 인자를 형 변환하면 새 메서드가 드러내야 할 결정을 감추게 돼요.

  2. 고유 링크

    정수 쌍에 별도의 수학적 처리가 필요 없다면, 교집합 메서드가 선택한 알고리즘의 헬퍼를 직접 호출하게 하겠어요. 겹치는 경우가 어디로 가는지 한눈에 보이니까요. 정수 쌍 예시 하나를 문서에 두면 호출자가 주변 오버로드를 읽고 선택을 역으로 추론하지 않아도 되겠어요.