cod naspa

Acest forum este dedicat intrebarilor de programare care nu-si au locul in unul din celelalte forumuri

Re: cod naspa

Mesajde Silviu Ardelean » 02 Oct 2012, 20:05

Claudiu, pe aici e vorba de-un std::map iar din cate stim de at() nu s-a auzit prin std::map. Iar operatorul [] nu face spume daca i-ai pasa o cheie ce nu exista in map ci iti insereaza un item nou. Deci, iot out of range. :)
Corect era ceva de genul:
Cod: Selectaţi tot
iterDynMenu it = m_menuMap.find(nMapKey);
if (it != m_menuMap.end()) {
   it->second.bEnableFlag = bFlag;
}


Na... ca sunt offtopic. :biggrin:
Avatar utilizator
Silviu Ardelean
Senior
Senior
 
Mesaje: 1175
Membru din: 12 Iul 2007, 09:22
Localitate: Timisoara
Judet: Timiş

Re: cod naspa

Mesajde Ovidiu Cucu » 03 Oct 2012, 09:24

Iata cum se "incapsuleaza" gospodareste niste coduri de eroare:
Cod: Selectaţi tot
namespace myapp
{
   namespace utils
   {
      namespace errors
      {
         class ErrorCodes
         {
         public:
            enum ERROR_CODES
            {
               ERROR_NO_ERROR = 0,
               ERROR_INCORRECT_FUNCTION = 1,
               ERROR_FILE_NOT_FOUND = 2,
               // ...
            };
         };
      }
   }
}

Iata si un exemplu de utilizare simplificat:
Cod: Selectaţi tot
   myapp::utils::errors::ErrorCodes::ERROR_CODES errorCode = SomeMethod();

   if(errorCode == myapp::utils::errors::ErrorCodes::ERROR_NO_ERROR)
   {
      // do something nice.
   }
   else
   {
      switch(errorCode)
      {
      case myapp::utils::errors::ErrorCodes::ERROR_FILE_NOT_FOUND:
         std::cout << "Error file not found" << std::endl;
         break;
      // and so on.
      }
   }



Mai mare dragul... sa ne traiasca architecţii! :)
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Re: cod naspa

Mesajde Silviu Ardelean » 03 Oct 2012, 09:32

Arhitectii ca arhitectii, dar utilizatorii/developeri trebuie sa fi auzit de using namespace.
Avatar utilizator
Silviu Ardelean
Senior
Senior
 
Mesaje: 1175
Membru din: 12 Iul 2007, 09:22
Localitate: Timisoara
Judet: Timiş

Re: cod naspa

Mesajde Ovidiu Cucu » 03 Oct 2012, 10:03

Silviu Ardelean scrie:Arhitectii ca arhitectii, dar utilizatorii/developeri trebuie sa fi auzit de using namespace.

Sigur ca au auzit insa cu using namespace n-ar trece de un code review cu un QAE barţos care-i arata-n procedura (gen MISRA), negru pe alb, "do not use using namespace!". Oarecum pe buna dreptate: s-ar putea ca "architectura" sa fie atat de incalcita si sa dai din greseala de un alt ErrorCodes::ERROR_CODES, pe care domnul architect i-a tunat sa-l puna intr-un alt namespace.
Si nu in ultimul rand, un developer puturos prefera sa scrie cârnaţi daca-l ajuta intellisense-ul. Nimic gresit in asta insa vai de mama aluia care citeste! :)
De notat ca aici e doar un exemplu super-uber simplificat. Ca sa-ti faci o imagine mai aproape de realitate, pune-l si pe SomeMethod intr-o clasa dintr-un alt namespace, cu argumente de tipuri definite in alte namespace-uri, mai adauga cateva nivele de namespace, si-ai sa vezi atunci carnati sau cum te descurci cu using namespace. ;)

[ later edit ]
Pe bune si fara vrajeala: in aplicatia reala trebuia sa faci scroll orizontal trei-patru ecrane pentru unele linii de cod.
Totul pornind de la un architect indragostit de namespace-uri. :)
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Re: cod naspa

