LINUX.ORG.RU
 

[C++][быдлокод] Помаленьку учу плюсы.


0

2

Собственно сабж. Потихоньку изучаю плюсы.
Кое что рабочее уже написал (на 150 строк :D)
Хотелось бы чтобы те, кто плюсы знают хорошо указали на какие-то ошибки и прочее. Как вообще правильнее всего написать что-то подобное.
В данный момент используется толко то, что доступно в рамках STL.

Собствено быдлокод: http://paste.pocoo.org/show/239314/


[#] Ответ на: комментарий от legolegs 19.07.2010 14:36:24  

С ассертами понятно. Надо будет в дальнейшем их использовать. Тут они ни к чему тогда - нужно проверять пользователя.

На сколько вот такая проверка вводимого пользователем значения правильна?

do
  {

...
	do
	{
	  cout << "Do you want to analyse another project? [Y/N]" << endl;
	  cin >> again;
	  switch (again) {
		case 'Y' :
		  error = false;
		  break;
		case 'N' :
		  error = false;
		  break;
		default :
		  error = true;
		  cout << "Sorry, i didn't understand the answer, please answer Y or N" << endl;
		  break;
	  }
	}
	while ( error == true );
  }
  while ( again == 'Y' );

** ()
[#] Ответ на: комментарий от CyberTribe 19.07.2010 15:12:27  
Zhbert

Пока вводится У все время будет спрашивать?

*** ()
[#] Ответ на: комментарий от Zhbert 19.07.2010 15:13:55  

Пока вводится Y он будет выполнять некоторые функции, которые я заменил на "..."
Там два "do while", из одного выход по error != true, из другого по again != Y

** ()
[#] Ответ на: комментарий от CyberTribe 19.07.2010 15:18:25  
Zhbert

>Там два "do while", из одного выход по error != true, из другого по again != Y

Вижу =) Ну тащемта правильно, я бы примерно так же сделал.

*** ()
[#]  
korvin_

стоит начать с чтения SICP

** ()
[#]  
SilentBob

Сейчас уже лучше, но надо учиться писать комментарии. Например:

// global vestors for now
// TODO:need to replace with iterators later, and make them private.
vector<long double> invest, revenue, d_invest, d_revenue, d_float, d_total, k_discont, k_infl;

лучше заменить на

// global vestors for now
// TODO:need to replace with iterators later, and make them private.

vector<long double> invest,  // description?
                    revenue, // desciprion?
...

// This function is used for data input, also it initializes the global vectors. Arguments are self descriptive.
void data_input ( int &length, long double &discont )

заменить на

/* This function is used for data input, also it initializes the global vectors.
parameters: none
output:
  <list of global variables, which will be changed by the function>
returns:
  length - description,
  discont - description
*/ 
void data_input ( int &length, long double &discont )

Инициализацию глобальных переменных (нужно ли их использовать - другой вопрос) лучше вынести в отдельную функцию, что-нибудь типа init_globals. В твоем случае их можно инициализировать на месте:

vector<long double> invest(1, 0.0)...
По возможности не нужно вносить в функцию действия, которые в ней не должны быть. Если она называется data_input, то пусть занимается получением входных данных. Вообще, избегай всего неявного. И делай проще настолько, насколько это возможно не в ущерб прочему.

Это замечания по стилю - это важно, просто и понятно написанные исходники в дальнейшем легче будет изменять как тебе, так и тем, кому они после тебя достанутся. Остальное тебе тут уже правильно посоветовали, из существенного - избегай глобальных переменных, магических чисел, всяческих непроверенных предположений.

Для c и тем более для c++ существует множество нюансов, со временем изучишь. Главное - выработать хороший стиль (это справедливо для любого языка).

()
[#]  
hibou

Нормально все, но зачем тебе плюсы если ты пишешь на них как на обычном си? Если взял С++, надо учиться мыслить объектами, классами.

***** ()
[#] Ответ на: комментарий от hibou 20.07.2010 14:19:16  
pathfinder

>Если взял С++, надо...

Не надо.

Возможностями языка надо пользоваться исходя из необходимости а не ради самого факта использования.

** ()
[#] Ответ на: комментарий от pathfinder 20.07.2010 17:56:38  
pathfinder

Меньше надо мыслить всякими "true way". Вместо слепой религии лучше четко понимать что ты делаешь и почему именно так надо делать.

** ()
[#] Ответ на: комментарий от CyberTribe 19.07.2010 13:36:40  
www_linux_org_ru

> Ругайте. А то как иначе научится писать правильно?

вообще ты взял себе слишком сложную задачу, возьми попроще

без классов этот код так и останется быдлокодом (примерно: сделать класс на каждую итерацию, внеся туда все, что зависит только от i, а что зависит еще от i-1 вынести в отдельный массив)

по комментариям: они одновременно избыточны и недостаточны; названия переменных надо сделать длинными, чтобы не повторять их в комментариях, и т.д.

**** ()
[#] Ответ на: комментарий от pathfinder 20.07.2010 18:00:11  
www_linux_org_ru

> Вместо слепой религии лучше четко понимать что ты делаешь и почему именно так надо делать.

у тебя есть предложения, как структурировать этот взрыв на макаронной фабрике, иначе чем через классы?

**** ()
[#] Ответ на: комментарий от www_linux_org_ru 20.07.2010 20:27:30  

Про классы я уже понял.
Как раз читаю про то, как их делать. Так что через несколько дней будет снова что ругать, но уже с выносом большей части кода в класс.
Касательно задачи - проще будет скучно.
Я скорее думаю, что ещё тут добавить в вычисления, чтобы было интересно.

По хорошему оно должно уметь читать и сохранять данные в файл (возможно xml-ка какая-нибудь для этого подойдёт. Выбирать из нескольких проектов, ещё и графики строить. Но это уже точно после выноса расчётного функционала в класс.

** ()
[#] Ответ на: комментарий от www_linux_org_ru 20.07.2010 20:27:30  

касательно названий переменных - для знающего терминологию они в основном достаточны (общепринятые аббревиатуры, например, к ним просто нужен комментарий. хотя кое что можно заменить, согласен).

** ()
[#] Ответ на: комментарий от www_linux_org_ru 20.07.2010 20:31:33  
pathfinder

>у тебя есть предложения, как структурировать этот взрыв на макаронной фабрике, иначе чем через классы?

Ты не понял. Как только возникает осознанная необходимость в использовании классов, то ими конечно надо пользоваться. Если такой необходимости нет, то можно писать на С++ в стиле обычного С. Я не вижу в этом ничего плохого. То же самое с шаблонами. Их не надо лепить на каждой странице кода. С последним кстати особенно любят злоупотреблять.

** ()
[#] Ответ на: комментарий от pathfinder 20.07.2010 20:46:44  

тут он прав. класс действительно будет нужен в будущем, ибо есть планы по усложнению функционала.
ну и потом (когда сами плюсы будут более менее понятны) можно будет к этому и gui приделать.

** ()
[#] Ответ на: комментарий от CyberTribe 20.07.2010 20:45:58  
www_linux_org_ru

> касательно названий переменных - для знающего терминологию они в основном достаточны

ЕСЛИ они достаточны,

ТО ТОГДА комментарии вида

// calculating the discounted cash flow without investment
d_float[i]=d_revenue[i] - d_invest[i];

являются мусором.

**** ()
[#] Ответ на: комментарий от CyberTribe 20.07.2010 20:51:38  
www_linux_org_ru

> класс действительно будет нужен в будущем, ибо есть планы по усложнению функционала

я говорю о текущей функциональности

**** ()
[#] Ответ на: комментарий от www_linux_org_ru 20.07.2010 21:03:50  

В случае с векторами я думаю что префиксы d перед названием, указывающие на то что это вектор данных после дисконтирования лучше вообще заменить на слово discount. По названиям векторов уже переделал чтобы были комментарии к каждому при объявлении.


Касательно класса - не всё сразу, я ещё только неделю как начал изучать плюсы.

** ()