다른 답변으로 암시 된 다른 것을 추가하고 싶지만 명시 적으로 언급되지 않았다고 생각합니다.
@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
) 우리가 그들을 혼동 경우 오류 메시지가 발생할 수 있습니다.