동일한 기능을하는 다른 기능 서명을 제공하는 것이 좋습니다?


23

다음은 세 가지 값으로 구성된 C ++ 클래스입니다.

class Foo{

    //Constructor
    Foo(std::string, int, char);

private:
    std::string foo;
    char bar;
    int baz;
};

모든 매개 변수 유형이 다릅니다.
순서가 중요하지 않도록 생성자를 오버로드 할 수 있습니다.

class Foo{

    //Constructors
    Foo(std::string, char, int);
    Foo(std::string, int, char);
    Foo(char, int, std::string);
    Foo(char, std::string, int);
    Foo(int, std::string, char);
    Foo(int, char, std::string);


private:
    std::string foo;
    char bar;
    int baz;
};

하지만 좋은 생각입니까?
클래스 / 함수에 필요한 것이 무엇인지 알고 있었기 때문에 시작했습니다.
나는 그들이 어떤 명령을 받았는지 항상 기억하지 못했습니다.


컴파일러가 동일한 생성자를 호출하는 것처럼 컴파일러가 이것을 최적화한다고 가정했습니다.

//compiler will implement this with the same code? 
//maybe not.. I could call a function to get a parameter, 
//and that function could change the state of the program, before calling
//a function to get another parameter and the compiler would have to
//implement both
Foo foo1("hello",1,'a');
Foo foo2('z',0,"world");

순서가 중요하지 않도록 함수를 오버로드하는 것에 대한 당신의 의견은 무엇입니까?


또한 일부 유틸리티 함수를 작성
하는 경우 동일한 기능을하는 다른 함수 이름을 제공하는 것이 좋습니까?

예.

void Do_Foo();
void DoFoo();
void do_foo();
//etc..

나는 종종이 두 가지이지만 비슷한 규칙을 보지 못합니다.
습관을 깨거나 받아 들여야합니까?


1
어떤 경우에는 명시 적으로 제공된 각 방법이 다른 방법보다 명확하고 분명하게 우월 할 경우, 여러 가지 표현 방법을 제공하기 위해 노력해야합니다. 그렇다고해서 어떤 것이 하나의 정식 형식으로 만 쓰여질 수 있도록 노력해야한다는 의미는 아니지만, 최선이 아닌 방식으로 무언가를 지정할 수 있도록 노력하는 것은 합리적이지 않습니다.
supercat

여기내 질문 의 복제본이 있습니다 (이제 나쁜 생각이라는 데 동의합니다).
leftaroundabout

답변:


93

매개 변수의 순서가 중요하지 않도록 생성자를 오버로드 할 수 있지만 ... 좋은 생각입니까?

아니.

다른 생성자 과부하가 있으면 의도 한 것과 반대 효과가 있습니다. 프로그래머는 다른 과부하가 다른 행동을 가질 것으로 기대하고 다음과 같이 물을 것입니다. " 이러한 과부하마다 어떤 종류의 다른 행동 이 표현되고 있습니까?

대부분의 프로그래머는 미리 정의 된 순서로 메소드 매개 변수를 갖는 분야를 기대하며 IntelliSense와 같은 도구는 매개 변수를 입력 할 때 예상되는 순서를 알려줍니다.


같은 일을하는 여러 함수 이름을 갖는 것은 같은 문제입니다. 프로그래머는 변형이 다른 동작을 가질 것으로 기대합니다. 동작마다 하나의 기능 또는 방법을 사용하고 일관된 명명 패턴을 채택하십시오.


14
많은 투표권. 나는 즉시 멈출 것이다. 고맙습니다.
Trevor Hickey

8
또한 목적을 설명하기 위해 생성자의 이름을 다르게 지정할 수 없으므로 독자는 매개 변수에서 생성자를 유추해야합니다. 이 방법으로 생성자를 오버로드하면 이해하기가 훨씬 어려워집니다.
Zachary Yates

3
"같은 일을하는 여러 함수 이름이있다 ..."- '좋은'시간 동안 Ruby 클래스 인 String Hash Array File을 살펴 본다 .

+1. 개발자 / 프로그래머를 다루고 있습니다. "사용자는 원숭이"라는 Microsoft 아이디어는 여기서 작동하지 않습니다.
Manoj R

1
@ZacharyYates "생성자 이름"부족은 대신 정적 생성 방법을 노출하여 해결할 수 있습니다. 이것은 C ++에서는 그리 많지 않지만 Java의 표준 관행입니다.
시온

14

때로는 논쟁들 사이에서 통근을 지원해야합니다. 예를 들어 :

double operator *(int, double);
double operator *(double, int);

피연산자가 반전 된 경우 int및의 곱셈을 원하지 않습니다 double. 도 아니다 우리가 곱하면 기억하는 힘 프로그래머 하시겠습니까 int들과 doubles의는 double왼쪽에 간다!

동일한 연산자이기 때문에 이것이 연산자인지는 중요하지 않습니다.

footype plus(const footype &, const bartype &);
footype plus(const bartype &, const footype &);

그것은 실제로 기능의 종류에 달려 있습니다. 대부분의 프로그래머는 아마도 산술 라이브러리에서 commutativity에 대한 지원을 원하지만 모든 가능한 인수 순서를 지원하기 위해 I / O 라이브러리 함수를 반드시 원하지는 않습니다.

함수 호출이 포함될 예정인 중첩에 대한 우려가있을 수 있습니다. 산술 연산자의 유연성으로 구문 트리의 전체 구조를 변경하여 전체 표현을 명확하게 할 수 있습니다. 비슷한 용어를 그룹화합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.