Čistější zápis úseku kódu - nějaký návrh? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Čistější zápis úseku kódu - nějaký návrh? – C / C++ – Fórum – Programujte.comČistější zápis úseku kódu - nějaký návrh? – C / C++ – Fórum – Programujte.com

 

Anonym
~ Anonymní uživatel
454 příspěvků
10. 2. 2016   #1
-
0
-

Ahoj,

mohl by mi tu někdo pomoct s čistějším zápisem úseku kódu? Naimplementoval jsem zpoždovač, který má za úkol zpomalovat volání jedné metody. Funkčně vše funguje, ale kód mi přijde dost divně zapsaný. Proto se ptám - nešlo by to jinak? Samotná metoda zpoždovače:

bool zpozdovac(int nejaka_hodnota){
    
    if (spoustec == true)
    {
        // uloz casovy rozdil
        
        if (rozdilCasu > (nejaka_hodnota))
        {
            return true;
        }
    }
    else
        return false;
}

A metodu výše volám takto (a právě to volání stejné metody jak na true, tak na false mi přijde nevhodné):

    if (zpozdovac == true)
        // zavolej metodu ABCD()
    else
        // zavolej metodu ABCD()

V reálu mám zpoždovač implementovaný v separátní třídě, protože ho chci volat z více míst - proto poptřebuju, aby byl jako metoda.

Děkuji předem za návrhy na zlepšení.

Nahlásit jako SPAM
IP: 212.79.110.–
Kit+15
Guru
10. 2. 2016   #2
-
0
-

#1 Anonym
Zcela bezúčelně si tam hraješ s typem boolean. Po odstranění těchto nesmyslů zbude:

void zpozdovac(int delay) {
    // uloz casovy rozdil
}

zpozdovac(42);
// zavolej metodu ABCD()
Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Anonym
~ Anonymní uživatel
454 příspěvků
10. 2. 2016   #3
-
0
-

#2 Kit
No ale jak to pak tu metodu ABCD zpomalí, když metoda zpozdovac nemá žádnou návratovou hodnotu?

Nahlásit jako SPAM
IP: 212.79.110.–
Kit+15
Guru
10. 2. 2016   #4
-
0
-

#3 Anonym
Ten tvůj program to také nedělá. Pouze jsem odstranil části kódu, které neměly žádný vliv na funkčnost.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Anonym
~ Anonymní uživatel
454 příspěvků
10. 2. 2016   #5
-
0
-

#4 Kit
Jo už mi to došlo, děkuju za pomoc.

Nahlásit jako SPAM
IP: 212.79.110.–
Kit+15
Guru
10. 2. 2016   #6
-
0
-

#5 Anonym
Není zač.

Velmi často se mi stává, že když odstraním z programu proměnné typu boolean, tak to na funkčnost nemá žádný vliv. Proto jsem je úplně přestal používat - programy jsou pak mnohem kratší a přehlednější. Také odpadne hromada ifů a zpravidla zmizí všechny else.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4014 příspěvků
11. 2. 2016   #7
-
0
-

Pokud se ma nejaky if opakovat v cyklu nekolikrat, je dobre zvazit, jestli by neslo priradit primo funkci promenne. V JS by to vypadalo asi takhle. V cpp bohuzel nevim, jak se to pise.

<script>
function a() {alert(123);}
function b() {alert(456);}
var func = neco==true ? window.a : window.b;
func();
</script>
Nahlásit jako SPAM
IP: 2001:718:2601:26c:c576:af...–
JoDiK
~ Anonymní uživatel
987 příspěvků
11. 2. 2016   #8
-
0
-

#7 peter
Když už jsme u těch zbytečností...

Proč psat:

var func = neco==true ? window.a : window.b;


když přece stačí psat: 

var func = neco ? window.a : window.b;
Nahlásit jako SPAM
IP: 88.103.236.–
Kit+15
Guru
11. 2. 2016   #9
-
0
-

#8 JoDiK
V principu máš pravdu, od toho ty boolean jsou, abys je jako boolean používal.

Na druhou stranu i ta proměnná "neco" bývá často zbytečná a je dobré zapátrat, proč vůbec vznikla.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4014 příspěvků
11. 2. 2016   #10
-
0
-

JoDiK - Je spravne, pri testovani uvadet s cim to porovnavas. Je to dulezite pro prehlednost pro dalsiho programatora. Ze to funguje bez toho je jina vec. Az budes cist cizi kod, jiste budes rad, kdyz odlisis integer od booleanu prave takovouto malickosti.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:c576:af...–
Kit+15
Guru
11. 2. 2016   #11
-
0
-

