Napisałem coś w stylu "dynamicznych stałych"
W programie miałem enum z listą kilkudziesięciu "stałych", mój problem polegał na tym, że "stałe" te zmieniały swoje wartości w zależności od wersji odczytywanego przez program pliku.
Wymyśliłem pewne rozwiązanie:
Zadeklarowałem pewną klasę, klasa ta obsługuje operator konwersji na typ int
czyli można zrobić coś takiego:
int wartoscStalej = DynamicConstant(DynamicConstant::Constant1);
Tworzy się obiekt i automatycznie wywołuję się operator konwersji, który odwala całą robotę i generuję wartośc "stałej" w zależności od wersji pliku na którym program ten operuje.
W operatorze konwersji na int jest cos takiego:
switch(constant)
{
case Constant1:
switch(plik->getVersion() >= 20)
return 0x0100;
else return 0x150;
break;
case Constant2:
switch(plik->getVersion() >= 30)
return 0x0140;
else return 0x170;
break;
case Constant3:
switch(plik->getVersion() >= 20)
return 0x030;
else return 0x00; // w takich wersjach pliku nie ma takiej stałej
break;
}
Niby jest wszystko ok, problem w tym, że tych dynamicznych stałych czasami używam kilka w jednej linijce, co dość mocno psuje przejrzystość mojego kodu : P
Gdyby nie mieć obowiązku używania operatora zasięgu było by znacznie przejrzyściej, mógłbym zlikwidować tę przestrzeń nazw, ale jest jeden problem, do jakiegoś czasu te "dynamiczne stałe" były naprawdę stałe. tzn.
nie sprawdzałem wersji pliku i nie generowałem nowych wartości, tylko miałem zwykłą listę z enum z ich wartościami, używałem do tego czasu po prostu ich nazw np .
int wartoscStalej = Constant1
Aktualnie gdybym napisal takie cos jak kod powyzej to takie cos by sie skompilowalo i skonczylo dla mnie błedem niewidocznym, strasznym, trudnym do wykrycia, nie poprawna by byla wartosc stałej, dlatego wprowadzilem wlasnie przestrzen nazw, wtedy widzę DynamicConstant:: i automatycznie wiem ze nie jest to zwykla stala i moze byc uzyta tylko w parametrze konstruktora klasy DynamicConstant jako pomocnik do wygenerowania wartosci w switch
Gdyby dalo sie jakos sprawic ze danego enum mozna uzyc w konstruktorze do DynamicConstant to by ok :)
Pozdrawiam