함수 이름의 인수 이름을 더 일반적으로 인코딩하지 않는 이유는 무엇입니까? [닫은]


47

에서 청소 코드 저자의 예를 제공합니다

assertExpectedEqualsActual(expected, actual)

vs

assertEquals(expected, actual)

전자는 주장이 어디로 가고 어디에서 오용 될 가능성이 있는지 기억할 필요가 없기 때문에 더 명확하다고 주장했다. 그러나 나는 어떤 코드에서 이전의 명명 체계의 예를 보지 못했고 후자를 항상 볼 수 있습니다. 저자가 주장하는 것처럼 후자가 더 명확하다면 코더가 왜 전자를 채택하지 않는가?


9
나는 이것이 토론에 큰 질문이라고 생각합니다. 그러나 객관적인 답변으로 대답 할 수있는 것은 아닙니다. 따라서이 질문은 의견 기반으로 마감 될 수 있습니다.
Euphoric

54
이 때문에 많은 사람들이 처음 명명 체계에 대한 주장 이 지나치게 자세한 까지가 명확하게 도움을하는 위치 넘어. 특히 assertEquals(),이 방법은 코드 기반에서 수백 번 사용되므로 독자는이 규칙에 익숙해 지도록 기대할 수 있습니다. 프레임 워크마다 다른 규칙 (예 : (actual, expected) or an agnostic (왼쪽, 오른쪽)`)이 있지만 내 경험상 이는 거의 사소한 혼란의 원인입니다.
amon

5
이익과 비교하여 이득이 너무 작기 때문에 제정신의 사람은 아마 사라질 것입니다. 좀 더 유창한 접근 방식을 assert(a).toEqual(b)원한다면 (IMO가 여전히 불필요하게 장황하더라도) 몇 가지 관련 어설 션을 연결할 수 있습니다.
Adriano Repetti

18
실제 값과 예상 값이 값임을 어떻게 알 수 있습니까? 반드시 그래야 assertExpectedValueEqualsActualValue합니까? 그러나 잠깐, 우리는 그것이 사용 ==하는지 .equals또는 Object.equals어떻게 기억 합니까? 그럴까요 assertExpectedValueEqualsMethodReturnsTrueWithActualValueParameter?
user253751

6
이 특정 방법의 경우 두 가지 인수의 순서는 중요하지 않으므로이 명명 체계의 이점을 옹호하는 것은 좋지 않은 예입니다.
Steven Rands

답변:


66

타이핑하는 것이 더 많고 읽기가 더 많기 때문에

가장 간단한 이유는 사람들이 입력을 적게하고 정보를 인코딩하면 더 많은 입력을 의미하기 때문입니다. 읽을 때마다 논쟁의 순서가 무엇인지 잘 알고 있더라도 모든 것을 읽어야합니다. 논쟁의 순서에 익숙하지 않더라도 ...

많은 개발자들이 IDE를 사용합니다

IDE는 종종 가리 키거나 키보드 단축키를 통해 주어진 방법에 대한 문서를 볼 수있는 메커니즘을 제공합니다. 이로 인해 매개 변수 이름이 항상 있습니다.

인수를 인코딩하면 복제 및 커플 링이 발생합니다.

매개 변수의 이름은 이미 그 이름을 문서화해야합니다. 메소드 이름에 이름을 쓰면 메소드 서명에도 해당 정보가 복제됩니다. 또한 메소드 이름과 매개 변수를 연결합니다. 말 expectedactual우리의 사용자에게 혼란을 줄 수 있습니다. 에서가는 assertEquals(expected, actual)것은 assertEquals(planned, real)기능을 사용하여 클라이언트 코드를 변경 할 필요가 없습니다. 에서가는 assertExpectedEqualsActual(expected, actual)것은 assertPlannedEqualsReal(planned, real)API에 깨는 변화를 의미한다. 또는 메소드 이름을 변경하지 않아서 혼동되기 쉽습니다.

모호한 인수 대신 유형 사용

실제 문제는 동일한 유형이기 때문에 쉽게 전환 할 수있는 모호한 인수가 있다는 것입니다. 대신 타입 시스템과 컴파일러를 사용하여 올바른 순서를 적용 할 수 있습니다.

class Expected<T> {
    private T value;
    Expected(T value) { this.value = value; }
    static Expected<T> is(T value) { return new Expected<T>(value); }
}

class Actual<T> {
    private T value;
    Actual(T value) { this.value = value; }
    static Actual<T> is(T value) { return new Actual<T>(value); }
}

static assertEquals(Expected<T> expected, Actual<T> actual) { /* ... */ }

// How it is used
assertEquals(Expected.is(10), Actual.is(x));

그런 다음 컴파일러 수준에서 적용 할 수 있으며 뒤로 되돌릴 수 없습니다. 다른 각도에서 접근하는 것은 본질적으로 Hamcrest 라이브러리가 테스트를 위해하는 것입니다.


5
IDE를 사용하면 풍선 도움말에 매개 변수 이름이 있습니다. 함수 이름을 사용하지 않으면 함수 이름을 기억하는 것은 인수를 기억하는 것과 동일하므로 어느 쪽도 얻을 수 없습니다.
피터-복원 모니카

29
assertExpectedEqualsActual"입력하는 것이 더 많고 읽을 것이 더 많기 때문에" 이의를 제기하는 경우 어떻게 옹호 할 수 assertEquals(Expected.is(10), Actual.is(x))있습니까?
ruakh

9
@ruakh 그것은 비교할 수 없습니다. assertExpectedEqualsActual그래도 프로그래머는 인수를 올바른 순서로 지정해야합니다. assertEquals(Expected<T> expected, Actual<T> actual)서명은 전혀 다른 접근 방식 올바른 사용법을 적용 할 컴파일러를 사용합니다. 예를 들어 expect(10).equalsActual(x), 간결성을 위해이 접근 방식을 최적화 할 수 있지만 문제는 아닙니다.
Holger

6
또한이 특별한 경우 (==)에서 인수의 순서는 실제로 최종 값과 관련이 없습니다. 순서는 부작용에 대해서만 중요합니다 (실패보고). 문제를 주문할 때 (마지막으로) 더 의미가있을 수 있습니다. 예를 들어 strcpy (dest, src)입니다.
Kristian H

1
특히 복제 및 커플 링 부분에 대해서는 더 이상 동의 할 수 없습니다 ... 함수 매개 변수가 이름을 변경할 때마다 함수 이름도 변경해야 할 경우 해당 함수의 모든 사용법을 추적해야합니다. 코드를 의존성으로 사용하여 저, 우리 팀 및 다른 모든 사람들에게 큰 변화를 가져다 줄 것입니다 ...
mrsmn

20

당신은 프로그래밍에 대한 오랜 논쟁에 대해 묻습니다. 얼마나 자세한 정보가 좋습니까? 일반적인 답변으로, 개발자들은 인수의 이름을 밝히는 추가적인 표현이 가치가 없다는 것을 발견했습니다.

자세한 표현이 항상 더 명확하다는 의미는 아닙니다. 치다

copyFromSourceStreamToDestinationStreamWithoutBlocking(fileStreamFromChoosePreferredOutputDialog, heuristicallyDecidedSourceFileHandle)

copy(output, source)

둘 다 같은 버그를 가지고 있지만 실제로 그 버그를 찾기가 더 쉬워 졌습니까? 일반적으로 디버그하는 가장 쉬운 방법은 버그가있는 몇 가지를 제외하고 모든 것이 최대로 간결한 경우이며, 무엇이 잘못되었는지를 알려주기에는 장황합니다.

자세한 정보를 추가 한 오랜 역사가 있습니다. 예를 들어, 일반적으로 인기가없는 " 헝가리어 표기법 "이 lpszName있습니다. 그것은 일반적으로 일반 프로그래머 대중의 길가에 떨어졌습니다. 그러나 멤버 변수 이름에 문자를 추가 (같은 것은 mName또는 m_Namename_) 일부 서클 인기를하고 있습니다. 다른 사람들은 그것을 완전히 떨어 뜨 렸습니다. 코딩 스타일 문서에 벡터를 반환하는 모든 함수가 함수 호출에서 벡터의 프레임을 지정해야하는 물리 시뮬레이션 코드베이스에서 작업하고 있습니다 ( getPositionECEF).

Apple이 대중화 한 일부 언어에 관심이있을 수 있습니다. Objective-C에는 함수 시그니처의 일부로 인수 이름이 포함되어 있습니다 (함수 [atm withdrawFundsFrom: account usingPin: userProvidedPin]는 설명서에서 withdrawFundsFrom:usingPin:. 함수 이름입니다). Swift는 비슷한 결정을 내 렸으며 함수 호출 ( greet(person: "Bob", day: "Tuesday")) 에 인수 이름을 넣어야합니다 .


13
다른 모든 점은 제쳐두고 쓰여졌 다면 훨씬 쉽게 읽을있습니다. 얼마나 쉬웠 는지 보세요! 그것은 그 humungousunbrokenwordsalad를 통해 중간에 작은 변화를 놓치기가 너무 쉽기 때문에 단어 경계가 어디에 있는지 알아내는 데 시간이 더 오래 걸리기 때문입니다. 혼란 스러움. copyFromSourceStreamToDestinationStreamWithoutBlocking(fileStreamFromChoosePreferredOutputDialog, heuristicallyDecidedSourceFileHandle)copy_from_source_stream_to_destination_stream_without_blocking(file_stream_from_choose_preferred_output_dialog, heuristically_decided_source_file_handle)
tchrist

1
obj-C 구문 withdrawFundsFrom: account usingPin: userProvidedPin은 실제로 SmallTalk에서 빌 렸습니다.
joH1

14
@tchrist는 당신이 거룩한 전쟁과 관련된 주제에 옳다는 확신을 가지도록 조심하십시오. 다른 쪽이 항상 틀린 것은 아닙니다.
Cort Ammon

3
@tchrist Addingunderscoresnakesthingseasiertoreadnotharderasyousee는 인수를 조작하고 있습니다. 여기서 답변은 생략하고있는 대문자를 사용했습니다. AddingCapitalizationMakesThingsEasyEnoughToReadAsYouCanSeeHere. 둘째, 10에서 9 번, 이름은 결코 넘어 가지 않아야합니다 [verb][adjective][noun](각 블록은 선택 사항 임). 간단한 대문자를 사용하여 읽을 수있는 형식입니다.ReadSimpleName
Flater

5
@tchrist-연구 과학 ( 무료 전문 링크 )은 밑줄 스타일을 사용하도록 훈련 된 프로그래머가 낙타 경우보다 밑줄 스타일을 읽는 것이 빠르다는 것을 보여줍니다. 데이터는 또한 경험이 많은 과목의 경우 그 차이가 더 작다는 것을 보여줍니다 (그리고 학생들 인 대부분의 과목은 특히 경험이없는 과목도 제안합니다). 이것은 낙타 케이스를 사용하는 데 더 많은 시간을 보낸 프로그래머가 동일한 결과를 제공한다는 것을 의미하지는 않습니다.
Jules

8

"Clean Code"의 저자는 합법적 인 문제를 지적하지만 그의 제안 된 해결책은 다소 우아하지 않습니다. 일반적으로 불명확 한 분석법 이름을 개선하는 더 좋은 방법이 있습니다.

그는 assertEquals(xUnit 스타일 단위 테스트 라이브러리에서) 어떤 인수가 예상되고 어떤 것이 실제인지 명확하게 밝히지 않습니다. 이것은 또한 나를 물었다! 많은 단위 테스트 라이브러리가이 문제를 지적하고 다음과 같은 대체 구문을 도입했습니다.

actual.Should().Be(expected);

또는 비슷합니다. 어느 것보다 확실히 더 명확 assertEquals하지만 또한 훨씬 낫다 assertExpectedEqualsActual. 그리고 그것은 또한 훨씬 더 작곡 가능합니다.


1
나는 항문이고 권장 순서를 따르지만 fun(x)5 의 결과를 기대 하면 순서를 반대로하면 무엇이 잘못 될 수 assert(fun(x), 5)있습니까? 어떻게 물린거야?
emory

3
@emory jUnit (적어도)은 expectedand 의 값에서 시간당 오류 메시지를 작성하므로 그 값을 바꾸면 actual메시지가 정확하지 않을 수 있습니다. 그러나 나는 그것이 더 자연스럽게 들린다는 데 동의합니다 :)
joH1

@ joH1 그것은 나에게 약한 것 같습니다. 실패한 코드는 실패하고 통과 코드는 assert(expected, observed)또는 수행 여부에 관계없이 전달됩니다 assert(observed, expected). 더 좋은 예는 다음과 같습니다 locateLatitudeLongitude. 좌표를 뒤집 으면 심각하게 엉망이됩니다.
모리

1
@emory 단위 테스트에서 현명한 오류 메시지를 신경 쓰지 않는 사람들은 일부 오래된 코드베이스에서 "Assert.IsTrue failed"를 처리 해야하는 이유입니다. 디버깅하기에 엄청난 재미입니다. 그러나이 경우 문제는 그다지 필수적이지 않을 수도 있습니다 (논쟁 순서가 일반적으로 중요한 퍼지 비교를하는 경우 제외). 유창한 어설 션은 실제로이 문제를 피하고 코드를보다 표현력있게 만들 수있는 좋은 방법입니다 (부팅 할 때 훨씬 더 나은 오류 메시지 제공).
Voo

@emory : 인수를 반대로하면 오류 메시지가 잘못 표시되어 디버깅 할 때 잘못된 경로를 보내 게됩니다.
JacquesB

5

당신은 Scylla와 Charybdis 사이의 경로를 명확하게하기 위해 노력하고 있습니다.

따라서 평가하려는 인터페이스, 두 개체가 동일한 디버그 어설 션을 수행하는 방법을 살펴 봐야합니다.

  1. arity와 name을 고려할 수있는 다른 기능이 있습니까?
    아니요, 이름 자체가 충분히 명확합니다.
  2. 중요한 유형이 있습니까?
    아니요, 무시하십시오. 이미 했습니까? 좋은.
  3. 논쟁에서 대칭인가?
    거의 오류가 발생하면 메시지가 각 인수 표현을 자체 위치에 넣습니다.

따라서 작은 차이가 중요한지, 기존의 강력한 규칙에 포함되지 않는지 살펴 보겠습니다.

주장이 의도 치 않게 바뀌면 의도 한 청중이 불편합니까?
아니요, 개발자도 스택 추적을 받고 버그를 수정하려면 소스 코드를 면밀히 조사해야합니다.
전체 스택 추적이 없어도 어설 션 위치는 해당 질문을 해결합니다. 그리고 그조차도 빠졌고 어떤 메시지에서 분명하지 않은 경우, 그것은 가능성의 최대 두 배입니다.

인수 순서는 규칙을 따르나요?
그런 것 같습니다. 비록 가장 약한 컨벤션처럼 보이지만.

따라서 그 차이는 매우 중요하지 않으며 인수 순서는 function-name으로 인코딩하려는 모든 노력에 부정적인 유용성이 있다는 강력한 규칙으로 덮여 있습니다.


jUnit은 순서가 중요합니다.이 값은 expectedand actual(적어도 Strings) 값에서 특정 오류 메시지를 생성합니다.
joH1

내가 그 부분을 다룬 것 같아 ...
중복 제거기

당신은 그것을 언급하지만, 고려 : assertEquals("foo", "doo")오류 메시지를 제공입니다 ComparisonFailure: expected:<[f]oo> but was:<[d]oo>... 더 소리 메시지의 의미를 반전 할 값을 스와핑 방지 나에게 대칭을. 어쨌든 개발자가 오류를 해결하기위한 다른 표시기가 있지만 IMHO를 오도하게하고 디버깅 시간이 조금 더 걸릴 수 있습니다.
joH1

적어도 AT & T vs. Intel 구문이 존재하는 한 두 캠프 (dest, src vs. src, dest)가 이것에 대해 논쟁했다는 점을 고려하면 인수 순서에 대한 "협약"이 있다는 생각은 재미있다. 그리고 단위 테스트에서 도움이되지 않는 오류 메시지는 전염병이되어서는 안됩니다. "Assert.IsTrue가 실패했습니다."( "어쨌든 단위 테스트를 실행하여 디버그하려면 다시 실행하고 중단 점을 두어야합니다." 주문이 올바른지 확인하세요 ").
Voo

@Voo : 요점은 잘못하기위한 "손상"이 미미하다는 것입니다 (논리는 그것에 의존하지 않으며 메시지 유틸리티가 크게 손상되지 않습니다) .IDE를 작성할 때 매개 변수 이름이 표시됩니다 어쨌든 입력하십시오.
중복 제거기

3

논리적 인 명확성을 추가하지 않는 경우가 종종 있습니다.

"Add"를 "AddFirstArgumentToSecondArgument"와 비교하십시오.

과부하가 필요한 경우 세 가지 값을 추가합니다. 더 의미가있는 것은 무엇입니까?

세 개의 인수를 가진 또 다른 "추가"?

또는

"AddFirstAndSecondAndThirdArgument"?

방법의 이름은 논리적 의미를 전달해야합니다. 그것이 무엇을하는지 알려줘야합니다. 마이크로 레벨에서 어떤 단계를 수행한다고해서 독자가 더 쉽게 할 수있는 것은 아닙니다. 인수 이름은 필요한 경우 추가 세부 사항을 제공합니다. 여전히 더 자세한 정보가 필요하면 코드가 적합합니다.


4
Add정류 작업을 제안합니다. OP는 주문이 중요한 상황과 관련이 있습니다.
Rosie F

Swift에서는 add () 함수를 정의하면 add (5, to : x) 또는 add (5, plus : 7, to : x) 또는 add (5, plus : 7, giving : x)를 호출합니다. 따라서.
gnasher729 2016 년

세 번째 과부하 이름은 "Sum"
StingyJack

@StringyJack Hmm. Sum은 명령어가 아니며 명사이므로 메소드 이름에 적합하지 않습니다. 그러나 당신이 그렇게 느끼고 그것에 대해 순수하고 싶다면 두 개의 인수 버전도 Sum으로 명명되어야합니다. Add 메소드를 사용하려면 오브젝트 인스턴스 자체에 추가되는 하나의 인수가 있어야합니다 (숫자 또는 벡터 유형이어야 함). 2 개 이상의 인수 품종 (이름을 불렀던 것)은 정적입니다. 그런 다음 3 개 이상의 인수 버전이 중복되고 더하기 연산자를 구현했을 것입니다.
Martin Maat

1
@Martin 잠깐만 요? sum완벽하게 cromulent 동사 입니다. "합산하다"라는 문구에서 특히 흔합니다.
Voo

2

다른 답변으로 암시 된 다른 것을 추가하고 싶지만 명시 적으로 언급되지 않았다고 생각합니다.

@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) 우리가 그들을 혼동 경우 오류 메시지가 발생할 수 있습니다.


1

인수가 어디로 갔는지 기억할 필요가 없기 때문에

정말입니까? 함수 이름에서 첫 번째로 언급 된 인수가 실제로 첫 번째 매개 변수라는 보장은 없습니다. 따라서 어리석은 이름에 맹목적으로 의존하는 것보다 그것을 더 잘 찾고 (또는 IDE가 그렇게하도록하십시오) 합리적인 이름을 유지하십시오.

코드를 읽으면 매개 변수의 이름을 지정할 때 발생하는 상황을 쉽게 확인할 수 있습니다. copy(source, destination)같은 것보다 이해하기가 훨씬 쉽습니다 copyFromTheFirstLocationToTheSecondLocation(placeA, placeB).

저자가 주장하는 것처럼 후자가 더 명확하다면 코더가 왜 전자를 채택하지 않는가?

서로 다른 스타일에 대한 관점이 다르기 때문에 다른 기사의 반대 저자를 찾을 수 있습니다. 누군가 어딘가에 쓰는 모든 것을 따르려고 미쳤다. ;-)


0

매개 변수 이름을 함수 이름으로 인코딩하면 함수 작성 및 사용 이보다 직관적이라는 데 동의합니다.

copyFromSourceToDestination( // "...ahh yes, the source directory goes first"

함수와 쉘 명령에서 인수의 순서를 잊어 버리는 것은 쉬운 일이며 많은 프로그래머는 이런 이유로 IDE 기능이나 함수 참조에 의존합니다. 이름에 설명 된 주장을 갖는 것이이 의존성에 대한 훌륭한 해결책이 될 것입니다.

그러나 일단 작성된 후에는 대부분의 경우 명명 된 변수가 사용되므로 인수 설명은 명령문을 읽어야하는 다음 프로그래머에게 중복되지 않습니다.

copy(sourceDir, destinationDir); // "...makes sense"

이것의 간결함은 대부분의 프로그래머를 이길 것이며 개인적으로 읽기가 더 쉽습니다.

편집 : @Blrfl이 지적했듯이, 인코딩 매개 변수는 처음에는 함수의 이름을 기억해야하기 때문에 결국 '직관적'이 아닙니다. 이를 위해서는 함수 참조를 찾거나 IDE에서 도움을 받아야 매개 변수 순서 정보를 제공 할 수 있습니다.


9
따라서 악마의 옹호자를 1 분 동안 플레이 할 수 있다면 : 함수의 전체 이름을 알고있을 때만 직관적입니다. 당신이 알고있는 경우가 복사 기능 그리고 당신은인지 기억하지 않는다 copyFromSourceToDestination또는 copyToDestinationFromSource당신의 선택은 시행 착오를 찾거나 참조 자료를 읽고있다. 부분 이름을 완성 할 수있는 IDE는 후자의 자동화 된 버전 일뿐입니다.
Blrfl

@Blrfl 호출의 요점은이라고 copyFromSourceToDestination생각 copyToDestinationFromSource하면 컴파일러가 버그를 발견하지만 호출 된 경우 그렇지 copy않다는 것입니다. strcpy, strcat 등이 선례를 설정했기 때문에 카피 루틴의 매개 변수를 잘못 얻는 것은 쉽습니다. 그리고 간결한 것이 읽기 쉬운가? mergeLists (listA, listB, listC)는 listB & listC에서 listA를 작성하거나 listA & listB를 읽고 listC를 작성합니까?
Rosie F

4
@RosieF 인수의 의미가 긍적 적이 지 않다면 코드를 작성하기 전에 설명서를 읽고있을 것입니다. 게다가 더 자세한 함수 이름을 사용하더라도 순서가 실제로 무엇인지에 대한 해석의 여지는 여전히 남아 있습니다. 코드를 잘 살펴 보는 사람은 함수 이름에있는 인수가 인수의 순서를 반영한다는 규칙을 설정했다는 사실을 직감 할 수 없습니다. 그들은 여전히 ​​미리 알고 있거나 문서를 읽어야했습니다.
Blrfl

OTOH, destinationDir.copy (sourceDir); // "... 더 의미가있다"
Kristian H

1
@KristianH 어떤 방향으로 dir1.copy(dir2)작동합니까? 몰라. 무엇에 대해 dir1.copyTo(dir2)?
maaartinus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.