2016-04-11 44 views
1

aynı sınıf A, aşağıdaki iki sürümü varsayalım:Hangisi daha iyi: açık mı yoksa anlamsız get()?

şekli berraklık, verimlilik ve uzayabilirlik açısından 1

class A 
{ 
    public: 
     enum class Retrievable { Integer, String }; 

     A(): m_integer(123), m_string("string") {} 
     ~A() {} 

     void* get(const Retrievable r) 
     { 
     switch (r) 
     { 
      case Retrievable::Integer: 
       return static_cast<void*>(&m_integer); 
      case Retrievable::String: 
       return static_cast<void*>(&m_string); 
      default: 
       throw; 
     } 
     } 

    private: 
     int m_integer; 
     std::string m_string; 
}; 

Versiyon 2

class A 
{ 
    public: 
     A(): m_integer(123), m_string("string") {} 
     ~A() {} 

     int getInteger()  { return m_integer; } 
     std::string getString() { return m_string; } 

    private: 
     int m_integer; 
     std::string m_string; 
}; 

, bu iki paradigmaların olan - tek bir tipsiz get() işlevi veya ayrı get() işlevleri - daha mı iyidir?

+0

İkincisi. Birincisinde, hem 'r' hem de hataya yatkın ve gereksiz olan dönüş türünü belirtmeniz gerekir. Bunu 'sanal' yapmak da mümkün değil. Birincisi, belirtilen türü bir şekilde kullandığınızda, örn. dynamic_cast' için ama bu örnekte yok. – StenSoft

+0

Derleme olmayan kod, koddan daha hızlıdır. Sürüm 1 derlenmiyor, bu yüzden açıkça daha iyi bir performans. Bir dakika ne? Seçenek 1 veya seçenek 2'nin daha iyi olup olmadığını öğrenmek isterseniz, lütfen seçeneklerinizi açıklayan * gerçek çalışma kodunu * belirtin. Yukarıdakiler herhangi bir anlam ifade etmediği için - derlemeyi yapmak için seçeneklerden birini temelde yeniden yazmak zorundayım ve aynı kodu aynı şekilde yeniden yazıp yazmayacağımı kim bilir. – Yakk

+0

@Yakk Dürüstçe, henüz bir çalışma örneği oluşturabileceğim kodlamada bir noktaya gelmedim. Ancak, diğer nedenlerle ikinci yöntemi kullanarak sona erdi. Bu, cevabı bildiğim teorik bir alıştırmaydı. Eminim derlemek için böyle bir şey alabilirim. Soru, arkasındaki teori hakkındaydı, özellikle ne yazdığımda değil (en azından kısmen yanlış olduğunu düşündüm). – Frostfyre

cevap

3

Seçenek 1, void*'a şeyler atar ve zaman gönderimini çalıştırır, bu daha yavaş ve daha az güvenlidir ve kullanımı daha zordur.

Bir komut dosyası altyapısı ile etkileşim engelleme, seçeneği 1'i kullanmanın bir nedenini düşünemiyorum. Ve hatta bununla başa çıkmak için daha iyi yollar vardır. Seçenek 1'i seçenek 2'ye alternatif bir seçenek olarak öneren bir görüşmeci, güçlü bir işe yaramamaktadır ve bu, görüşmeciyi bu kadar uzağa götüren huniyi yeniden gözden geçirmemi sağlayacaktır.

Kısaca, seçenek 2 daha iyi.

1

Sürüm A bakılmaksızın C size C (Cstring vb olan işaretçi)

B Versiyonu belki daha iyidir değil türü dönmek için çalışacağız, çünkü zaten derlemek, aynı zamanda çarpık vazgeçmeyecektir. JSON düğümü veya bir şey gibi bazı polimorfik türler oluşturmadığınız sürece, işlev davranış türünü değil, dönüş türünü tanımlamalıdır.

Yine, bazı JSON sınıflarını yazmıyorsanız, davranıştan ziyade dönüş türünü açıklayan bir işlev oluşturma konusunda fazla bir şey görmüyorum. Bir PersongetHand veya getLeg işlevler yok, o wave, walk vb

verici performans gibi işlevlere sahiptir? Bir alıcının uygulamanızın performansını azaltacağından şüpheliyim.

+0

Bunlar, konsept için sadece genel isimlerdi.Yani, örneğin, getInteger() getCurrentGameLevel() olabilir ve m_currentGameLevel döndürdü. – Frostfyre

+0

bu yüzden temelde 'get (Option :: GameLevel) 've' getGameLevel' arasında bir karşılaştırma var mı? herhangi bir soru olmadan ikinci. davranışı tanımladığı ve derlenme zamanında belirlendiği için –