เป็นความคิดที่ดีหรือไม่ที่จะให้ลายเซ็นฟังก์ชันที่แตกต่างกันซึ่งทำสิ่งเดียวกัน


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

ฉันสามารถสร้าง Constructor ให้มากเกินไปเพื่อให้ [พารามิเตอร์] ไม่สำคัญ ... แต่นั่นเป็นความคิดที่ดีหรือไม่?

เลขที่

การมีตัวสร้างโอเวอร์โหลดที่แตกต่างกันจะมีผลตรงกันข้ามกับสิ่งที่คุณต้องการ โปรแกรมเมอร์ที่มาหลังจากที่คุณคาดหวังว่าโอเวอร์โหลดที่แตกต่างกันจะมีพฤติกรรมที่แตกต่างกันและจะถามว่า: " โอเวอร์โหลดแต่ละประเภทเหล่านี้มีพฤติกรรมที่แตกต่างกันอย่างไร

โปรแกรมเมอร์ส่วนใหญ่คาดว่าวินัยของการมีพารามิเตอร์วิธีการตามลำดับที่กำหนดไว้ล่วงหน้าและเครื่องมือเช่น IntelliSense จะบอกพวกเขาถึงคำสั่งของพารามิเตอร์ที่คาดหวังเมื่อพวกเขาป้อนพวกเขา


มีชื่อฟังก์ชั่นหลายอย่างที่ทำสิ่งเดียวกันเป็นปัญหาเดียวกัน โปรแกรมเมอร์คาดหวังว่าตัวแปรต่างๆจะมีพฤติกรรมที่แตกต่างกัน ฟังก์ชั่นหรือวิธีการหนึ่งต่อพฤติกรรมโปรดและเพียงแค่นำรูปแบบการตั้งชื่อที่สอดคล้องกัน


14
โหวตมากขึ้น ฉันจะหยุดทันที ขอขอบคุณ.
Trevor Hickey

8
นอกจากนี้คุณไม่สามารถตั้งชื่อตัวสร้างต่างกันเพื่ออธิบายวัตถุประสงค์ของคุณผู้อ่านต้องอนุมานจากพารามิเตอร์ การสร้างมากเกินไปด้วยวิธีนี้ทำให้ยากที่จะเข้าใจ
Zachary Yates

3
"การมีชื่อฟังก์ชั่นหลายตัวที่ทำสิ่งเดียวกัน ..." - สำหรับ 'ดี' เวลาดูที่เรียนทับทิมString แฮ อาร์เรย์ ไฟล์

+1 คุณกำลังติดต่อกับผู้พัฒนา / โปรแกรมเมอร์ แนวคิดของ Microsoft เรื่อง "user is monkey" ไม่ทำงานที่นี่
Manoj R

1
@ ZacharyYates การขาด "ชื่อคอนสตรัคเตอร์" สามารถแก้ไขได้โดยการเปิดเผยวิธีการก่อสร้างแบบคงที่แทน นี่คือการปฏิบัติมาตรฐานใน Java แม้ว่าจะไม่มากใน C ++
Xion

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 &);

มันขึ้นอยู่กับประเภทของฟังก์ชั่น ในขณะที่โปรแกรมเมอร์ส่วนใหญ่อาจต้องการการสนับสนุนสำหรับการสับเปลี่ยนในห้องสมุดเลขคณิตพวกเขาไม่ต้องการพูดฟังก์ชั่นไลบรารี I / O เพื่อรองรับคำสั่งอาร์กิวเมนต์ที่เป็นไปได้ทั้งหมด

ความกังวลอาจซ่อนอยู่รอบ ๆ การซ้อนที่คาดไว้ซึ่งการเรียกใช้ฟังก์ชันจะเกี่ยวข้อง ความยืดหยุ่นในตัวดำเนินการทางคณิตศาสตร์ช่วยให้เราสามารถเปลี่ยนโครงสร้างโดยรวมของแผนผังต้นไม้เพื่อชี้แจงการแสดงออกโดยรวม: จัดกลุ่มคำศัพท์ที่คล้ายกันเข้าด้วยกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.