кроме того такой стиль кодирования уменьшает вложенность и код выглядит проще
сравните
void f()
{
if(ok1)
{
do1();
if(ok2)
{
// а вот тут собственно код вашей фукнции - уже третий уровень вложенности
}
else
return -2;
}
else
return -1;
}
void f()
{
// проверим все условия
if(!ok1)
return -1;
do1();
if(!ok2)
return -2;
// теперь все гарантированно хорошо, можно сделать то что мы намеревались
// и никаких лишних {} и отступов
}
для себя вывел простое правило. Нельзя подсадить человека на систему если ты с пеной у рта доказываешь какая она хорошая и свободная. А вот после того как для себя сформулировал нечто вроде «ну линукс тоже не без недостатков, но для меня подходит больше...» — то вполне можно вести логичные с людьми беседы.
Couldn't find any package whose name or description matched "zbot"
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
согласен с вами. Основное значение имеет та группа людей с которыми вы непосредственно работаете. И все-же…
И всеже я сторонник малых компаний.
Работал в компании где было более ста человек. Работал в компании из десяти человек включая директора — владельца компании.
Разница разительная. В малых компаниях работа движется быстрее. Изменения вносяться легко. Вчера вы писали одну программу, сегодня начальник пообщался с клиентами и решили немного изменить курс. Еще неделя — и вы уже забыли про старую программу и полным ходом пишите новую.
Никаких левых людей. В маленьких фирмах они долго не задерживаются. На течении шести месяцев после создания фирмы — из нее ушли все те люди, у которых было мало работы, или которые чувствовали что их работа не особо нужна. Через год — у нас был собранный коллектив из 5ти программистов, девушки бухгалтера-секретарши занимавшейся всей бумажной волокитой, девушки-веб-опитмизатора+ генератра идей + занимавшейся поиском клиентов и директора фирмы, собственно двигавшего все дело вперед. Он писал код, настраивал сервера, мотался на встречи с клиентами, оценивал нашу работу — словом был везде и во всем.
Привыкнув к такому темпу работы, к полной прозрачности, к дружескому отношению ( а как по-другому сидя в крохотном офисе, где все друг друга видят? ) я уже не смог работать в крупной фирме. Стало скучно. Понял что тут меня уже не любят и не ценят. Понял что тут мне легко найдут замену, и что лично я всем до фени. Понял что тут хороший код не нужен — тут важны уже наработанные клиенты. Понял что тут ценней бумажки а не люди.
если вы еще дополните это фукнциями исправления читателями текста ( бывают же ошибки у авторов ) — то цены бы сервису не было. Вики для книг =)
естественно люди читающие ту же книгу — получают пропатченные варианты
воин побеждает не единым усилем но постоянным движением к цели. (с) К. Кастанеда. Такчто не рвите себе когти. Постепенно спокойно. Разрешите себе побездельничать а потом плавно начинайте раскручивать ритм все быстрее и быстрее
2.1 No good stable standardized API for developing GUI applications (like Win32 API). Both GTK and Qt are very unstable and often break backwards compatibility.
13. A very bad backwards and forward compatibility.
13.1 Old applications rarely work in new Linux distros…
бред полнейший. Во-первых назвать WinAPI хорошим АПИ. Во-вторых говорить про обратную совместимость. В линуксе не нужна бинарная обратная совместимость, потому что доступны исходники софта. Библиотеки часто оставлют старые фукнции для обратной совместимости. И наконец если программа кому-то нужна, то найдется тот кто приведет ее код в соотвествие с последними интерфейсами библиотек.
в си++ такие баги обычно вызваны проблемами с памятью которые могут проявиться а могут и не проявиться.
к примеру
bool b; в большистве случаев будет true но в одном из 255 будет false;
добавили в код новую переменную. Компилятор по-другому расположил данные, и тут ваша b становится false.
так как параметр передается по значению то такой код корректен. В результате мы получаем простую и легкочитаемую запись в заголовке — а в теле функции страхуем себя от случайного изменения значения переменной.
Далее.
Если вы хотите объявить const поле класса, то инициализировать его обязательно списком инициализации ( так же как и ссылки )
class B
{
const int constValue;
public:
B(int&);
};
B::B()
:constValue(33)
{}
в противном случае если вы попробете сделать это в теле конструктора — получите ошибку.
В данном случае случше лучше всего руководствоваться следующим примером
аналог инициализации в теле конструктора ( между {} )
int x;
x=5;
аналог инициализации списоком инициализации ( после :)
int x = 5;
именно поэтому для инициализации констант и ссылок в качестве полей класса подходит только список инициализации
то что написали молодец. Уважаю. Хочу показать вам еще несколько недостатков вашей программы ( и то как ее можно улучшить ).
класс Answer
1. передача параметра по указателю — так как вам на самом деле нужна простая копия — проще передавать по констатной ссылке
Answer(const QString& s)
Далее. Внутри класс QString — умный указатель. Это значит что расходы на копирование объектов малы. Так-что в принципе можно передавать его по значению.
именно так я и сказал начальству когда меня спрашивали далеко ли хочу идти. Тим-лид мой потолок. Потому что мне интересны проекты, программы и мои коллеги, а не сроки и клиенты.
сравните
void f()
{
if(ok1)
{
do1();
if(ok2)
{
// а вот тут собственно код вашей фукнции - уже третий уровень вложенности
}
else
return -2;
}
else
return -1;
}
void f()
{
// проверим все условия
if(!ok1)
return -1;
do1();
if(!ok2)
return -2;
// теперь все гарантированно хорошо, можно сделать то что мы намеревались
// и никаких лишних {} и отступов
}
дяденька вы меня обманываете =((
И всеже я сторонник малых компаний.
Работал в компании где было более ста человек. Работал в компании из десяти человек включая директора — владельца компании.
Разница разительная. В малых компаниях работа движется быстрее. Изменения вносяться легко. Вчера вы писали одну программу, сегодня начальник пообщался с клиентами и решили немного изменить курс. Еще неделя — и вы уже забыли про старую программу и полным ходом пишите новую.
Никаких левых людей. В маленьких фирмах они долго не задерживаются. На течении шести месяцев после создания фирмы — из нее ушли все те люди, у которых было мало работы, или которые чувствовали что их работа не особо нужна. Через год — у нас был собранный коллектив из 5ти программистов, девушки бухгалтера-секретарши занимавшейся всей бумажной волокитой, девушки-веб-опитмизатора+ генератра идей + занимавшейся поиском клиентов и директора фирмы, собственно двигавшего все дело вперед. Он писал код, настраивал сервера, мотался на встречи с клиентами, оценивал нашу работу — словом был везде и во всем.
Привыкнув к такому темпу работы, к полной прозрачности, к дружескому отношению ( а как по-другому сидя в крохотном офисе, где все друг друга видят? ) я уже не смог работать в крупной фирме. Стало скучно. Понял что тут меня уже не любят и не ценят. Понял что тут мне легко найдут замену, и что лично я всем до фени. Понял что тут хороший код не нужен — тут важны уже наработанные клиенты. Понял что тут ценней бумажки а не люди.
естественно люди читающие ту же книгу — получают пропатченные варианты
13. A very bad backwards and forward compatibility.
13.1 Old applications rarely work in new Linux distros…
бред полнейший. Во-первых назвать WinAPI хорошим АПИ. Во-вторых говорить про обратную совместимость. В линуксе не нужна бинарная обратная совместимость, потому что доступны исходники софта. Библиотеки часто оставлют старые фукнции для обратной совместимости. И наконец если программа кому-то нужна, то найдется тот кто приведет ее код в соотвествие с последними интерфейсами библиотек.
к примеру
bool b; в большистве случаев будет true но в одном из 255 будет false;
добавили в код новую переменную. Компилятор по-другому расположил данные, и тут ваша b становится false.
class A
{
void f(int);
};
void A::f(const int);
так как параметр передается по значению то такой код корректен. В результате мы получаем простую и легкочитаемую запись в заголовке — а в теле функции страхуем себя от случайного изменения значения переменной.
Далее.
Если вы хотите объявить const поле класса, то инициализировать его обязательно списком инициализации ( так же как и ссылки )
class B
{
const int constValue;
public:
B(int&);
};
B::B()
:constValue(33)
{}
в противном случае если вы попробете сделать это в теле конструктора — получите ошибку.
В данном случае случше лучше всего руководствоваться следующим примером
аналог инициализации в теле конструктора ( между {} )
int x;
x=5;
аналог инициализации списоком инициализации ( после :)
int x = 5;
именно поэтому для инициализации констант и ссылок в качестве полей класса подходит только список инициализации
класс Answer
1. передача параметра по указателю — так как вам на самом деле нужна простая копия — проще передавать по констатной ссылке
Answer(const QString& s)
Далее. Внутри класс QString — умный указатель. Это значит что расходы на копирование объектов малы. Так-что в принципе можно передавать его по значению.
Вы создали три конструктора, когда хватило бы одного.
Answer(const QString& a="", bool c=false);
Answer::Answer(const QString& a, bool c)
:correct©, text(a){}
методы isCorrect() и getText() не меняют состояние объекта а значит могут быть сделаны константными
bool isCorrect() const;
так как поля correct и text после конструктора нигде не меняются — их тоже можно объявить константыми в объявлении класса: const boo correct;
в целом это все недостаточное знание языка, что надеюсь у вас ненадолго =)