Základy slušného chování - procedury a jejich parametry – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Základy slušného chování - procedury a jejich parametry – Pascal – Fórum – Programujte.comZáklady slušného chování - procedury a jejich parametry – Pascal – Fórum – Programujte.com

 

Jeyekomon0
Stálý člen
10. 3. 2009   #1
-
0
-

Zdravím, narazil jsem na takový asi spíše filosofický problém.
Nejprve argumenty:

PROGRAM 1:

program procedura;

var hodnota: integer;

procedure vypis(interni: integer);
begin
writeln(interni);
end;

begin
hodnota := 42;
vypis(hodnota);
readln;
end.

PROGRAM 2:
program procedura;

var hodnota: integer;

procedure vypis;
begin
writeln(hodnota);
end;

begin
hodnota := 42;
vypis;
readln;
end.

Tak. Oba programy jsou plně "funkční" a dělají to stejné.
Mě by ale zajímalo dovědět se, jak to je s programátorskými dobrými mravy - příjde mi, že v druhém příkladu si procedura poměrně skrytě šahá pro proměnnou mimo své tělo, což by u věších programů mohlo dělat zmatek.
Zase ta první verze bude u větších programů mít obrovskou spoustu parametrů..
Asi jsem tedy úplně nepochopil myšlenku parametrů, tak pokud o tom máte někdo lepší představu.. ??
Dík.

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
TooM70
Newbie
10. 3. 2009   #2
-
0
-

urcite prvni zpusob, k tomu parametry funkce slouzi...druhy zpusob vubec nepouzivat, vede k absolutne neprehlednemu kodu...

Nahlásit jako SPAM
IP: 147.229.200.–
KIIV
~ Moderátor
+43
God of flame
10. 3. 2009   #3
-
0
-

a co kdyby si delal nejakou knihovnu pro sebe... a ted bys v ni pouzil globalni promenne...
1. jak bys vedel jake promenne nadefinovat a co do nich nastavit pred zavolanim nejake funkce nebo procedury
2. jak bys to zdokumentoval?
3. globalni promenne snad ani v unitach videt nejsou :D
4. proc delat nejakou funkci s tisicem parametru? vetsinou vystacis s pomerne rozumnym poctem...

- kazdopadne kdyz predavas parametry obvykle hned vidis s cim se vlastne ve funkci pracuje..
- co kdyz budes chtit stejnou funkci zpracovavat desitky struktur.. vzdy bys musel tu kterou chces dat do globalni promenne
a pak az ji zpracovat..

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Mircosoft+1
Věrný člen
10. 3. 2009   #4
-
0
-

To Jeyekomon : S tím, že skryté sahání do globálních proměnných může dělat zmatky, máš naprostou pravdu a vlastně sis tím rovnou i odpověděl :-).
Parametry použiješ tam, kde potřebuješ volat jednu proceduru s různými vstupními daty, která se často mění, a především z různých míst (třeba když je procedura v jednotce, kterou používají různé programy, a se všemi musí fungovat). Výhodou je taky to, že v okamžiku, kdy píšeš volací příkaz, máš všechny vstupy hezky před očima na jednom řádku. Kdybys to dělal přes globální proměnné, musel by sis pamatovat, jak jsi je před voláním procedury nastavil (což může být někdy docela problém dohledat a nesplést se).
Globální proměnné jsou výhodnější pro vstupy, které se mění jenom občas, kde by bylo vypisování parametrů výrazně nepohodlné nebo tam, kde to prostě jinak nejde. Třeba když píšeš program na obsluhu nějaké databáze, která se nikde mimo ten program nevyskytuje a existuje jenom v jedné instanci, je zbytečné psát pro to obecné procedury, kterým by se ta databáze předávala jako parametr. Ale třeba nějaké pomocné procedurky pro manipulaci s jejími jednotlivými prvky je výhodnější dělat parametrově, aby se daly jednodušeji směrovat na cíle (globální proměnné ve stylu aktualne_vybrany_prvek věci hrozně komplikují).

Příklad, kdy je pohodlnější použít parametry než globální proměnné:

setcolor(barva);

line(100,100,200,200);
setcolor(jinabarva);
line(10,300,40,300);
vs.
line2(100,100,200,200,barva);

line2(10,300,40,300,jinabarva);


A jeden příklad, kdy je naopak výhodnější použít globální proměnné:
napis(100,100,barva,font,zarovnani_vlevo,velikost_pisma,'Bla bla bla');

napis(100,110,barva,font,zarovnani_vlevo,velikost_pisma,'a tak dale');
napis(100,120,barva,font,zarovnani_vlevo,velikost_pisma,'jeste neco');
...
vs.
NastavParametryTextu(font,zarovnani_vlevo,velikost_pisma);

napis2(100,100,barva,'Bla bla bla');
napis2(100,110,barva,'a tak dale');
napis2(100,120,barva,'jeste neco');
...


Obecně se dá říct, že s parametry je to prakticky ve všech případech přehlednější. Ale nedá se obecně říct, co je lepší. Musí se zvolit nějaký vhodný kompromis mezi opakovaným vypisováním parametrů a staráním se o globální hodnoty.

Nahlásit jako SPAM
IP: 86.49.83.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Wimby
~ Anonymní uživatel
50 příspěvků
19. 3. 2009   #5
-
0
-

K pochopení co je kdy lepší použít, je nutné vědět, jak s tím naloží překladač.
Když budu mít parametr, který se nevejde do registru procesoru, a budu ho chtít jenom číst, jako třeba nějaký velký pole, tak mi přijde lepší ho načítat jako globální proměnnou, protože se pak obejdu zbytečnému kopírování.

Takže:

write('ahoj světe')
, je pomalejší než:
napis := 'ahoj světe'; write(@napis)
protože v prvním případu se celé pole (256B) zkopíruje jako parametr a pak vypíše, kdežto ve druhém případu se vypisuje rovnou z paměti a ušetří se krok kopírování. Pokud bych však chtěl pole uvnitř funkce nějak upravit, ale aby to nemělo vliv na proměnnou "napis", tak by bylo rychlejší použít celý řetězec jako parametr.

Stejně tak když deklaruju lokální promennou, tak:
procedure foo;

var
neco : integer;
pole : array[0..49000] of integer;
begin
{ přístup k proměnné "neco" bude pomalejší než když budu deklarovat dříve to pole a neco až jako poslední }
end;


U globálních promenných toto neplatí, tam je přístup ke všem promenným v konstantním čase.
Čili v obou případech, jak už tady zaznělo, záleží na okolnostech. Ale globální promenné nemají za úkol znepřehlednění kódu, stejně tak jako ho můžou znepřehlenit, tak ho můžou i zpřehlednit!

A nebo jdou použít objekty:
TFont = object

private
Font : Pismo;
BarvaTextu : Barva;
Velikost : Body;
public
procedure NastavFont(font,barva,velikost);
procedure NapisText(text);
end;

Nahlásit jako SPAM
IP: 83.208.196.–
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, 4 hosté

Podobná vlákna

Základy v PHP — založil Anonym

Zaklady prace s triedami — založil Dodo

Základy programování v Javě — založil RastyAmateur

Zaklady umele inteligence — založil Yurda

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ý