Encyklopedia Zarządzania :: Metody i narz��dzia programowania
Przeglądanie katalogu (kliknij)
Przeglądaj katalog alfabetyczny według autorów, tytułów lub słów kluczowych. Kliknij odpowiedni przycisk poniżej, a następnie wybierz pierwszą literę nazwiska, tytułu czy słowa kluczowego.
(cytat, str. 18) algorytm jest przepisem postępowania, które powinno doprowadzić do uzyskania jakiegoś określonego celu. Jednak nie każdy przepis możemy nazwać algorytmem.
(cytat, str. 52 - 53) JDK (ang. Java Development Kit) – zestaw narzędzi pozwalających na utworzenie programu, w skład których wchodzi kompilator, interpreter kodu bajtowego, przeglądarka umożliwiająca uruchamianie apletów, czy dodatkowe programy narzędziowe, Kompilator (ang. compiler) – program dokonujący zamiany kodu źródłowego na kod zrozumiały dla wirtualnej maszyny Javy, tzw. kod bajtowy (ang. bytecode), JVM (ang. Java Virtual Machine) – Wirtualna Maszyna Javy stanowiąca wirtualny komputer, na którym uruchamiane są programy napisane w języku Java, JRE (ang. Java Runtime Environment) – Wirtualna Maszyna Javy wraz ze zbiorem standardowych klas; JRE jest niezbędne do uruchomienia jakiegokolwiek programu utworzonego w języku Java, API (ang. Application Programming Interface) – kolekcja gotowych do użycia komponentów; w przypadku języka Java jest to zbiór klas i interfejsów pogrupowanych w odpowiednie pakiety, IDE (ang. Integrated Development Environment) – zintegrowane środowisko programistyczne służące do tworzenia, modyfikowania oraz testowania programu, Konsola, wiersz poleceń – elementy umożliwiające komunikację użytkownika z komputerem za pomocą poleceń tekstowych. Przygotowanie aplikacji wymaga użycia narzędzi umożliwiających lub wspomagających proces tworzenia kodu źródłowego, jego kompilacji oraz uruchomienia. Do niezbędnych zaliczyć można: Java SE Development Kit (http://java.sun.com/javase/downloads/), znakowy edytor tekstu (np. notepad, notepad++, vi, jedit) lub zintegrowane środowisko programistyczne (np. JCreator, NetBeans, Eclipse), dokumentacja, zawierająca szczegółowy opis wszystkich klas dostępnych wraz z Javą (ang. Java API) (http://java.sun.com/reference/api/).
(cytat, str. 57) Nazwy klas, interfejsów: rozpoczynają się z wielkiej litery, nie zawierają znaku podkreślenia (_), kolejne wyrazy składające się na nazwę rozpoczynają się z wielkiej litery, przykłady: Klient, KlientBanku.
Nazwy zmiennych i metod: rozpoczynają się od małej litery, nie zawierają znaku podkreślenia, kolejne wyrazy składające się na nazwę rozpoczynają się z wielkiej litery, nazwa metody powinna określać czynność (zazwyczaj stosuje się parę wyrazów czasownik-rzeczownik, bądź tez sam czasownik), przykłady: cena, cenaTowaru, dodaj(), dodajPracownika().
Nazwy stałych: składają się wyłącznie z wielkich liter, kolejne wyrazy oddzielane są znakiem podkreślenia, przykłady: PODATEK, PODATEK_VAT
(cytat, str. 60) Zmienna określa obszar pamięci, przeznaczony do przechowywania danych. Każda zmienna posiada nazwę oraz typ, który określa zakres dopuszczalnych wartości oraz rodzaj możliwych do przeprowadzenia operacji. Zmienne prymitywne określają obszar pamięci przechowujący dane typu podstawowego. Natomiast zmienne obiektowe, o których będzie mowa w kolejnych rozdziałach, zawierają referencje (wskazania) do utworzonych wcześniej obiektów. Język Java wymaga deklaracji (określenia nazwy oraz typu) każdej zmiennej przed jej pierwszym użyciem. Pierwszy odczyt wartości zmiennej powinien być poprzedzony jej inicjalizacją, czyli przypisaniem wartości początkowej.
(cytat, str. 60) Program komputerowy składa się z sekwencji instrukcji, które wykonywane są przez komputer dla realizacji zadania. W skład instrukcji wchodzą wyrażenia operujące na danych, reprezentowanych przez zmienne oraz literały. Rodzaj realizowanej operacji określony jest poprzez użycie operatorów.
Typ danych określa rodzaj informacji oraz zakres dopuszczalnych wartości, jakie może przyjmować stała, zmienna, argument wyrażenia, parametr, czy rezultat metody. Język Java definiuje typy proste (prymitywne) oraz typy złożone (obiektowe). W przypadku tych pierwszych wyróżnić można10: całkowite (int,short,long,byte), zmiennoprzecinkowe (float,double), znakowy (char), logiczny (boolean), pusty (void).
Rodzaj informacji oraz zakresy dopuszczalnych wartości określa specyfikacja języka. Warto nadmienić, iż sposób reprezentacji danych jest niezależny od platformy systemowej, a co za tym idzie, zakres dopuszczalnych wartości pozostaje niezmienny niezależnie od platformy, na której uruchamiany jest program.
Literał jest to ciąg znaków reprezentujący wartość zapisaną bezpośrednio w kodzie programu.
(cytat, str. 62) Operatory to zestaw symboli w języku programowania określających rodzaj wykonywanej operacji na argumencie lub argumentach wyrażenia. Dokonując klasyfikacji ich podziału, wyróżnić można operatory: przypisania: = += -= *= /= %= &= ^= |= <<= >>= >>>= arytmetyczne13: + - * / % jednoargumentowe: + - ++ -- ! relacji: == != > >= < <= instanceof warunkowe: && || ?:
bitowe: ~ << >> >>> & ^ | Należy zwrócić uwagę, iż sposób użycia operatorów zależny jest od typu argumentu (argumentów) natomiast kolejność wykonywania operacji wynika z priorytetu, jaki posiadają operatory.
(cytat, str. 67) Tablice reprezentują kontener służący do przechowywania dowolnej liczby wartości pojedynczego typu. Liczba elementów tablicy jest określona w momencie jej tworzenia i nie może zostać zmieniona w trakcie dalszego działania programu. Każdy element posiada kolejny numer (indeks) umożliwiający zapis i odczyt danych
(cytat, str. 70) Instrukcje wchodzące w skład programu komputerowego wykonywane są najczęściej sekwencyjnie, począwszy od pierwszej, a skończywszy na ostatniej z nich. Jednakże złożone zadania obliczeniowe wymagają częstokroć łączenia instrukcji w grupy, warunkowego przetwarzania, czy też wielokrotnego ich powtarzania, dla realizacji zadania. Stąd prawie każdy język programowania zaopatrzony jest w zbiór instrukcji sterujących, mających za zadanie umożliwić skonstruowanie programu zgodnie z realizowanych algorytmem20. Język Java wyróżnia 5 instrukcji sterujących: while, do..while, for, if, switch, zadaniem których jest umożliwienie rozwiązywania wielorakich problemów, przed którymi stoi twórca programu. Praktyka programowania pokazuje, iż często zachodzi konieczność zbiorczego przetwarzania instrukcji wchodzących w skład realizowanego programu. Taką funkcjonalność zapewnia blok instrukcji. Umożliwia on ich grupowanie, poprzez ujęcie w znaki nawiasów klamrowych {} Wewnątrz bloku możliwe jest umieszczenie deklaracji zmiennych. Należy jednak zwrócić uwagę, iż zmienne te widoczne będą wyłącznie wewnątrz tego bloku – nie będzie możliwe odwołanie do zmiennych poza blokiem, w którym zostały zadeklarowane. Również próba deklaracji zmiennej wewnątrz bloku, której nazwa jest identyczna z istniejącą zmienną poza blokiem spowoduje powstanie błędu kompilacji. Ten rodzaj instrukcji sterującej umożliwia warunkowe wykonanie pojedynczej instrukcji lub bloku instrukcji programu w zależności od wartości wyrażenia logicznego. Jeśli wyrażenie logiczne jest prawdziwe (przyjmuje wartość true) to wykonaniu podlegać będą instrukcje programu występujące wewnątrz bloku instrukcji21 if. W przypadku, gdy wyrażenie logiczne przyjmie wartość false, żadna z instrukcji umieszczonych w bloku instrukcji nie zostanie wykonana. Dostępna jest również wersja instrukcji warunkowej if uwzględniająca sytuację alternatywną. Dodatkowy blok instrukcji umieszczony po klauzuli else zostanie wykonany jedynie wtedy, gdy wyrażenie logiczne przyjmie wartość false.
(cytat, str. 74) W przypadku, gdy liczba warunków podlegających sprawdzeniu jest znaczna, stosowanie instrukcji if–else może stać się nieporęczne. W takiej sytuacji możliwe jest użycie instrukcji wielokrotnego wyboru switch. Jej działanie polega na wyznaczeniu wartości wyrażenia, a następnie porównaniu tej wartości z wymienionymi po klauzulach case wartościami stałych. W przypadku równości sterowanie przekazywane jest do instrukcji występującej po klauzuli case, dla której wartość stałej jest zgodna z wartością wyrażenia. Jeśli żadna równość nie zachodzi, wykonywane są instrukcje występujące po słowie kluczowym default lub kolejne instrukcje programu, gdy klauzula ta nie została użyta. Instrukcja break umożliwia przerwanie wykonywania instrukcji switch i przeniesienie sterowania do kolejnych instrukcji programu występujących po instrukcji switch.
switch (wyrażenie) { case wartość1: instrukcje1; break; case wartość2: instrukcje2; break; case wartośćN: instrukcjeN; break; default: // część opcjonalna instrukcji switch instrukcje; }
(cytat, str. 77) Instrukcje iteracyjne (pętle) umożliwiają wielokrotne wykonywanie pojedynczej instrukcji lub bloku instrukcji. W przypadku, gdy nie jest z góry znana liczba powtórzeń, stosowane są pętle nieokreślone. Jedną z nich jest instrukcja while, której działanie polega na wyznaczeniu wartości wyrażenia logicznego. Jeśli wyrażenie to przyjmuje wartość prawdy (true) wykonywany jest blok instrukcji występujący po wyrażeniu, a następnie ponownie obliczana jest wartość wyrażenia logicznego. Blok instrukcji będzie wykonywany wielokrotnie do momentu, gdy wyrażenie logiczne nie przyjmie wartości false. Wtedy sterowanie zostanie przekazane do kolejnej instrukcji programu, występującej po instrukcji while.
(cytat, str. 79) Jeśli znana jest z góry liczba powtórzeń, możliwe jest użycie instrukcji iteracyjnej for. Jej działanie polega na ustaleniu wartości początkowej, określającej początek iteracji. Wykonanie bloku instrukcji jest uwarunkowane wartością wyrażenia logicznego. Jeśli jest ono prawdziwe (wartość true) blok instrukcji jest wykonywany, a następnie wykonywane jest wyrażenie modyfikujące ustaloną wartość początkową. W kolejnym kroku ponownie sprawdzana jest wartość wyrażenia logicznego i w przypadku wartości true wykonywany blok instrukcji programu. Opisane czynności są powtarzane do momentu, gdy wyrażenie logiczne przyjmie wartość false. Wtedy sterowanie programu przekazane zostaje do kolejnych instrukcji występujących po instrukcji for. for (wartość_początkowa; wyrażenie_logiczne; wyrażenie_modyfikujące) { instrukcje; } Każda metoda składa się ze skończonej liczby instrukcji. Działanie metody kończy się, gdy zachodzi jeden z przypadków: została wykonana ostatnia instrukcja metody, wystąpiła instrukcja return, wystąpił tzw. wyjątek.
W języku programowania Java wyróżnić można dwa rodzaje metod: związane z daną instancją34 klasy oraz klasowe35. Metody instancyjne nie posiadają modyfikatora static i wywołanie ich jest możliwe tylko na rzecz utworzonych obiektów danej klasy (bądź też z poziomu innych metod instancyjnych występujących w tej klasie). Mówiąc inaczej, aby wywołać metodę instancyjną należy posłużyć się zmienną zawierającą referencję to utworzonego wcześniej obiektu.
Kolejny rodzaj to metody klasowe, w których nazwa poprzedzona jest modyfikatorem static. Ich wywołanie jest możliwe bez konieczności tworzenia obiektu36. Konieczne jest jedynie podanie nazwy klasy oraz nazwy wywoływanej metody. Poniższy przykład zawiera wywołanie metody klasowej random(), zawartej w klasie java.lang.Math.
(cytat, str. 101) W otaczającej rzeczywistości występuje szereg obiektów tego samego typu (np. zbiór samochodów, drzew, czy studentów). Klasa określana jest jako zbiór stanów oraz zachowań opisujących obiekty należące do tej samej kategorii. Jest to pewnego rodzaju wzorzec, na podstawie którego tworzone są unikalne wersje obiektu (np. czerwony samochód marki Fiat, wysokie drzewo). W skład każdej klasy wchodzą: pola (zmienne), zawierające informacje opisujące właściwości (stany) obiektów, metody (podprogramy), modelujące zachowania obiektów.
Na podstawie zdefiniowanej klasy tworzone są obiekty różniące się właściwościami. Każdy obiekt posiada własny zbiór pól, których wartości określają jego indywidualność. Na podstawie klasy możliwe jest zatem utworzenie dowolnej liczby obiektów (instancji klasy), należących do tej samej kategorii, zróżnicowanych pod względem właściwości.
(cytat, str. 102) Każda tworzona klasa może zawierać zbiór pól oraz metod stanowiących składowe klasy.
Pola to zmienne deklarowane wewnątrz klasy. W przypadku braku jawnej inicjalizacji zmiennej otrzymuje ona wartość domyślną43. Zwyczajowo deklaracja pól klasy występuje przed deklaracją metod. Poniższy kod programu zawiera definicję klasy Telefon wraz z wchodzącymi w jej skład polami.
(cytat, str. 103) Pola statyczne (oznaczone w kodzie modyfikatorem static), w przeciwieństwie do pól niestatycznych, są wspólne dla wszystkich obiektów danej klasy44. Dostęp do nich jest możliwy bez konieczności tworzenia obiektu klasy. W powyższym przykładzie pole cenaRozmowy dotyczy właściwości odnoszącej się do wszystkich obiektów klasy Telefon. Dostęp do pól klasy jest możliwy zgodnie z rodzajem użytego w deklaracji modyfikatora dostępu.
(cytat, str. 117) W celu określenia, iż jedno pojęcie jest uszczegółowieniem (lub uogólnieniem) innego, stosowane jest dziedziczenie. Wyraża ono relację „jest” i jest wykorzystywane wszędzie tam, gdzie należy wskazać, iż 2 pojęcia są do siebie podobne. Realizacja dziedziczenia polega na tym, iż nowo tworzona klasa przejmuje wszelkie cechy i zachowania z klas już istniejących, dodając bądź też modyfikując je, aby były one bardziej wyspecjalizowane. Dzięki temu powstaje nowa klasa określana terminem „podklasa” (ang. subclass) lub „klasa pochodna”, natomiast klasa, z której dokonano dziedziczenia to „nadklasa” (ang. superclass)52 lub „klasa bazowa”.
(cytat, str. 120) Tworząc obiekty na podstawie klas dziedziczących z innych klas, można jako zmienną referencyjną podać typ klasy bazowej58. Wywołując następnie odpowiednie metody kompilator Javy decyduje, która z nich ma zostać wykonana (na podstawie typu obiektu, na rzecz którego są one wywołane). Taki sposób wywołania metod nazywany jest polimorfizmem.
Powiązane ze sobą klasy i interfejsy59 umieszczane są w jednostkach bibliotecznych zwanych pakietami (ang. package). Takie grupowanie pozwala na szybsze odnalezienie właściwych klas i interfejsów, jak również wpływa korzystnie na przejrzystość pisanych aplikacji. Dodatkowe zalety pakietów to m.in.:
jasne określenie związków (powiązań) między klasami,
unikanie konfliktu nazw60,
możliwość skorzystania z dodatkowych modyfikatorów dostępu
(cytat, str. 125) Interfejsy w programowaniu obiektowym stanowią zbiór wymagań dotyczących klas, które będą go stosować. Wyrażają sposób opisu funkcjonalności klasy bez określania, w jaki sposób będzie to uzyskane. W skład interfejsów wchodzą metody oraz pola. Deklaracja metod składa się z nagłówków (brak jest ciała metody), natomiast pola interfejsu to wyłącznie stałe statyczne z jawnie określoną wartością. W deklaracjach wszystkich składowych niezbędne jest użycie modyfikatora public.
(cytat, str. 131) Klasy abstrakcyjne wykorzystywane są w procesie modelowania zawierając jedynie ogólne cechy i zachowania obiektów. Nie wszystkie cechy i zachowania muszą zostać szczegółowo opisane. Część z metod (nawet wszystkie74) może składać się wyłącznie z deklaracji nazwy (tzw. metody abstrakcyjne75) poprzedzonej identyfikatorem abstract. Umożliwia to stworzenie ogólnego modelu bez konieczności zagłębiania się w szczegóły implementacyjne. Klasa abstrakcyjna nie może stanowić podstawy dla utworzenia obiektu, możliwe jest natomiast na jej podstawie tworzenie klas pochodnych, które muszą zaimplementować wszystkie metody abstrakcyjne występujące w klasie bazowej. Deklaracja klasy abstrakcyjnej odbywa się za pomocą słowa kluczowego abstract umieszczonego przed nazwą klasy.
(cytat, str. 140) Operacje wejścia-wyjścia w języku Java opierają się na pojęciu „strumienia” (ang. stream), rozumianego jako kanał transmisyjny, przez który przepływa sekwencja bajtów ze źródła do programu lub z programu do miejsca przeznaczenia. Gdy dane przekazywane są ze źródła do programu, mowa jest o strumieniu wejściowym (ang. input stream), natomiast jeśli dane przekazywane są z programu do miejsca przeznaczenia, wtedy określane jest to jako strumień wyjściowy (ang. output stream). Źródłem, czy miejscem przeznaczenia danych mogą być pliki dyskowe, urządzenia (np. drukarka, skaner), inne programy, czy zasoby danych dostępne w sieci (np. zasoby sieci Internet).
(cytat, str. 229) Jeśli rozpatrujemy algorytm z punktu widzenia jego zapotrzebowania na czas pracy procesora, to mamy na myśli złożoność czasową algorytmu. Natomiast, gdy próbujemy określić zapotrzebowanie algorytmu na pamięć operacyjną komputera, to interesuje nas złożoność pamięciowa.