LINUX.ORG.RU

[C++],[быдлокод] Помаленьку учу плюсы (часть 2 из много)

 ,


0

1

Я периодически буду тут на форуме задавать вопросы или обращаться с просьбой к уважаемому комьюнити.
Собственно, в очередной раз обращаюсь с просьбой:
Раскритиковать, сказать в чём улучшить, что не следует делать и что следует делать.
Постарался разобраться с классами, хотя многое пока всё равно не до конца понятно. Если есть улучшения по сравнению с предыдущим топиком - скажите, буду рад это слышать.

main.cpp
basic_invest.h

Сразу вопрос, который и так возник: стоит ли разные классы выделять в разные заголовочные файлы, естественно в случае более крупного проекта. Правильно понимаю, что их стоит разбивать про принципу функционала и того, в каких .cpp файлах они используются/не используются?

В общем - ругайте. Это полезно)

Ответ на: комментарий от Dendy

> А тут автор сам просит критики и реагирует на неё адекватно.

Он *не* реагирует.

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

К сожалению — его место чистить сортиры.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

>В прошлый раз, когда из его лапши хоть что-то можно было понять, я ему сказал, как примерно раскинуть его код по классам

можно ссылку где было это?

CyberTribe ★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

Нашёл:

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


Можно подробней немного?

CyberTribe ★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

Относительно того, что есть сейчас - понятно, что это совсем не то, чего хотелось бы получить в итоге.

Раздумываю относительно более удобной структуры. Что-то в духе:

#include <vector>

/*
 * the main class, containing the whole project. Is anything needed here at all?
 */
class project {
  
};

/*
 * class, containing basic data for the project.
 */

class data: public project {
  std::vector <long double> cf_invest;
  std::vector <long double> cf_revenue;
  int length;
  double percent;
public:
  data (); // data input
  long double invest_out (int step);
  long double revenue_out (int step);
  int length_out ();
  double percent_out ();
};

/*
 * class, containing middle calculations
 */

class calculations: public project {
  std::vector <long double> k_discont;
  std::vector <long double> k_inflate;
  std::vector <long double> discont_cf_invest;
  std::vector <long double> discont_cf_revenue;
  std::vector <long double> inflate_cf_revenue;
  std::vector <long double> cf_total;
  std::vector <long double> cf_accumulate;
public:
  calculations (data input_data);
  long double k_discont_out (int step);
  long double k_inflate_out (int step);
  long double discont_cf_invest_out (int step);
  long double discont_cf_revenue_out (int step);
  long double inflate_cf_revenue_out (int step);
  long double cf_total_out (int step);
  long double cf_accumulate_out (int step);
};

/*
 * Class that outputs important project's characteristicks
 */

class output: public project {
  long double profit_index (data input_data, calculations calc_data);
  long double npv (data input_data, calculations calc_data);
  float profit_period (data input_data, calculations calc_data);
  long double ea_calc (data input_data, calculations calc_data);
  long double mirr_calc (data input_data, calculations calc_data);
  long double irr_calc (data input_data, calculations calc_data);
};

Не уверен, что есть необходимость делать более мелкое дробление, так как в функциях будет мало общего кода.

CyberTribe ★★
() автор топика
Ответ на: комментарий от CyberTribe

еще проще вариант:

/// все одногодовые показатели, что спрашиваются у юзера
class UserInput {
public:
  UserInput() { std::cin >> ...... }
  const double foo;
  const double bar;
};

class YearIndicators { 
public:
  YearIndicators(UserInput user_input, YearIndicators previous_year) {...}
  const double k_discont; 
  const double k_inflate; 
  const double discont_cf_invest; 
  const double discont_cf_revenue; 
  const double inflate_cf_revenue; 
  const double cf_total; 
  const double cf_accumulate;
};

все что не влезет в эту простую схему (IRR approximation?), попытаться тоже упростить, но пока выбросить

да, и сделать перемнным нормальные несокращенные названия — всем похрен, что «тем кто в теме они ясны».

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

По названиям переменных - уж больно длинными они выйдут, но в принципе не суть важно.

по варианту пара вопросов сразу:
предлагается классовые переменные делать публичными?
И не понятно почему используется const там.

В принципе вариант простой, но при добавлении расчёта IRR придётся полностью переделывать. Впрочем, лучше медленно но правильно.

CyberTribe ★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

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

CyberTribe ★★
() автор топика
Ответ на: комментарий от www_linux_org_ru

понятно, что полей в классе м.б. больше, но никаких xxx_calc()

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от CyberTribe

постучался к тебе в fedor.duhovskoy@gmail.com

но учти — помогать буду очень краткими репликами

(а сегодня я скоро спать лягу)

www_linux_org_ru ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.