Przeczytaj
Operacje wejścia i wyjścia
Technicznie rzecz biorąc, operacjami wejścia i wyjś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ć.
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ż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.
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:
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 danych (z ang. sanity check) przed ich przetworzeniem.
Drugim problemem jest asynchronicznośćasynchroniczność (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.
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 alternatywneWCAG, dostępność, treści alternatywne.
Słownik
pobieranie danych w taki sposób, że program nie jest zablokowany, kiedy czeka na pełen zestaw danych
sposób obustronnej komunikacji między programem a użytkownikiem
są to wszystkie sposoby interakcji programu ze światem zewnętrznym
(ang. sanity check); upewnienie się, że dane są poprawne i nie spowodują niepożądanych efektów; w razie potrzeby dane zostają naprawione lub odrzucone