다른 답변으로 암시 된 다른 것을 추가하고 싶지만 명시 적으로 언급되지 않았다고 생각합니다.
@puck은 "함수 이름에서 처음 언급 된 인수가 실제로 첫 번째 매개 변수라는 보장은 없습니다."라고 말합니다.
@cbojar는 "모호한 인수 대신 형식 사용"이라고 말합니다.
문제는 프로그래밍 언어가 이름을 이해하지 못한다는 것입니다. 그것들은 단지 불투명 한 원자 기호로 취급됩니다. 따라서 코드 주석과 마찬가지로 함수의 이름과 실제로 작동하는 방식간에 상관 관계가있을 필요는 없습니다.
다음 assertExpectedEqualsActual(foo, bar)과 같은 대안 (이 페이지 및 다른 곳)과 비교하십시오 .
# Putting the arguments in a labelled structure
assertEquals({expected: foo, actual: bar})
# Using a keyword arguments language feature
assertEquals(expected=foo, actual=bar)
# Giving the arguments different types, forcing us to wrap them
assertEquals(Expected(foo), Actual(bar))
# Breaking the symmetry and attaching the code to one of the arguments
bar.Should().Be(foo)
이것들은 모두 장황한 이름보다 더 많은 구조를 가지고 있어 언어에 불투명하지 않은 것을줍니다. 함수의 정의와 사용법 도이 구조에 따라 달라 지므로 구현이 수행하는 작업 (이름 또는 주석과 같은)과 동기화되지 않습니다.
이와 같은 문제가 발생하거나 예견 될 때, 컴퓨터에서 좌절감을 외치기 전에 먼저 기계를 비난하는 것이 '공평한'것인지 묻습니다. 다시 말해, 내가 원하는 것을 구별하기에 충분한 정보가 기계에 제공 되었습니까?
같은 호출 assertEqual(expected, actual)만큼 의미가 있습니다 assertEqual(actual, expected), 그래서 우리가 그들을 혼동하기 쉬운 및 기계 앞서 쟁기 잘못된 일을 위해. 우리가 사용하는 경우 assertExpectedEqualsActual대신, 그것은하지 않습니다 수도 우리가 덜 실수를 할 수 있지만, 어떤 기계에 대한 정보를 (가 영어를 이해 할 수 없으며, 이름의 선택은 의미에 영향을 미치지 않습니다) 제공합니다.
키워드 인수, 레이블이 지정된 필드, 고유 한 유형 등과 같이 "구조화 된"접근 방식을 더 선호하는 것은 추가 정보도 기계로 읽을 수 있으므로 기계가 잘못된 사용법을 발견하고 올바른 작업을 수행하도록 도울 수 있다는 것입니다. assertEqual유일한 문제는 부정확 한 메시지가 될 것이기 때문에 경우도 나쁘지 않다. 더 불길한 예는 String replace(String old, String new, String content)혼동하기 쉬우 며 String replace(String content, String old, String new)매우 다른 의미를 갖습니다. 간단한 해결책은 pair를 취하는 [old, new]것인데, 실수로 인해 오류가 즉시 발생합니다 (유형이없는 경우에도).
유형이 있어도 '기계에 원하는 것을 말하지'않을 수 있습니다. 예를 들어, "문자열 형식 프로그래밍"이라는 반 패턴은 모든 데이터를 문자열로 취급하므로 인수를 혼합하여 (이 경우와 같이) 인수를 쉽게 가져 와서 일부 단계 (예 : 이스케이프 처리)를 수행하지 않고 실수로 불변을 제거 할 수 있습니다 (예 : 파싱 불가능한 JSON 만들기) 등
이것은 코드의 한 부분에서 많은 부울 (또는 숫자 등)을 계산하는 "부울 실명"과 관련이 있지만 다른 부울에서 사용하려고 할 때 실제로 나타내는 내용이 확실하지 않은지 여부 우리는 그들이 설명하는 이름 (예를 들어,이 별개의 열거 예이 비교 등을 혼합있어 LOGGING_DISABLED보다는를 false) 우리가 그들을 혼동 경우 오류 메시지가 발생할 수 있습니다.