Mesajde Silviu Ardelean » 03 Oct 2012, 10:34

Ovidiu Cucu scrie:
Silviu Ardelean scrie:Arhitectii ca arhitectii, dar utilizatorii/developeri trebuie sa fi auzit de using namespace.

-----
Pe bune si fara vrajeala: in aplicatia reala trebuia sa faci scroll orizontal trei-patru ecrane pentru unele linii de cod.
Totul pornind de la un architect indragostit de namespace-uri. :)

Dupa parerea mea, problema e a developerului caruia-i place sa se afle-n treaba scriind mai mult cod in loc sa adauge cateva linii si sa scrie un cod efectiv mai citet. :)
Dar desigur, in definitiile claselor chiar e recomandat sa foloseasca namepace-urile (ex. cand are declaratii de clase ca parametrii, instante de astfel de clase dinn namespace, etc).
Avatar utilizator
Silviu Ardelean
Senior
Senior
 
Mesaje: 1175
Membru din: 12 Iul 2007, 09:22
Localitate: Timisoara
Judet: Timiş

Re: cod naspa

Mesajde Ovidiu Cucu » 03 Oct 2012, 10:56

Silviu Ardelean scrie:[...]
Dar desigur, in definitiile claselor chiar e recomandat sa foloseasca namepace-urile.

"Unii rabini spun ca da, alti rabini spun ca nu". O fi, insa nu-i bine sa le lasi la indemana copiilor, persoanelor cu dizabilitati mintale si architectilor care se joaca generand cod din diagrame. :) Oricum, n-am prea auzit rabin sa spuna ca-i foarte kosher sa faci "ierarhie" cu namespace-uri.

In fine, iata si o alta abordare, cel putin la fel de interesanta.
Cod: Selectaţi tot
class Foo
{
public:
   enum ERROR_CODES
   {
      ERROR_UNKNOWN = -1,
      ERROR_NO_ERROR = 0,
      ERROR_INCORRECT_FUNCTION = 1,
      ERROR_FILE_NOT_FOUND = 2,
      // Please, insert other error codes here!
   };

   ERROR_CODES int_to_ERROR_CODES(int error_code) const;
   // ...
};

Cod: Selectaţi tot
Foo::ERROR_CODES Foo::int_to_ERROR_CODES(int error_code) const
{
   ERROR_CODES errorCode = ERROR_UNKNOWN; // Never forget initialization!
   // Convert int to ERROR_CODES.
   switch(error_code)
   {
   case -1:
      errorCode = ERROR_UNKNOWN;
      break;
   case 0:
      errorCode = ERROR_NO_ERROR;
      break;
   case 1:
      errorCode = ERROR_INCORRECT_FUNCTION;
      break;
   case 2:
      errorCode = ERROR_FILE_NOT_FOUND;
      break;
   // Please, insert other error codes here!
   default: // Never forget default!
      errorCode = ERROR_UNKNOWN;
      break; // Never forget break!
   }
   return errorCode;
}

Si aici si-a bagat coada un QAE si-un architect. Ghici unde, cum si de ce. :)
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Re: cod naspa

Mesajde Ovidiu Cucu » 03 Oct 2012, 11:35

Silviu Ardelean scrie:
Ovidiu Cucu scrie:
Silviu Ardelean scrie:Arhitectii ca arhitectii, dar utilizatorii/developeri trebuie sa fi auzit de using namespace.

-----
Pe bune si fara vrajeala: in aplicatia reala trebuia sa faci scroll orizontal trei-patru ecrane pentru unele linii de cod.
Totul pornind de la un architect indragostit de namespace-uri. :)

Dupa parerea mea, problema e a developerului caruia-i place sa se afle-n treaba scriind mai mult cod in loc sa adauge cateva linii si sa scrie un cod efectiv mai citet. :)

