Operacje wejścia i wyjścia

Technicznie rzecz biorąc, operacjami wejścia i wyjściaoperacje wyjścia i wejściaoperacjami wejścia i wyjścia (z ang. input‑output, I/O) możemy nazwać każdą interakcję programu ze światem zewnętrznym. Przykładowe operacje wejścia to:

  • odczytanie wciśnięcia klawiszy na klawiaturze czy ruchu myszy, ale również danych z czujników,

  • odczytanie danych z pliku (np. znajdującego się na dysku),

  • odbieranie pakietów sieciowych.

Przykładowe operacje wyjścia to:

  • regulacja ustawień na czujniku,

  • wyświetlenie obrazów lub tekstu,

  • zapisanie danych do pliku,

  • przesłanie danych przez sieć.

Ciekawostka

Wraz z nadejściem bardziej zaawansowanych komputerów pojawiła się możliwość uruchamiania wielu procesów jednocześnie. Te programy również muszą się ze sobą komunikować, a odpowiada za to tzw. komunikacja międzyprocesowa.

IPC (ang. inter-process communication) towarzyszy nam właściwie nieustannie – przykładem metody komunikacji międzyprocesowej są pliki czy pamięć współdzielona.

Interfejsy użytkownika

Jako użytkownicy komputerów porozumiewamy się z programami. W tym celu używamy intefejsów użytkownikainterfejs użytkownikaintefejsów użytkownika, które obejmują zarówno sposoby przekazywania przez nas danych do programu, jak i przekazywania nam danych przez program. Wśród najpopularniejszych typów intefejsów możemy wyróżnić:

  • wiersz poleceń – wpisuje się w nim polecenia na klawiaturze, a informacja zwrotna to zazwyczaj monochromatyczny tekst (chociaż bywają także wersje obsługujące kolory);

  • interfejs tekstowy, w którym, jak wskazuje nazwa, wyświetlany jest tylko tekst, jednak oferuje on szersze możliwości niż tylko wiersz poleceń – np. swobodne poruszanie się kursora po ekranie;

  • interfejs graficzny, czyli to, co najczęściej wyobrażamy sobie, kiedy myślimy o interfejsach; w tym interfejsie – na wyjściu – rysowana jest grafika.

Wśród innych interfejsów możemy wymienić interfejsy gestowe (sterowane ruchem), głosowe, a także bardzo dynamicznie rozwijający się interfejs rzeczywistości wirtualnej. Interfejsy można ze sobą łączyć. Przykładem może być chociażby umożliwienie sterowania aplikacją na urządzeniu mobilnym zarówno za pomocą dotyku, jak i głosu.

Ciekawostka

Interfejsy można wykorzystywać w sposób kreatywny. Przykładem mogą być gry komputerowe, których sposoby sterowania często utożsamiane są z interfejsem graficznym. Istnieją gry wykorzystujące do komunikacji zarówno interfejs wiersza poleceń (na przykład gatunki MUD, SUD), jak i interfejs tekstowy. Jednym z prekursorów dzisiejszych gier jest Rogue, której cały interfejs, ze względu na ograniczenia technologiczne, opierał się na kolorowych znakach w trybie tekstowym.

Tak wygląda przykładowy ekran dla tej gry:

R1MMRcJWEciS9
Źródło: Artoftransformation, dostępny w internecie: commons.wikimedia.org [dostęp 31.08.2021], licencja: CC BY-SA 3.0.

Problemy związane z wejściem i wyjściem

Projektując systemy wejścia i wyjścia, należy zwrócić uwagę na kilka ważnych elementów. Pierwszym z nich jest zapewnienie poprawnego działania programów w przypadku podania błędnych danych przez użytkownika (tzw. obsługa wyjątków). Jeżeli piszemy kalkulator, który nie sprawdza, czy dzielimy liczbę przez 0, szybko możemy doprowadzić do błędu w programie. Możemy też stworzyć luki w zabezpieczeniach naszego programu. Ważne jest zatem sprawdzanie poprawności danychsprawdzanie poprawności danychsprawdzanie poprawności danych (z ang. sanity check) przed ich przetworzeniem.

Drugim problemem jest asynchronicznośćasynchroniczność operacji wejściaasynchroniczność (lub jej brak). Jeżeli pobieramy dane asynchronicznie, oznacza to, że nasz program kontynuuje działanie, kiedy czeka na dane. Przykładem takiego działania jest wysyłanie maila. Z kolei synchroniczne pobieranie danych możemy porównać do rozmowy telefonicznej: nie możemy jej rozpocząć (a tym samym nie możemy rozpocząć przekazywania danych), dopóki druga osoba nie podniesie słuchawki, tj. dopóki nie odbierze połączenia. Chociaż zdarzają się sytuacje, gdy takie zachowanie jest niepożądane, w znacznej większości przypadków asynchroniczność jest wymagana. Inny przykład dotyczy operacji bankowych: jeżeli serwer w banku czekałby, aż jeden użytkownik wykona czynność na swoim koncie, do tego czasu cały system stałby w miejscu, co jest niedopuszczalne.

Ciekawostka

Szczególnym przykładem asynchroniczności jest pobieranie danych z dysku. Pamięć zewnętrzna jest znacznie wolniejsza od pamięci operacyjnej, a nasz program czekałby na załadowanie wszystkich danych z dysku. Doprowadziłoby to do znacznego spowolnienia jego działania. Warto wtedy rozważyć czy nie powinniśmy ładować danych równolegle do wykonywania naszego programu, czy nawet pracować na częściowo załadowanych danych, jeśli jest to możliwe.

Trzecim problemem jest kwestia przejrzystości interfejsu. Jest to nie tyle problem programistyczny, co psychologiczny. Zadaniem twórcy interfejsu jest zaprojektowanie go w taki sposób, aby był on intuicyjny. Często widzimy interfejsy stworzone w myśl zasady „więcej znaczy lepiej” – w efekcie są one nieczytelne i zrozumiałe tylko dla ich twórców. Rozwiązaniem tego problemu jest przeanalizowanie, czy na pewno interfejs jest czytelny dla kogoś, kto nie ma z nim doświadczenia – przydatni do tego celu mogą być testerzy oprogramowania.

Ważnym zagadnieniem związanym z wejściem i wyjściem jest kwestia dostępności. Na temat jej oraz standardu WCAG przeczytasz w e‑materiale WCAG, dostępność, treści alternatywneep2019.contentplus.io:PQJHmA48SWCAG, dostępność, treści alternatywne.

Słownik

asynchroniczność operacji wejścia
asynchroniczność operacji wejścia

pobieranie danych w taki sposób, że program nie jest zablokowany, kiedy czeka na pełen zestaw danych

interfejs użytkownika
interfejs użytkownika

sposób obustronnej komunikacji między programem a użytkownikiem

operacje wyjścia i wejścia
operacje wyjścia i wejścia

są to wszystkie sposoby interakcji programu ze światem zewnętrznym

sprawdzanie poprawności danych
sprawdzanie poprawności danych

(ang. sanity check); upewnienie się, że dane są poprawne i nie spowodują niepożądanych efektów; w razie potrzeby dane zostają naprawione lub odrzucone