Kiedy stosować procedury, a kiedy funkcje?

0

Kiedy w Pascalu stosujemy procedurę, a kiedy funkcję? Można stosować w każdym przypadku tylko jedno z nich?

Może mi ktoś wytłumaczyć jaka jest pomiędzy nimi różnica? Tu chodzi o to, że procedura to po prostu fragment kodu, którego nie zmieniamy w żaden sposób, a funkcję możemy w czasie działania programu zmienić? Do funkcji i procedury możemy przypisać parametry więc nie wiem czy rzeczywiście jest taka różnica jak myślę...
Najlepiej jakby ktoś pokazał to na jakimś prostym przykładzie, który pozwoliłby to zobrazować :)

P.S. Czytałem już o tym (chyba też na tej stronie), ale i tak nie jest to dla mnie do końca jasne.

0

Funkcja zwraca wartość.
To tak jak z umową o dzieło (funkcja) a umową-zlecenie (procedura).
Jedno jest nastawione na "wynik" a drugie na "czynność"

0

Można powiedzieć że procedura to odpowiednik dzisiejszych "void function".

3

@mj28u - procedura nie zwraca wartości, więc możesz ją stosować wszędzie tam, gdzie nie potrzebujesz sprawdzić jak poszło jej wywołanie; Przykładem jest procedura ClrScr - wywołujesz ją żeby wyczyścić ekran konsoli, ale nie potrzebujesz żadnych od niej informacji; Ona ma się wykonać i tyle;

Funkcje natomiast zwracają jakąś wartość, więc możesz ich używać wszędzie tam, gdzie potrzebujesz otrzymać od niej jakieś informacje; Zwracana przez funkcję informacja będzie wykorzystywana na zewnątrz ciała funkcji; Najczęstrzym błędem jest korzystanie jedynie z procedur zamiast funkcji, a zwracanie wyniku zastępowane jest stertą zmiennych globalnych; To jest zła praktyka, którą powinno się wybijać wszystkim z głów;

Przykładem funkcji jest KeyPressed - sprawdza ona, czy w buforze inputu znajduje się klawisz; Jeśli użytkownik wcisnął klawisz - zwraca True, w przeciwnym razie False; Czyli funkcja zwraca informację o tym, czy użytkownik coś wcisnął; Zwróconą informację możesz wykorzystać do konstrukcji dalszej części kodu; Jeśli klawisz został wciśnięty - obsługujemy go, a jeśli nie - robimy coś innego; Gdyby KeyPressed nie zwracała wyniku - nie wiedzielibyśmy nic o stanie bufora wejściowego i w rezultacie taka procedura była by bezużyteczna;

Funkcje nie są jedynymi blokami kodu, które mogą coś zwrócić na zewnątrz; Procedury także mogą pełnić funkcję funkcji, poprzez przyjmowanie parametrów przez referencję lub jako wskaźniki; Pomimo tego, że taka procedura nie będzie mogła zwrócić wartości przez rezultat, tak jak ma to miejsce w funkcjach, to modyfikacja wartości parametrów wpłynie na dane na zewnątrz niej;

Procedury przyjmujące parametry przez referencję przydają się w przypadku, gdy jedna procedura ma zmienić wartości kilku zmiennych, znajdujących się poza jej ciałem; Nie można by wtedy użyć funkcji, bo funkcje mogą zwrócić tylko jedną informację; Jeśli funkcja miałaby zwrócić kilka róznych wartości - musiałaby zwrócić np. rekord z kilkoma polami; Zastępując ją procedurą - wystarczy podać te kilka zmiennych w parametrach przez referencję, a wewnątrz niej tylko zmodyfikować ich wartości;


Procedury i funkcje wykorzystuje się w zależności od danej sytuacji - nie mają one dokładnego i ściśle zdefiniowanego przeznaczenia; To dość obszerny temat, więc zapoznaj się przede wszsytkim z budową ich ciał, a także ze sposobami przekazywania parametrów (jest ich cztery); Jeśli poznasz wszystkie aspekty związane z nimi, to sam będziesz wiedział gdzie czego używać.

0

Czyli tak: procedura to porostu fragment kodu wykonujący daną czynność, tak? A jeśli chodzi o funkcję to możemy wynik tej funkcji użyć np. w instrukcji warunkowej itp.?

1

Rozróżnienie jest tylko jedno:
Funkcja zwraca wartość.
Procedura nie zwraca wartości.

Przy czym zwrócenie wartości to znaczy, że wywołanie funkcji można wstawić dokładnie tam gdzie można wstawić wartość czy zmienną (oczywiście nie zawsze, ale jeśli coś będzie nie teges to kompilator rzuci błędem).

0

@mj28u - procedury i funkcje stosuje się po to, aby dany kod wydzielić z jego głównego ciała, zwiększając czytelność całości, albo po to, aby jeden blok kodu móc wykorzystać w programie wiele razy i w wielu jego miejscach - stosując zasadę DRY;

Ponadto, tak jak wspomniał @Wibowit - funkcję możesz wstawić w miejsce zmiennej lub literału bezpośrednio w warunku, jeśli tylko typy się zgadzają; Zobacz na poniższy przykład, który zwraca znak do wykorzystania w kodzie:

procedure NoSolution();
begin
  // ???
end;

procedure ReturnInRefParam(var AChar: AnsiChar);
begin
  AChar := ReadKey();
end;

function ReturnInResult(): AnsiChar;
begin
  Result := ReadKey();
end;

var
  chrFoo: AnsiChar;
begin
  // procedura NoSolution - brak rozwiązania, bo nijak
  // nie można zwrócić klawisza
  NoSolution();

  // procedura ReturnInRefParam
  ReturnInRefParam(chrFoo);

  if chrFoo = #13 then
  begin
    // tutaj obsługa wciśnięcia klawisza Enter
  end;

  // funkcja ReturnInResult - pierwsze rozwiązanie, ze zmienną
  chrFoo := ReturnInResult();

  if chrFoo = #13 then
  begin
    // tutaj obsługa wciśnięcia klawisza Enter
    // klawisz mamy zapamiętany w zmiennej, więc możemy go wykorzystać
    // w dalszej części kodu, już poza tym warunkiem
  end;

  // funkcja ReturnInResult - drugie rozwiązanie, bez zmiennej
  if ReturnInResult then
  begin
    // tutaj obsługa wciśnięcia klawisza Enter
  end;
end;

Procedura NoSolution nie daje możliwości zwrócenia klawisza, więc jeśli zmienna chrFoo nie będzie dla niej widoczna - nie będzie możliwości wpisania do niej pobranego klawisza;

Procedura ReturnInRefParam zwraca pobrany klawisz przez parametr, przekazany przez referencję; Wymaga zmiennej, do której wpisana zostanie wartość klawisza; Następnie zmienna ta wykorzystana jest w warunku sprawdzającym wartość klawisza;

Funkcja ReturnInResult zwraca pobrany klawisz przez jej rezultat, więc nie wymaga dodatkowej zmiennej; Można ją od razu wykorzystać w warunku; Tutaj są dwa rozwiązania - można skorzystać z dodatkowej zmiennej, lub nie; Jeśli wartość klawisza ma się przydać później - musimy ją zapisać w zmiennej, aby jej nie utracić; W powyższym przykładzie użycia funkcji, wartość klawisza nie jest nam później potrzebna, więc funkcję można wywołać w warunku; Jej rezultat zostanie przekazany do warunku i sprawdzony;

Jak widzisz jest kilka różnych sposobów na rozwiązanie danego algorytmu, ale trzeba wybrać taki, który nam pasuje i zapewnia poprawność działania kodu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1