Помощь в оптимизации кода

denysKo_O
Offline
Зарегистрирован: 07.01.2017

Добрый день. в програмировании не очень силен, но случилось так что нужно написать софт
общая суть:
имеем 4 переменных, для которых есть верхняя и нижняя граница,  которые нужно регулировать кнопками, три кнопки: переключение между параметрами, кнопка +, кнопка -
сейчас для каждой кнопки написан такой код на настройку нижней граници: 

void minimumA()
{
  if (key == 1)
  {
    if (millis() - previousMillis > 500)
    {
      previousMillis = millis();
      minA = minA - 0.1;
    }
  }
  if (key == 2)
  {
    if (millis() - previousMillis > 500)
    {
      previousMillis = millis();
      minA = minA + 0.1;
    }
  }
  if (minA > max)
  {
    minA = max;
  }
  if (minA < min)
  {
    minA = min;
  }
}

и такой на настройку верхней граници:
 

void maximumA()// процедура перемещения по меню
{
  if (key == 1)
  {
    if (millis() - previousMillis > 500)
    {
      previousMillis = millis();
      maxA = maxA - 0.1;
    }
  }
  if (key == 2)
  {
    if (millis() - previousMillis > 500)
    {
      previousMillis = millis();
      maxA = maxA + 0.1;
    }
  }
  if (maxA > max)
  {
    maxA = max;
  }
  if (maxA < min)
  {
    maxA = min;
  }
}

Аналогично есть процедуры для B,C,D, тоесть еще 6 аналогичных процедур.
Интересует возможно ли это реализовать в 1-2 процедуры средствами ООП?
дописал остальной функционал проэкта, и не хватает памяти на ардуино нано 328р, а другую ардуинку не могу использовать...
помогите советом пожалуйста. Заранее спасибо

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Можно, конечно, и средствами ООП, но первое, что напрашивается, - это если передавать процедуре параметры, достаточно и ее одной.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Подожди Пуха, у него классов как авна за баней. Мошт и такие есть. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

Подожди Пуха, у него классов как авна за баней. Мошт и такие есть. 

Обижаешь, "мошт есть". Точно есть, без всяких там мошт :)

denysKo_O
Offline
Зарегистрирован: 07.01.2017

andriano пишет:

Можно, конечно, и средствами ООП, но первое, что напрашивается, - это если передавать процедуре параметры, достаточно и ее одной.

 

увы, но не так(
остальные процедуры реализованы аналогично,вот пример по переменной В
 

void minimumB()// процедура перемещения по меню
{
  if (key == 1)
  {
    if (millis() - previousMillis > 500)
    {
      previousMillis = millis();
      minB = minB - 0.1;
    }
  }
  if (key == 2)
  {
    if (millis() - previousMillis > 500)
    {
      previousMillis = millis();
      minB = minB + 0.1;
    }
  }
  if (minB > max)
  {
    minB = max;
  }
  if (minB < min)
  {
    minB = min;
  }
}

void maximumB()// процедура перемещения по меню
{
  if (key == 1)
  {
    if (millis() - previousMillis > 500)
    {
      previousMillis = millis();
      maxB = maxB  - 0.1;
    }
  }
  if (key == 2)
  {
    if (millis() - previousMillis > 500)
    {
      previousMillis = millis();
      maxB  = maxB + 0.1;
    }
  }
  if (maxB  > max)
  {
    maxB  = max;
  }
  if (maxB < min)
  {
    maxB = min;
  }
}

 

denysKo_O
Offline
Зарегистрирован: 07.01.2017

DetSimen пишет:

Подожди Пуха, у него классов как авна за баней. Мошт и такие есть. 

вот тут в точку))
пытался сделать все универсально, но не все получилось реализовать....

b707
Offline
Зарегистрирован: 26.05.2017

denysKo_O пишет:

 

