11 март 2016 г.

CODE TIPS #2 - Stop "using namespace std;" (C++)

Много често виждам в програми/примери за C++ използването на именното пространство "std", което представлява стандартната библиотека от функции на C++.

Оказва се, че този код не е част от добрата практика:

BAD
  1. #include <iostream>
  2. using namespace std;    // avoid this

  3. int main() {
  4.     cout << "I like pickles." << endl;
  5.     return 0;
  6. }


Защо? Простото обяснение е, че могат да се появят конфликти когато използваме други библиотеки, които потенциално могат да имат идентични имена като тези на функциите (и не само) в стандартната библиотека.


Например нека имаме 2 библиотеки с имена MyLib и OtherLib.

Да речем в MyLib имаме функцията myFunction(), а в OtherLib функцията otherFunction(). Всичко е OK, спокойно можем да импортираме тези функции и да ги извикваме безпроблемно.

Но един ден се налага да обновим първата библиотека и сега сме с MyLib 2.0, която за нещастие сега също има функция, която се казва otherFunction(). Лошо! Сега, когато извикаме otherFunction() в кода си, не е ясно кой код точно ще се изпълни. Може да ни се размине ако функциите са с различни параметри, но наистина не си струва рискът.

Решението e много просто и има потенциал да ни спести много главоболия. Ако се върнем към първоначалния пример със "std", единствената промяна, която е нужна, е да назовем името на съответното именно пространство. Тоест:

GOOD
  1. #include <iostream>
  2. int main() {
  3.     std::cout << "I like pickles." << std::endl;
  4.     return 0;
  5. }


"Но това е толкова досадно, всеки път трябва да назовавам именното пространство!" - няма проблем, защото има и алтернатива:

ALSO GOOD
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;

  1. int main() {
  2.     cout << "I like pickles." << endl;
  3.     return 0;
  4. }

Аналогично може да приложите горния код за std::string или структури като std::vector, std::list и т.н. Изключително дребна промяна, която не коства нищо, а носи огромна полза.

Няма коментари:

Публикуване на коментар