Помощь в оптимизации кода
- Войдите на сайт для отправки комментариев
Пт, 07/09/2018 - 05:24
Добрый день. в програмировании не очень силен, но случилось так что нужно написать софт
общая суть:
имеем 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р, а другую ардуинку не могу использовать...
помогите советом пожалуйста. Заранее спасибо
Можно, конечно, и средствами ООП, но первое, что напрашивается, - это если передавать процедуре параметры, достаточно и ее одной.
Подожди Пуха, у него классов как авна за баней. Мошт и такие есть.
Подожди Пуха, у него классов как авна за баней. Мошт и такие есть.
Обижаешь, "мошт есть". Точно есть, без всяких там мошт :)
Можно, конечно, и средствами ООП, но первое, что напрашивается, - это если передавать процедуре параметры, достаточно и ее одной.
увы, но не так(
остальные процедуры реализованы аналогично,вот пример по переменной В
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; } }Подожди Пуха, у него классов как авна за баней. Мошт и такие есть.
вот тут в точку))
пытался сделать все универсально, но не все получилось реализовать....
увы, но не так(
остальные процедуры реализованы аналогично,вот пример по переменной В
Что "увы" ? Вы вообще поняли, что Вам посветовали? вынесите переменную minb в параметр - и запросто сможете заменить все восемь функций на одну
да няхай
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);
Потом if (key==1) A.StepDown(); else A.StepUp();
гарантированно A.fvalue за Min & Max не вывалятся. (ну если только я не ошибся нигде спахмелья);
а можно еще апираторы перегрузить, будет изящнее. Но мне лень.
А истинные паскалисты Min и Max не должны прятать в private section?
А истинные паскалисты Min и Max не должны прятать в private section?
с точки зренья ООП - должны. Но get/set еще писать мне лень. Пусь ТС дорабатывает, направление я дал, раз Пух молчит.
Но, думаю, у него с классами это не только в память не влезет, но еще и кристалл растрескает.
А истинные паскалисты Min и Max не должны прятать в private section?
А хто такие "истинные паскалисты"? Давно известно, что "настоящие программисты не используют Паскаль". Его используют сосунки. А "кому какое что" до того, кому и что должны сосунки?
ну, это которые setЧТО-ТО / getЧТО-ТО пишут, полагаю. В тех немногих ЯП, с которыми я сталкивался, только в Паскакале такой синтаксис/способ протекции насаждался.
ну, это которые setЧТО-ТО / getЧТО-ТО пишут, полагаю. В тех немногих ЯП, с которыми я сталкивался, только в Паскакале такой синтаксис/способ протекции насаждался.
в Паскале свойства есть, а туть всё ручками.
ну, это которые setЧТО-ТО / getЧТО-ТО пишут, полагаю. В тех немногих ЯП, с которыми я сталкивался, только в Паскакале такой синтаксис/способ протекции насаждался.
Та, нет, что Вы, акцессоры много где есть (тот же JS - да много где). Да и для С++ масса библиотек шаблонов, где это реализуется.
Подожди Пуха, у него классов как авна за баней. Мошт и такие есть.
вот тут в точку))
пытался сделать все универсально, но не все получилось реализовать....
Аналогично есть процедуры для 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; } }Как видишь - можно одной функцией однотипный код использовать повторно. Мой пример, конечно, сильно в лоб, и служит только для демонстрации подхода к декомпозиции (сиречь - отделения мух от котлет, т.е. - отделения алгоритма работы с данными от конкретных данных).