Stilul carnat_de_trei_ecrane de care spuneam, a fost inventat de un architect venit de pe meleaguri Java, care cand n-avea treaba se apuca de implementat cod C++.
Fiind un adevarat "mentor" pentru o generatie intreaga de developeri, toti l-au urmat. Destul de greu dupa aia sa-i convingi ca, pana la ';' se poate baga din loc in loc si cate-un Enter. Habits are habits. :)
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Re: cod naspa

Mesajde Silviu Ardelean » 03 Oct 2012, 12:30

Ovidiu Cucu scrie:Stilul carnat_de_trei_ecrane de care spuneam, a fost inventat de un architect venit de pe meleaguri Java, care cand n-avea treaba se apuca de implementat cod C++.
Fiind un adevarat "mentor" pentru o generatie intreaga de developeri, toti l-au urmat. Destul de greu dupa aia sa-i convingi ca, pana la ';' se poate baga din loc in loc si cate-un Enter. Habits are habits. :)

Si pe Java s-a inventat "import ..." ce te scapa de carnati. Daca omul avea o predilectie pentru "mezeluri" atunci ii compatimesc "ucenicii". :)
Avatar utilizator
Silviu Ardelean
Senior
Senior
 
Mesaje: 1175
Membru din: 12 Iul 2007, 09:22
Localitate: Timisoara
Judet: Timiş

Re: cod naspa

Mesajde Ovidiu Cucu » 03 Oct 2012, 13:01

Silviu Ardelean scrie:Si pe Java s-a inventat "import ..." ce te scapa de carnati. Daca omul avea o predilectie pentru "mezeluri" atunci ii compatimesc "ucenicii". :)

Nu-i vorba numai de mezeluri. Vezi c-am adaugat ceva la ce spun rabinii. :)
Maine-poimane, bietul developer se poate trezi cu ceva de genul:
Cod: Selectaţi tot
namespace myapp
{
   namespace base
   {
      class Foo
      {
         // ...
      };
      namespace derived
      {
         class Foo : public base::Foo
         {
            // ...
         };
      }
   }
}

Ma rog... un architect bun, poate usor concepe ceva mult mai complicat.
// Sper sa nu vada vreunul tampenia asta si sa-i placa... :)
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Re: cod naspa

Mesajde Ovidiu Cucu » 03 Oct 2012, 14:35

Una cu MFC scrisa probabil la GoF's Fan Club:
Cod: Selectaţi tot
class CAboutDlg : public CDialog
{
private:
   CAboutDlg();
   ~CAboutDlg();

public:
   static CAboutDlg& getInstance()
   {
      static CAboutDlg instance;
      return instance;
   }
   //...
};

Cod: Selectaţi tot
void CWhateverApp::OnAppAbout()
{
   CAboutDlg::getInstance().DoModal();
}

S-ar fi rasucit John Vlissides in mormant daca n-o faceau singleton pe CAboutDlg.
Normal, nu carecumva sa-i treaca vreunuia prin cap sa arate simultan doua sau mai multe About-uri modale. :)
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Re: cod naspa

Mesajde Marius Bancila » 08 Oct 2012, 09:17

Cod: Selectaţi tot
namespace myapp
{
   namespace utils
   {
      namespace errors
      {
         class ErrorCodes
         {
         public:
            enum ERROR_CODES
            {
               ERROR_NO_ERROR = 0,
               ERROR_INCORRECT_FUNCTION = 1,
               ERROR_FILE_NOT_FOUND = 2,
               // ...
            };
         };
      }
   }
}

se poate si asa:
Cod: Selectaţi tot
namespace mue = myapp::utils::errors;

mue::ErrorCodes::ERROR_CODES errorCode = SomeMethod();

if(errorCode == mue::ErrorCodes::ERROR_NO_ERROR)
   {
      // do something nice.
   }
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog
Avatar utilizator
Marius Bancila
Fondator
Fondator
 
Mesaje: 2338
Membru din: 11 Iul 2007, 11:45
Localitate: Timisoara
Judet: Timiş

Re: cod naspa

Mesajde Ovidiu Cucu » 09 Oct 2012, 10:01

