큰 정비비는 매번 발생하지 않는다. 그렇다고 오늘 운행에 아무 비용도 없다고 두면 다음 교체를 위한 몫이 계산에서 사라질 수 있다.
실제 도구의 교체비·주행주기·월 비정기 예산 구조를 읽고 새 합성 reserve 함수를 만들었다. 어떤 부품을 언제 갈아야 하는지 추천하는 글이 아니라 비용을 나누는 기준의 제작 기록이다.
한 번의 지출과 반복 운행의 단위를 맞춘다
기존 구현의 항목은 교체 1회 비용과 실제 교체주기를 따로 받는다. 비용을 그 주행거리로 나눈 값은 km당 배분액이다. 월 비정기 예산은 월 예상거리로 나누어 다른 기준의 몫을 만든다. 이름이 모두 정비비여도 분모가 다르므로 원래 단위를 생략하지 않는 구성이 필요했다.
입력한 주기는 사용자 기록이나 계획이라는 전제가 있다. 이 계산은 실제 차량의 마모와 상태를 보지 않는다. 예산을 배분했다고 해당 부품이 안전하다거나 그 거리까지 사용할 수 있다는 결론이 나오지 않는다. 비용 검토용 수치와 차량 점검 판단을 다른 책임으로 두고 문구도 그 범위에 맞춰야 한다.
각 행을 먼저 반올림하지 않은 이유
항목마다 km당 배분액을 정수로 반올림하면 작은 항목은 사라지거나 커질 수 있다. 새 예제는 Fraction으로 정확한 분수를 합하고 최종 목표 거리를 곱한 뒤 한 번 반올림한다. 기존 소스의 분수 합산 의도를 독립 코드로 다시 확인할 수 있도록 만든 것이다. 웹에 보이는 소수 자릿수와 내부 합산 기준은 구별했다.
합성 항목 두 개가 각각 비용 1과 주기 3을 가지면 km당 합은 2/3이다. 목표거리 3에서는 배분액이 2가 된다. 각 행을 먼저 정수로 만들면 이 관계를 잃는다. 이 예제는 실제 타이어 가격이나 주기를 가져온 것이 아니며 분모가 다른 항목을 어떻게 계산하는지 보여 주는 검산이다.
월 예산의 두 입력은 한 쌍이다
비정기 정비 예산만 있고 월거리가 없으면 나눌 기준이 없다. 반대로 월거리를 적고 어떤 예산을 나눌지 비워 두어도 의미가 불분명하다. 함수는 두 값이 모두 있거나 모두 없도록 요구한다. 항목 주기의 몫과 월 예산의 몫이 어떤 관계인지 설명 없이 한 숫자로 더하지 않기 위한 검사다.
이름이 다른 비용이 실제로 같은 지출을 두 번 반영할 수도 있다. 코드의 중복 ID 거절은 같은 항목을 실수로 반복한 경우를 막지만 다른 ID로 입력한 비용의 실질적 중복까지 알아내지는 못한다. 실제 적용에서는 어느 지출이 교체 항목에 포함되고 어느 것이 별도 예산인지 사람이 검토해야 한다.
수량 범위와 비용 기준도 입력 계약이다
새 합성 코드는 양의 주기와 목표거리, 명시된 비용 기준을 요구하고 알 수 없는 항목 키와 같은 ID를 거절한다. paid와 supply라는 기준 표지는 호출자의 선언으로만 남긴다. 세금 처리나 실제 증빙의 적합성을 판단하는 기능은 아니다. 숫자를 받는 곳이 어떤 의미까지 보장하는지 좁게 적었다.
예제의 항목 수와 숫자 한도는 작은 실험의 범위다. 실제 운영 자료를 그대로 넣는 저장소도 아니고 모든 회사의 비용 양식도 아니다. 다른 사업의 장비 교체비에 연결할 때도 사용 단위가 시간인지 횟수인지부터 다시 정해야 한다. km라는 이름만 바꿔도 동일한 계약이 유지된다고 가정하지 않는다.
얼마를 모아야 한다보다 무엇을 나눴는지를 보인다
테스트는 분수 합산, 월 예산의 쌍, 중복 항목과 0 주기를 확인했다. 실행 기록은 항목별 정보와 정확한 분수, 최종 목표거리 배분액을 남긴다. 내려받기 ZIP에도 새 합성 코드와 테스트만 넣었다. 원래 업체의 정비 기록과 실제 영수증은 사용하지 않았다. 브라우저의 인쇄와 실제 기기 조작 검수도 아니다.
방문자가 이 계산을 자기 상황에 적용하려면 실제 지출의 범위와 기록의 기준을 먼저 확인할 수 있어야 한다. 그래서 결과 한 줄보다 분모와 가정을 함께 보여 주는 설명이 중요하다. 나는 비용을 작아 보이게 만드는 수식보다 나중에 다시 읽어도 어떤 돈을 어떤 기준으로 나눴는지 알 수 있는 모듈을 남겼다.