увы, но не так(
остальные процедуры реализованы аналогично,вот пример по переменной В

Что "увы" ? Вы вообще поняли, что Вам посветовали? вынесите переменную minb в параметр - и запросто сможете заменить все восемь функций на одну

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

да няхай

struct TMinMaxValue {
private:
	float fvalue;
	float fstep;

public:
	float Min;
	float Max;


	TMinMaxValue() :TMinMaxValue(0.0, 0.1) {};
	TMinMaxValue(float avalue, float astep, float AMin = 0.0, float AMax=0.0) {
		fvalue = avalue;
		fstep = astep;

		if (AMin <= AMax) {
			Min = AMin;
			Max = AMax;
		} else {
			Min = AMax;
			Max = AMin;
		}
	}

	inline void SetStep(float astep) { fstep = astep; };

	inline float GetValue(void) const { return fvalue; };

	float StepDown() {
		fvalue -= fstep;
		if (fvalue < Min) fvalue = Min;
		return fvalue;
	}

	float StepUp() {
		fvalue += fstep;
		if (fvalue > Max) fvalue = Max;
		return fvalue;
	}


};

TMinMaxValue A(0.0, 0.1, 0.0, 100.0);

TMinMaxValue B(0.0, 0.1, 0.0, 200.0);

TMinMaxValue C(0.0, 0.1, 0.0, 300.0);

TMinMaxValue D(0.0, 0.1, 0.0, 400.0);

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Потом if (key==1) A.StepDown(); else A.StepUp();

гарантированно A.fvalue за Min & Max не вывалятся.  (ну если только я не ошибся нигде спахмелья);

а можно еще апираторы перегрузить, будет изящнее.  Но мне лень. 

sadman41
Offline
Зарегистрирован: 19.10.2016

А истинные паскалисты Min и Max не должны прятать в private section?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

А истинные паскалисты Min и Max не должны прятать в private section?

с точки зренья ООП - должны.  Но get/set еще писать мне лень. Пусь ТС дорабатывает, направление я дал, раз Пух молчит. 

Но, думаю, у него с классами это не только в память не влезет, но еще и кристалл растрескает. 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

А истинные паскалисты Min и Max не должны прятать в private section?

А хто такие "истинные паскалисты"? Давно известно, что "настоящие программисты не используют Паскаль". Его используют сосунки. А "кому какое что" до того, кому и что должны сосунки?

sadman41
Offline
Зарегистрирован: 19.10.2016

ну, это которые setЧТО-ТО / getЧТО-ТО пишут, полагаю. В тех немногих ЯП, с которыми я сталкивался, только в Паскакале такой синтаксис/способ протекции насаждался.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

sadman41 пишет:

ну, это которые setЧТО-ТО / getЧТО-ТО пишут, полагаю. В тех немногих ЯП, с которыми я сталкивался, только в Паскакале такой синтаксис/способ протекции насаждался.

в Паскале свойства есть, а туть всё ручками. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

ну, это которые setЧТО-ТО / getЧТО-ТО пишут, полагаю. В тех немногих ЯП, с которыми я сталкивался, только в Паскакале такой синтаксис/способ протекции насаждался.

Та, нет, что Вы, акцессоры много где есть (тот же JS - да много где). Да и для С++ масса библиотек шаблонов, где это реализуется.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

denysKo_O пишет:

DetSimen пишет:

Подожди Пуха, у него классов как авна за баней. Мошт и такие есть. 

вот тут в точку))
пытался сделать все универсально, но не все получилось реализовать....

Ну если интересует г**о за баней то сюда #248   А вообще лучше начинать с автоматов и оперативного управления ими. А потом искать как реализовать меню

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

denysKo_O пишет:

Аналогично есть процедуры для B,C,D, тоесть еще 6 аналогичных процедур.
Интересует возможно ли это реализовать в 1-2 процедуры средствами ООП?

Это можно сделать и без средств ООП, простой декомпозицией, например:

void minimumSome(uint8_t key1, uint8_t key2,  uint32_t interval, int32_t minVal, int32_t maxVal, uint32_t& previousMillis, int32_t& outVal)
{
  if (key == key1)
  {
    if (millis() - previousMillis > interval)
    {
      previousMillis = millis();
      outVal = outVal - 0.1;
    }
  }
  if (key == key2)
  {
    if (millis() - previousMillis > interval)
    {
      previousMillis = millis();
      outVal = outVal + 0.1;
    }
  }
  if (outVal > maxVal)
  {
    outVal = maxVal;
  }
  if (outVal < minVal)
  {
    outVal = minVal;
  }
}
Вызывается так:
 
minimumSome(1,2,500,min,max,previousMillisA,minA);
minimumSome(3,4,500,min,max,previousMillisB,minB);

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