Полезные НЕсоветы программисту
Я - программист с небольшим стажем, но уже делаю свои первые робкие шаги по карьерной лестнице. Я много читаю и самообучаюсь, иногда что-то пробую в своей практике. И теперь я готов поделиться с вами несколькими советами по программированию которые очень помогают мне в моей каждодневной работе. Ко всем советам я пришел сам и они многократно опробованы в моих проектах.
1) Бесконечный цикл» Нажмите, для открытия спойлера | Press to open the spoiler «
Все мы знаем, что в компьютере многое может произойти по принципу «Оно само». Где-то будет скачек напряжения или магнитные наводки. Поэтому легко в нашей программе может произойти инверсия бита. И мы вместо true получим false. А это говорит о том, что цикл вида:
while ( true ) {
doSome();
}
совершенно ненадежен! В любой момент может true поменяться на false и мы выйдем из цикла. Как этого избежать? Очень легко. Мы легко можем повысить надежность бесконечного цикла вот таким «куском» кода.
while(true) {
do {
for(;;) {
doSome();
}
} while(1);
}
Многие могут сказать, что кол-во кода увеличилось. Но на помощь приходит препроцессор.
#define FOREVER_CYCLE_START while(true){do{for(;;){
#define FOREVER_CYCLE_END }}while(1);}
И теперь мы легко можем написать
FOREVER_CYCLE_START
foreverYoung();
FOREVER_CYCLE_END
Великолепно и всё сразу понятно. А новичок не будет думать, что же значит for(;;){ }. и почему условие в for похоже на плачущую рожицу.
»» Нажмите, для закрытия спойлера | Press to close the spoiler «« 2) Установка фигурной скобки» Нажмите, для открытия спойлера | Press to open the spoiler «
Бесконечные споры. Что же лучше?
if ( COND ) {
doSome();
}
или
if ( COND )
{
doSome();
}
Хватит! Представляю вариант который устроит ВСЕХ!
if ( COND ) {
{
doSome();
}}
Все счастливы и довольны. О холиваре можно забыть… Хотя… стоит ли писать последние две закрывающиеся фигурные скобки на одной строке или стоит разнести на две? Но это уже отдельный вопрос требующий привлечения специалистов и дополнительных обсуждений.
»» Нажмите, для закрытия спойлера | Press to close the spoiler «« 3) Ассемблерные вставки» Нажмите, для открытия спойлера | Press to open the spoiler «
Никогда не бойтесь вставлять ассемблерный код в свои программы. Такие вставки показывают, что вы знаете не только высокоуровневый С++, но и в ладах с языком машины. Да, иногда, придётся переписывать или подправлять ассемблерный код, что бы перенести программу на другую архитектуру. Но за эту работу вам дополнительно заплатят и в очередной раз ваше начальство убедится, что вы хороший сотрудник. И никто другой не может справится с вашими обязанностями. Есть ещё маленькая хитрость. Вы можете вставлять бесполезные ассемблерные вставки, которые ничего не делают. Например вы можете по вспомнить, разные способы обмена информацией в регистрах:
mov bx, ax
mov ax, cx
mov cx, bx
xchg ax, cx
push ax
mov ax, cx
pop cx
xor ax, cx
xor cx, ax
xor ax, cx
Этот код придаст важности вашей программе. А люди которые будут с ним работать освежат свои знания. С вами может работать неопытный программист, который только что пришел из университета. А мы знаем, что студенты не очень охотно учат ассемблер. Таким образом он сразу же побежит к вам за разъяснением. У него создастся впечатление, что вы гуру, раз можете так легко манипулировать языками программирования. А начальство будет радо видеть, что новые сотрудники бегают к вам за новыми знаниями и вы ими охотно делитесь. Что может повлиять на вашу зарплату. Да и все же знают, что на ассемблере — быстрее!
»» Нажмите, для закрытия спойлера | Press to close the spoiler «« 4) Никогда не используйте const» Нажмите, для открытия спойлера | Press to open the spoiler «
Программисты как никто другой знает, что мы живём в бурном и быстро развивающемся мире, где все меняется очень быстро. А значит и использовать const смысла нет. Даже когда объект очевидно const, например кол-во спутников земли (у нас всего одна луна), то все равно по какой-то причине луна может расколоться на две. И придётся делать:
const int moons = 1;
moons++;
Что к вашему разочарованию забракует компилятор. Да и к тому же вы можете случайно сделать const, то что вы бы не хотели. Как вам понравится, если кто-то сделать вашу зарплату const? Всё! Прощай карьерный рост и повышение зарплаты.
const salary = 100; // $ в год
Да и к тому же это просто лишняя растрата байт кода. За эти 5 символов можно было бы сделать что-то полезное. Например, foo++.
»» Нажмите, для закрытия спойлера | Press to close the spoiler «« 5) Давайте переменным максимально короткие имена» Нажмите, для открытия спойлера | Press to open the spoiler «
Ведь запомнить переменную x куда проще чем position_of_object_on_x_axis. Например, этот код выглядит лаконичным и удобно читаемым:
if ( x < y ) {
z++;
} else if ( c > q ) {
c += f;
} else {
r = z + c;
}
Код легко умещается в пределах видимости глаз. И его легко проанализировать просто бросив на него взгляд.
»» Нажмите, для закрытия спойлера | Press to close the spoiler «« 6) CamelCase или snake_case» Нажмите, для открытия спойлера | Press to open the spoiler «
Еще один вечный холивар. Такой же, как полезна ли венгерская нотация или является пережитком прошлого! Достаточно. Мы программисты должны писать код, а не выяснять кто прав, а кто нет.
Я проанализировал эти стили и разработал универсальный стиль, который подойдет всем без исключения:
vengro_snakeCamel!
Примеры этого стиля:
float float_charPositionX;
int int_moneySpent
char* charPointer_nameOfPerson;
»» Нажмите, для закрытия спойлера | Press to close the spoiler «« 7) Имена переменных» Нажмите, для открытия спойлера | Press to open the spoiler «
Любой программист знает, что код надо писать так, что бы потом его удобно было читать. Но мы не всегда знаем, кто его будет читать после нас. И хорошо, если этот человек будет знать английский язык. Но далеко не все его знают и мы должны учитывать и эту аудиторию. Объявляйте переменные так, что бы они были понятны и на русском языке.
int int_kolichestvoBukv;
float float_glubinaBasseina;
bool bool_estLiZhiznNaMarse;
Теперь даже ребенок сможет понять смысл ваших переменных. Но все равно. нет предела совершенству. Все же играли в детстве в компьютерные игры? Помните как приходилось общаться с напарниками по команде, а русский язык не поддерживался? Применяйте эти знания и в программировании. Ведь все всё понимали, а значит в этом есть смысл.
int int_koJIu4ecTBo6ykB;
float float_rJly6uHa6acceuHA;
bool bool_ectbJIu7Ku3HbHaMapce;
»» Нажмите, для закрытия спойлера | Press to close the spoiler «« 8) DEFINE'ы» Нажмите, для открытия спойлера | Press to open the spoiler «
Препроцессор существует уже очень давно и перешел в наследство от языка С. А раз он передался по наследству, значит он представляет из себя некоторую ценность, проверен временем и перенесен на С++, как неотъемлемая часть программирования. Возьмем типичную ситуацию. На 1-ом курсе университета вы изучали pascal. А на 2-ом вам начали преподавать C++. Новые синтаксис может ввести в замешательство. Но не беда. На помощь спешит препроцессор C++.
Вы всегда можете написать:
#define BEGIN {
#define END }
И всё. Процесс перехода на новый язык будет менее болезненным и более понятным.
»» Нажмите, для закрытия спойлера | Press to close the spoiler «« 9) Глобальные переменные» Нажмите, для открытия спойлера | Press to open the spoiler «
Не стесняйтесь использовать глобальные переменные. Ведь это очень удобно. Во первых не надо заботиться об инициализации. Они должны быть инициализированы нулем. Вы можете легко обращаться из любой части программы к ним, что позволяет избежать лишних параметров в функциях. Повышает гибкость проекта. А если кто-то скажет, что это не потокобезопасно. Так оно и есть. И это остановит вас от использования потоков. Человеческий мозг лучше просчитывает однопоточные программы. И глобальные переменные убережет Вас от использования потоков, что только повысит надежность ваших программ.
»» Нажмите, для закрытия спойлера | Press to close the spoiler «« 10) Исходники» Нажмите, для открытия спойлера | Press to open the spoiler «
Помните, что все исходные коды программы лучше хранить в одном файле. Это облегчает поиск интересующих вас переменных и функций. Ведь простой поиск по тексту одновременно становится и поиском по всему проекту. Все функции перед глазами, все переменные доступны в паре движений скроллом. Разбиение кода на несколько файлов приводит к тому, что за ним уже надо следить, что бы файлы не потерялись, разруливать обращения к глобальным переменным из каждого модуля компиляции и т. д. Зачем все эти сложности? Когда всё компактно находится рядом куда проще разобраться в исходных кодах, нежели скакать по куче разных файлов.
»» Нажмите, для закрытия спойлера | Press to close the spoiler «« Эпилог В ходе моей работы меня почему-то часто критикуют за мой код и стиль кодирования. Хотя не объясняют почему. Часто ругаются и смеются. Поэтому просьба к более опытным программистам — не обижайте своих молодых коллег. Все мы были новичками и прошли через неопытность, сомнения и неуверенность. Будьте добрее. И надеюсь мои советы вам никогда не пригодятся.
Источник: habrahabr