2010-11-18 19 views
0

Temel olarak, bu logger sınıfına ve önekleyiciye sahibim. gayet iyi çalışıyorBu kayıt düzeni nasıl geliştirilir (Birazcık daha fazla)

void SomeObject::SomeMethod() 
{ 
    Prepender(*p_Logger, __PRETTY_FUNCTION__); 

    //Do stuff 
} 

:

class Logger 
{ 
    public: 
     enum LogType 
     { 
      LT_DEBUG = 0, 
      LT_WARNING, 
      LT_ERROR, 
      LT_STAT, 
      LT_TEXT, 
      LT_INFO, 
      LT_OTHER, 
      LT_UNKNOWN 
     }; 

     __attribute__((format(printf, 7, 8))) 
     virtual const char* EHLog(LogType, //LogType 
       bool,      //Send to FE 
       int,      //Error code 
       const char*,    //File 
       int,      //Line 
       const char*,    //Format 
       ...) = 0; 

     virtual void PushPrependString(const char*) = 0; 
     virtual void PopPrependString() = 0; 

     virtual ~Logger(){} 
}; 

class Prepender 
{ 
    public: 
     Prepender(Logger& oLogger, const char* zPrependString) 
      :o_Logger(oLogger) 
     { 
      o_Logger.PushPrependString(zPrependString); 
     } 

     ~Prepender() 
     { 
      o_Logger.PopPrependString(); 
     } 

    private: 
     Prepender(); 
     Prepender(const Prepender&); 
     Prepender& operator=(const Prepender&); 

     Logger& o_Logger; 
}; 

Şimdi, herhangi bir günlüğü yapılır fonksiyonları, ben bunu.

Prepender nesnesini el ile oturum açmaya gerek kalmadan el ile oluştururken bunu geliştirmenin bir yolu var mı? (Makrolar bile mi?) (Belki de imkansız olduğunu anlıyorum, başkalarının sahip olduğu fikirleri öğrenmek istiyorum).

DÜZENLEME: Yanlış fikirleri almak insanların çok Gördüğünüz gibi, ben ideal olarak bu yapmak istiyorum:

Bunu yapmanın başlıca motivasyon ben bir önek unutmayın emin olmaktır
void SomeObject::SomeMethod() 
{ 
    //Prepender(*p_Logger, __PRETTY_FUNCTION__); 

    //Do stuff 
    //And the same results!!! 
} 

içinde kayıt yapıldığında işlev görür. Yapmış olsaydım, bildirilen işlev gerçek olandan bir seviye yukarı olacak.

+0

Neyi başarmak istediğinizi belirtemez misiniz? İstemci kodunun nasıl görünmesini istersiniz? – Simone

+0

@Simone: "Günlüğe kaydetmeye ihtiyacım olan bir" Prepender "nesnesinin oluşturulmasıyla bunu yapmanın bir yolu var mı?" ? – nakiya

+0

Fikrimi değiştirdim: Bu yapılabilir :) – Simone

cevap

1

EDIT2: OP revize Düzenleme dayanarak

, IMO, en az bir taşınabilir şekilde günlük istenen hedeflere ulaşmak için mümkün değildir.

Edit1:

  1. Eğer geniş karakterleri desteklemek istemiyor musunuz?
  2. Neden char * yerine string (wstring) kullanmıyorsunuz?
  3. Günlük kaydedici bir Singleton veya bir Monostate olmalıdır (her bir işlev girişinde oluşturmakla ilgili yüklemenize dikkat etmelisiniz)
  4. Bu iş parçacığı güvenli mi olmalıdır?
  5. Neden Logger'da saf bir sanal yıkıcı değil?
  6. İsim kaydedici doğru görünmüyor. LogInterface gibi bir şeyi belirtmelidir.
  7. Özel durum işleme nedir?

Bize özellikleri anlatıncaya kadar birkaç tane daha devam edebilirim !! İsterseniz siz de yöntemin sonuna şey eklemek olabilir

METHOD(void SomeObject::SomeMethod()) 
    // do your stuff... 
ENDMETHOD 

where: 

#define METHOD(method_declaration) method_declaration \ 
    Prepender(*p_Logger, __PRETTY_FUNCTION__); 

#define ENDMETHOD } 

:

+0

Hey, ben sadece bir 'Prepender' oluşturmaktan kurtulmaktan bahsediyorum: D. Elbette onu geliştirebilirsin. Bu bir noob tarafından kodlanmış! – nakiya

+0

Oh. Yazının başlığıyla da taşındım (ayrıca) – Chubsdad

+0

Taşınabilir olmayan hileler var mı? Bu gönderi "hacks" etiketine sahip: – nakiya

0

Eh, bir makro kullanabilirsiniz.

+0

Üzgünüz, bu daha kötü görünüyor :) – nakiya

+0

"Hatta makrolar" dedin: P – Simone

+0

Evet ama temel sorunu çözmez. Makroda işlevi kapatmayı unutursam, yanlış iletiler için yanlış işlev imzalarını günlüğe kaydetmeye devam edebilirim. İdeal olarak sevdiğim şey bir yerde bir defaya mahsus bir başlangıçtır ve öneklemenin kapsanacağını düşünürken rahat olmalıdır. Benim yöntemimde ve sizinkinde, el ile bunu sağlamak zorundayım - Bir derleyici veya çalışma zamanı hatası üretmenin bir yolu bile yok. – nakiya

İlgili konular