| Termin | Definicja |
|---|---|
| Parametry wyjściowe | Parametry wyjściowe to zmienne, przez które procedura zwraca wynik do kodu wywołującego. Parametry wyjściowe jako sposób przekazywania wynikuParametry wyjściowe to elementy deklaracji procedury lub funkcji, które umożliwiają przekazanie wartości z wykonanej operacji do miejsca, z którego została ona uruchomiona. Zamiast ograniczać rezultat do wartości zwracanej pojedynczym poleceniem, procedura może zmienić zawartość specjalnie oznaczonej zmiennej należącej do kodu wywołującego. Dzięki temu jeden fragment programu może przekazać kilka niezależnych informacji, na przykład kod zakończenia, obliczoną wartość, opis błędu albo informację o liczbie przetworzonych elementów. W praktyce parametr wyjściowy jest ustalany w nagłówku procedury, a następnie otrzymuje wartość w jej wnętrzu. Po zakończeniu działania procedury zmiana jest dostępna poza jej zakresem, zgodnie z regułami konkretnego języka programowania. Istotne jest odróżnienie parametru wyjściowego od zwykłego argumentu wejściowego. Argument wejściowy dostarcza danych potrzebnych do wykonania obliczeń, natomiast parametr wyjściowy służy przede wszystkim do przekazania rezultatu. W wielu rozwiązaniach występuje także wariant wejściowo-wyjściowy, którego początkowa wartość ma znaczenie dla procedury, a po jej zakończeniu może zostać zmieniona. Takie rozwiązanie bywa użyteczne w kodzie obsługującym diagnostykę komputera, analizę plików, komunikację z urządzeniem lub przetwarzanie danych pobieranych z formularza. Procedura może przyjąć dane do sprawdzenia, a następnie przekazać osobno wynik operacji i dodatkowe informacje opisujące jej przebieg. Parametry wyjściowe nie są więc jedynie składnią konkretnego języka. Stanowią model komunikacji pomiędzy dwoma fragmentami programu. Parametry wyjściowe a wartość zwracana i wynik wieloelementowyNajczęściej porównuje się parametry wyjściowe z instrukcją zwracającą wynik. Wartość zwracana przez funkcję jest zazwyczaj naturalnym wyborem wtedy, gdy operacja ma jeden główny rezultat. Przykładowo funkcja może obliczyć sumę, wyszukać element albo określić, czy warunek został spełniony. Parametr wyjściowy jest przydatny wtedy, gdy wyników jest kilka albo gdy procedura została zaprojektowana jako działanie wykonujące czynność, a nie jako wyrażenie używane bezpośrednio w obliczeniu. Różnica dotyczy także sposobu czytania kodu. Przy wartości zwracanej rezultat często pojawia się po prawej stronie przypisania i może być od razu przekazany do kolejnej funkcji. Przy parametrze wyjściowym trzeba zwykle wcześniej przygotować zmienną, przekazać ją zgodnie z odpowiednią składnią, a po powrocie odczytać jej nową zawartość. Taki zapis może być bardziej opisowy, ale przy zbyt dużej liczbie parametrów staje się trudniejszy do śledzenia. W nowoczesnych językach podobny efekt osiąga się również przez zwracanie obiektu, krotki, rekordu albo struktury zawierającej kilka pól. W takim przypadku wszystkie rezultaty są opakowane w jeden logiczny wynik. Parametry wyjściowe nadal mogą mieć przewagę w starszych interfejsach programistycznych, procedurach bazodanowych, bibliotekach systemowych oraz kodzie, który musi zachować zgodność z określonym kontraktem. Wybór rozwiązania powinien zależeć od czytelności, zasad używanego języka i sposobu obsługi błędów. Nie należy utożsamiać parametru wyjściowego z automatycznym kopiowaniem wartości. Sposób przekazania może polegać na odwołaniu do tej samej zmiennej, na utworzeniu kopii albo na zastosowaniu mechanizmu zarządzanego przez środowisko wykonawcze. Dla osoby analizującej kod ważne jest ustalenie, czy procedura modyfikuje obiekt wskazany przez wywołującego, czy tylko przygotowuje oddzielny rezultat. Ta różnica ma znaczenie przy strukturach złożonych, tablicach i obiektach współdzielonych przez wiele części programu. Parametry wyjściowe w typowych problemach programistycznychJednym z częstych zastosowań jest rozdzielenie głównego rezultatu od informacji o powodzeniu operacji. Procedura odczytująca dane z pliku może przekazać zawartość, a osobny parametr wyjściowy może oznaczać, czy odczyt przebiegł prawidłowo. W innym scenariuszu procedura wyszukująca rekord może zwrócić sam rekord, a dodatkowo przekazać informację, czy znaleziono pasujący element. Dzięki temu brak wyniku nie musi być mylony z pustą wartością, zerem lub innym poprawnym rezultatem. Problemy pojawiają się wtedy, gdy parametr wyjściowy nie zostanie ustawiony na każdej możliwej ścieżce wykonania. Jeżeli procedura kończy się wcześniej po wykryciu błędu, wywołujący może otrzymać wartość początkową albo nieokreśloną. Bezpieczna implementacja powinna jasno określać, co znajduje się w każdym parametrze po sukcesie, po częściowym wykonaniu oraz po błędzie. Pomocne bywa ustawienie wartości domyślnej na początku procedury i nadpisanie jej dopiero wtedy, gdy obliczenia zostały wykonane poprawnie. Innym źródłem nieporozumień jest kolejność parametrów. Gdy procedura przyjmuje wiele argumentów o podobnych typach, łatwo przekazać zmienne w niewłaściwe miejsca. Nazwy powinny wskazywać znaczenie danych, a dokumentacja powinna wyjaśniać, które parametry są wejściowe, które wyjściowe, a które łączą obie role. W kodzie o większej złożoności warto rozważyć jeden opisowy obiekt rezultatu zamiast rozbudowanej listy parametrów. Trzeba również uważać na aliasowanie, czyli sytuację, w której kilka nazw odnosi się do tego samego obiektu. Procedura modyfikująca parametr wyjściowy może wtedy nieoczekiwanie zmienić dane używane równocześnie w innym miejscu. Skutkiem mogą być trudne do odtworzenia błędy, zwłaszcza gdy operacja jest wykonywana wielokrotnie albo zagnieżdżona w innych wywołaniach. Przejrzysty kontrakt procedury powinien informować, czy wynik jest tworzony od nowa, czy powstaje przez modyfikację przekazanego obiektu. Parametry wyjściowe w praktyce: czytelność, testy i diagnostykaPrzy projektowaniu procedury dobrze jest najpierw wypisać wszystkie informacje, które muszą wrócić do kodu wywołującego. Następnie należy rozdzielić rezultat główny, stan wykonania i komunikat pomocniczy. Taki podział ułatwia testowanie. Dla każdej ścieżki powinno być możliwe wskazanie oczekiwanej wartości parametru, także wtedy, gdy dane wejściowe są puste, niepoprawne albo niekompletne. Testy powinny sprawdzać nie tylko samą wartość wyniku, lecz także to, czy parametry wyjściowe zostały ustawione zgodnie z umową. Warto uwzględnić przypadek poprawnego wykonania, brak danych, nieprawidłowy format, przerwanie operacji oraz ponowne użycie tej samej zmiennej przy kilku wywołaniach. Szczególnie istotne jest sprawdzenie, czy niepowodzenie nie pozostawia w zmiennej starej wartości pochodzącej z wcześniejszego wywołania. Podczas diagnozowania błędu pomocne jest śledzenie wartości przed wejściem do procedury i bezpośrednio po jej zakończeniu. Jeżeli parametr nie zmienia się mimo oczekiwanego rezultatu, przyczyną może być pomyłka w deklaracji, przekazanie kopii zamiast odwołania, błędna kolejność argumentów albo zakończenie procedury przed instrukcją przypisującą wynik. Warto również sprawdzić, czy nazwa parametru wewnątrz procedury nie przesłania zmiennej o podobnej nazwie znajdującej się w kodzie wywołującym. W dokumentacji powinno się opisać typ każdego parametru, jego kierunek, możliwe wartości oraz sytuacje, w których rezultat nie jest dostępny. Samo określenie „wynik” bywa zbyt ogólne. Lepszy opis wskazuje, czy parametr zawiera liczbę przetworzonych elementów, status operacji, identyfikator znalezionego obiektu, komunikat diagnostyczny czy dane przygotowane do dalszego użycia. Precyzyjna dokumentacja ogranicza ryzyko błędnej interpretacji i ułatwia późniejszą konserwację programu. Kiedy skonsultować parametry wyjściowe w serwisie komputerowymProblemy z parametrami wyjściowymi mogą ujawnić się jako nieprawidłowe działanie aplikacji, znikające ustawienia, błędne komunikaty albo niespójne dane zapisywane na dysku. Jeżeli objaw występuje tylko po określonej sekwencji działań, po aktualizacji programu lub przy korzystaniu z konkretnego urządzenia, warto zachować opis sytuacji, komunikat błędu i kolejność wykonanych czynności. Takie informacje ułatwiają odróżnienie problemu w kodzie od kłopotu ze środowiskiem, plikiem, pamięcią lub systemem. W przypadku komputera używanego do pracy, nauki albo obsługi ważnych danych nie powinno się wielokrotnie powtarzać operacji, która może nadpisywać pliki lub pogłębiać niespójność danych. Zalecane jest wykonanie kopii istotnych dokumentów, zapisanie dokładnego brzmienia komunikatu i odłączenie zbędnych urządzeń zewnętrznych. Nie należy usuwać plików konfiguracyjnych ani instalować przypadkowych narzędzi naprawczych bez wcześniejszego ustalenia, jakie dane są przez nie modyfikowane. Gdy potrzebna jest pomoc przy laptopie lub komputerze PC, można zgłosić problem do Warszawskiego Pogotowia Komputerowego 24/7. Przydatne będzie przekazanie informacji o programie, sposobie wystąpienia błędu, ostatnich zmianach w systemie oraz o tym, czy problem dotyczy jednego użytkownika, jednego pliku czy całego komputera. Taki opis pozwala sprawniej rozpocząć analizę i dobrać działania do rzeczywistej przyczyny, zamiast skupiać się wyłącznie na pojedynczym komunikacie wyświetlanym na ekranie. Znajomość parametrów wyjściowych jest przydatna nie tylko programistom. Pozwala lepiej rozumieć, dlaczego aplikacja przekazuje kilka rezultatów, skąd bierze się różnica między pustą wartością a błędem oraz dlaczego ponowne uruchomienie tej samej operacji może dać inny efekt. Świadome rozdzielenie danych wejściowych, wyjściowych i statusu wykonania zwiększa czytelność kodu, ułatwia testy i pomaga szybciej ustalić, w którym miejscu powstaje nieprawidłowość. |