Marius Bancila scrie:[...]
se poate si asa:
Cod: Selectaţi tot
namespace mue = myapp::utils::errors;

Sigur ca se poate.
Intr-o architectura "adevarata" care poate face cinste oricarui architect iubitor de namespace-uri, un happy developer ar putea scrie chiar asa:

Cod: Selectaţi tot
namespace mue_architect =
   myapp::utils::errors::algorithm::research::computing::host::input::trace::extra::current::test;

:biggrin:
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Re: cod naspa

Mesajde Ovidiu Cucu » 09 Oct 2012, 11:09

Poate ca cineva se intreaba cum se foloseste practic clasa copil-minune CError, prezentata mai devreme aici: viewtopic.php?f=18&t=773&start=90#p14558

Iata un exemplu simplificat, provenit din real-code:
Cod: Selectaţi tot
CError CFoo::DoSomething()
{
   CError answer;
   // ...
   try
   {
      // a lot of code that can throw exceptions
   }
   catch(CFileException* e)
   {
      e->Delete();
      answer.set_error();
      answer.add_error(_T("Possible disk write error."));
      return answer;
   }
   catch(CMemoryException* e)
   {
      e->Delete();
      answer.set_error();
      answer.add_error(_T("Possible not enough memory."));
      return answer;
   }
   // other catch blocks here...

   catch(CException* e)
   {
      e->Delete();
      answer.set_error();
      answer.add_error(_T("Unknown error!!!")); // this is for sure (n.r.) :p
      return answer;
   }
   // ...
   return answer;
}

Sigur, toti stie ca "exceptions are evil" asa ca ne apucam gospodareste sa le prindem peste tot si sa le transformam in CError, la fel cum un fost javaman transforma toti "evil pointers" in referinte (vezi aici: viewtopic.php?f=18&t=773#p4855).

Inca nu-i nimic. Mai departe, CFoo::DoSomething este apelata la randul ei de alte metode care intorc CError pe acelasi calapod, care la randul lor...
In fine, undeva-candva dupa ce possiblil ca s-a facut vraiste peste tot, dupa ce eventual procesul a facut de doua-trei ori Alzheimers, se cheama CError::message_error pentru a-i arata clientului si/sau celui care face testing/maintaining un foarte sugestiv mesaj continand o lista cu "Possible disk write error", "Possible not enough memory", "Unknown error" s.a.m.d.

In plus, oare de ce am pune doar un catch care prinde un pointer la CException, care este clasa de baza pentru CFileException, CMemoryException si altele pe care nu le-am inclus in exemplu? Suntem probabil platiti la numarul de catch-uri. Si ce daca clasele derivate din CException suprascriu metoda virtuala GetErrorMessage? Avem noi mesaje mai bune de bagat in ceata, gen "Possible disk write error".

Si-or mai fi multe de spus vazand asemenea cod, inainte de a da cu tastatura in monitor, in lipsa de cap autor... :)
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Re: cod naspa

Mesajde Marius Bancila » 09 Oct 2012, 22:28

Ce-mi place cel mai mult e ca autorul e totusi retinut. Adica atunci cand sistemul ii arunca in nas o CMemoryException are totusi dubii, insa accepta ca ar fi totusi posibil sa fie asa.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog
Avatar utilizator
Marius Bancila
Fondator
Fondator
 
Mesaje: 2338
Membru din: 11 Iul 2007, 11:45
Localitate: Timisoara
Judet: Timiş

Re: cod naspa

Mesajde Ovidiu Cucu » 10 Oct 2012, 09:58

Marius Bancila scrie:Ce-mi place cel mai mult e ca autorul e totusi retinut. [...]

In software trebuie sa fii intotdeauna retinut. Imi amintesc un program de contabilitate care dupa ce rasnea cateva minunte bune nu stiu ce operatii bengo, dadea un mesaj de genul "Probabil datele au fost salvate corect". Uraaa! :biggrin:
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3776
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

AnteriorUrmătorul

Înapoi la Programare generala

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 3 vizitatori

cron