#10 peter
Integer od booleanu rozpoznáš i podle zápisu.

Jinak používání proměnných typu boolean dnes již postrádá na významu.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
JoDiK
~ Anonymní uživatel
987 příspěvků
11. 2. 2016   #12
-
0
-

#10 peter
Pro přehlednost pro dalšího programátora je nejdůležitější vhodný název + komentáře.

Příklad: klasické bublinkové třídění (pascalu rozumí všichni...)

  i:=N;
  repeat
    dec(i); vymena:=false;
    for j:=1 to i do
      if pole[j]>pole[j+1] then
        begin
          pom:=pole[j];
          pole[j]:=pole[j+1];
          pole[j+1]:=pom;
          vymena:=true;
        end;
  until not vymena or (i=1);


podle mně je to naprosto srozumitelné a je to lépe čitelné než třeba

 until (vymena=false) or (i=1);

Jak tohle udělat bez booleanu? Otázka pro Kita...

Nahlásit jako SPAM
IP: 88.103.228.–
Kit+15
Guru
11. 2. 2016   #13
-
0
-

#12 JoDiK
Místo boolean použiješ integer, do kterého dáš index poslední výměny. Další průběh cyklem se tím příjemně zkrátí, neboť nemusíš testovat až do konce řádku ale pouze po ten index. Místo dec(i) je tedy vymena-1. V extrémním případě cyklus proběhne pouze 1×.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
JoDiK
~ Anonymní uživatel
987 příspěvků
11. 2. 2016   #14
-
0
-

#13 Kit
Moc jsem to nepochopil, zkusíš to napsat kódem?

Nahlásit jako SPAM
IP: 88.103.228.–
Kit+15
Guru
11. 2. 2016   #15
-
0
-

#14 JoDiK
Kompilovat jsem to nezkoušel, ale snad je to OK: 

last:=N;
repeat
    i:=last-1;
    last:=0;
    for j:=1 to i do begin
        if pole[j]>pole[j+1] then begin
            pom:=pole[j];
            pole[j]:=pole[j+1];
            pole[j+1]:=pom;
            last:=j;
        end;
    end;
until last=0;
Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Anonym
~ Anonymní uživatel
454 příspěvků
11. 2. 2016   #16
-
0
-

Měl bych stejný dotaz na toto téma. Jak "zjednosušit" kód níže - jedná se o v podstatě totožný princip jako v úvodu?

 Třída XYZ, kde se v nějaké metodě volá metoda start():

if (Tools::getScale(scale, &timeA, factor) == 1)
	Processing::start();        
else
	Processing::start(); 

Třída Tools, kde je implementace metody getScale():

int Tools::getScale(int scale, int *timeA, int factor)
{
	int timeS = 0;
	int timeB = Tools::getTime();

	timeS = timeB - *timeA;

	if (timeS > (scale * factor))
	{
		*timeA = timeB;
		return 1;
	}
	else
	{
		return 2;
	}
}

Lze to zapsat lépe?

Nahlásit jako SPAM
IP: 212.79.110.–
Kit+15
Guru
11. 2. 2016   #17
-
0
-

#16 Anonym
Místo toho prvního stačí jen 

Tools::getScale(scale, &timeA, factor);
Processing::start();        

ale to platí jen za předpokladu, že metoda getScale() má postranní efekty - tahle je má. V opačném případě by první řádek byl zcela zbytečný.

 Ten druhý kód se dá také zjednodušit, protože návratovou hodnotu evidentně nepotřebuješ:

void Tools::getScale(int scale, int *timeA, int factor) {
    int timeB = Tools::getTime();
    int timeS = timeB - *timeA;
    if (timeS > (scale * factor)) {
        *timeA = timeB;
    }
}

V příkladu je ještě prostor pro další zjednodušení - z metody getScale() opět udělat funkci. Tím odpadne potřeba parametru předávaného odkazem. O tom třeba zase příště.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
11. 2. 2016   #18
-
0
-

#16 Anonym
Když už jsem nakousl to lepší řešení, tak nejprve volání: 

timeA = Tools::getScale(scale, timeA, factor);
Processing::start();

a teď ta metoda: 

int Tools::getScale(int scale, int timeA, int factor) {
    int timeB = Tools::getTime();
    int timeS = timeB - timeA;
    if (timeS > (scale * factor)) {
        return timeB;
    }
    return timeA;
}

Tohle řešení je sice o jeden řádek delší, ale zato je robustnější a znovupoužitelnější. Také je v souladu s praktikami OOP - tedy až na statické volání metody, kterému je obvykle lepší se vyhnout. Všimni si, že zmizely hvězdičky u parametru timeA.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 56 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý