Aynı şeyi yapan farklı fonksiyon imzaları sağlamak iyi bir fikir midir?


23

İşte üç değerden oluşan bir C ++ sınıfıdır.

class Foo{

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

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

Tüm parametre tipleri farklıdır.
Yapıcıyı aşırı yükleyebilirim, böylece sipariş önemli değil.

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;
};

Ama bu iyi bir fikir mi?
Yapmaya başladım çünkü bir sınıfın / işlevin neye ihtiyacı olduğunu biliyordum;
Onları hangi sıraya soktuğumu her zaman hatırlamadım.


Derleyicinin bunu aynı yapıcıyı çağırdığım gibi optimize ettiğini farz ediyorum.

//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");

Bir işlevin aşırı yüklenmesine ilişkin düşünceleriniz nelerdir ki, sipariş önemli değil?


Ayrıca, bazı yardımcı fonksiyonlar yazıyorsam
, aynı şeyi yapan farklı fonksiyon adları sağlamak iyi bir fikir midir?

Örneğin.

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

Bu ikisini ancak benzer sözleşmeleri sık görmüyorum.
Alışkanlığı bozmalı mı yoksa kucaklamalı mıyım?


1
Bir kişi, açıkça ifade edilen her bir yol, bazı durumlarda açıkça ve açıkça diğerlerinden daha üstün olacaksa, bir şeyi ifade etmek için birden fazla yol sağlama çabasını harcamalıdır. Bu, genellikle bir şeyin yalnızca tek bir biçimde yazılmasını sağlamak için çaba harcaması gerektiği anlamına gelmez, ancak bir şeyin en iyi olmayan şekilde belirtilmesine izin vermek için çaba göstermenin anlamı yoktur.
supercat,

Bir tür yinelenen burada sorumu (şimdi bunun kötü bir fikir olduğunu kabul).
leftaroundabout

Yanıtlar:


93

Yapıcıyı aşırı yükleyebilirim, böylece [parametrelerin sırası] önemli değil ... Ama bu iyi bir fikir mi?

Yok hayır.

Farklı kurucu aşırı yüklenmelerine sahip olmak, niyetlendiğiniz şeyin tersi bir etki yaratacaktır. Sizden sonra gelen programcı farklı aşırı yüklemelerin farklı davranışlara sahip olmasını bekler ve şunu sorar: " Bu aşırı yüklemelerin her biri tarafından ne tür farklı davranışlar ifade ediliyor?

Programcıların çoğu, önceden tanımlanmış bir sırada yöntem parametrelerine sahip olma disiplinini bekler ve IntelliSense gibi araçlar, parametrelere girdikleri sırada beklenen sıralamayı söyler.


Aynı şeyi yapan birden fazla fonksiyon adına sahip olmak aynı problemdir; programcılar değişkenlerin farklı davranışlar göstermesini bekler. Davranış başına bir işlev veya yöntem lütfen ve yalnızca tutarlı bir adlandırma modelini benimseyin.


14
çok oy. Hemen duracağım. teşekkür ederim.
Trevor Hickey

8
Ayrıca, amacınızı açıklamak için yapıcılara farklı adlar atamazsınız, okuyucuların bunu parametrelerden çıkarması gerekir. Yapıcının bu şekilde aşırı yüklenmesi, anlaşılmasını zorlaştırır.
Zachary Yates

3
"Aynı şeyi yapan birden fazla fonksiyon adına sahip olmak ..." - 'iyi' bir süre için Ruby sınıflarına String Hash Array File bakın .

+1. Geliştiriciler / programcılar ile ilgileniyorsunuz. Microsoft "kullanıcı maymun" fikri burada çalışmaz.
Manoj R

1
@ZacharyYates "Yapıcı isimleri" eksikliği, bunun yerine statik bir inşaat yöntemleri ortaya çıkarılarak çözülebilir. Bu, C ++ 'ta çok olmasa da Java'da standart bir uygulamadır.
Xion

14

Bazen argümanlar arasında iletişimi desteklemek gerekir. Örneğin:

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

İşlenenler ters çevrilirse bir çarpımın intve doublefarklı bir şeyin hesaplanmasını istemeyiz . Biz de programcıları, ints ile çarparken sola doublesdoğru doublegittiğini hatırlamaya zorlamak istemeyiz !

Bunun bir operatör olması önemli değil, çünkü aynı şey geçerli:

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

Bu gerçekten işlev türlerine bağlıdır. Çoğu programcı muhtemelen aritmetik kütüphanelerde komütabilite için destek isterken, olası tüm argüman düzenlerini desteklemek için bir I / O kütüphanesi işlevi istemezler.

Kaygı muhtemelen işlev çağrılarının dahil olacağı beklenen iç içe geçmeye bağlı. Aritmetik operatörlerdeki esneklik, genel ifadeyi netleştirmek için sözdizimi ağacının genel yapısını değiştirmemize izin verir: grupla benzer terimleri ve benzerlerini birlikte.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.