Artykuł

sty 02 2009
0

Programowanie obiektowe - wprowadzenie

W dzisiejszym artykule, będącym wprowadzeniem do serii artykułów poświęconych elementarnym zagadnieniom związanym z programowaniem obiektowym, postaram się wprowadzić was do obiektowego świata. Programowanie obiektowe jest obecnie najlepszym sposobem na programowanie. Zapewnia przejrzystość i czytelność kodu źródłowego, a aplikacje napisane w ten nowoczesny sposób stają się znacznie wydajniejsze w stosunku do aplikacji napisany w sposób strukturalny, czy proceduralny. Warto poświęcić trochę czasu aby zapoznać się z tą metodyką programowania. W artykule przykładowe kody źródłowe zostaną przedstawione w PHP i Javie.

Pojęcie klasy

Klasa jest specjalna strukturą wykorzystywaną w programowaniu obiektowym. Wewnątrz klasy umieszczamy cały niezbędny kod czyli zmienne składowe klasy i metody klasy. Dlatego też każda klasa jest specyficznym wycinkiem kodu całej aplikacji. Dobrym podejściem i zwyczajem jest dzielenie kodu źródłowego na klasy ze względu na funkcję. Przykładowo jedna klasa może być odpowiedzialna za obsługę bazy danych, inna za wyświetlanie komunikatów, jeszcze inna za obsługę błędów. Powinniśmy dbać oto by klasy nie były zbyt duże. Jeśli uważamy, że jakaś funkcjonalność jest dość rozwinięta, warto stworzyć dla niej odrębną klasę.

Struktura najprostszej klasy, która nie robi nie robi praktycznie niczego wygląda następująco:

class Nazwa_klasy
{
	//zmienne składowe klasy
	//metody klasy
}

Powyższy kod zadziała zarówno pod PHP jak i pod Javą. Jest to ogólna struktura klasy, która występuje w wielu językach programowania. Przejdźmy do omówienia powyższego listingu. Deklaracje klasy rozpoczynamy słowem kluczowym class (w wypadku języka Java przed słowem class możemy umieścić modyfikator dostępu. O modyfikatorach dostępu napiszę więcej w rozdziale poświęconym hermetyzacji), a następnie definiujemy nazwę naszej klasy. Właściwy kod umieszczamy wewnątrz nawiasów klamrowych.

Definicja przykładowej klasy Human

Aby lepiej przyswoić materiał utworzymy testową klasę Human (użyjemy angielskiego nazewnictwa). Większość kluczowych elementów użytych przy budowie tej klasy zostanie omówionych w dalszej części tego artykułu.

Klasa Human w PHP

<?php
class Human
{
	private $sName = '';
	private $sHairs = '';
	private $iAge = 0;
	private $iHeight = 0;

	public function __construct($sName, $sHairs, $iAge, $iHeight)
	{
		$this->sName = $sName;
		$this->sHairs = $sHairs;
		$this->iAge = $iAge;
		$this->iHeight = $iHeight;
	}
	
	public function __destruct()
	{
		echo 'Niszczenie obiektu';
	}
	
	public function __toString()
	{
		return('Imię: '.$this->sName.', Kolor włosów: '.$this->sHairs.
				', Wiek: '.$this->iAge.', Wzrost: '.$this->iHeight);
	}
}
?>

Klasa Human w Javie

class Human
{
	private String sName = "";
	private String sHairs = "";
	private int iAge = 0;
	private int iHeight = 0;

	public Human(String sName, String sHairs, int iAge, int iHeight)
	{
		this.sName = sName;
		this.sHairs = sHairs;
		this.iAge = iAge;
		this.iHeight = iHeight;
	}
	
	public Human()
	{
		System.out.println("Konstruktor bezparametrowy");
	}
	
	public String toString()
	{
		return("Imię: "+this.sName+", Kolor włosów: "+this.sHairs+
				", Wiek: "+this.iAge+", Wzrost: "+this.iHeight);
	}
}

Instancja klasy czyli obiekt

Kiedy już wiemy czym w zarysach jest klasa, to czas przejść do definicji obiektu. Przytoczymy tutaj popularne w światku obiektowym zdanie: Obiekt jest instancją klasy. Tylko co tak właściwie oznacza ta sentencja? Obiekt jest swoistym bytem, jednostką, posiadającą określone cechy, artybuty specyficzne dla określonej klasy. Przykładowo mamy klasę człowiek, o atrybutach imię, kolor włosów, wiek, wzrost itp. Na podstawie tej klasy możemy utworzyć wiele obiektów o różnych cechach np. Jan/Brunet/25/180, Magda/Blondynka/22/170, Ania/Szatynka/21/167 itp. Każdy z tych obiektów jest instancją klasy człowiek, swoistym samodzielnym bytem o określonych cechach i atrybutach. Do każdego takiego obiektu możemy się odwoływać, odczytywać jego atrybuty (kolor włosów, wiek itd), wykonywać zdefiniowane dla tego obiektu metody. Każda klasa może mieć nieskończenie wiele obiektów.

Tworzenie obiektu w PHP

Dla naszej przykładowej klasy Human napisanej w PHP możemy utworzyć następujący obiekt:

<?php
	$oAnn = null;
	$oAnn = new Human('Ania', 'Blond', 20, 175);
?>

Wykonanie powyższych poleceń spowoduje utworzenie obiektu o nazwie oAnn.

Tworzenie obiektu w Javie

Dla naszej przykładowej klasy Human napisanej w Javie możemy utworzyć następujący obiekt:

public class HumanTest 
{
	public static void main(String args[])
	{
		Human oAnn = null;
		oAnn = new Human("Ania","Blond",20,175);
		System.out.println(oHuman);
		Human oSomebody = null;
		oSomebody = new Human();
	}
}

Wykonanie powyższych poleceń spowoduje utworzenie dwóch obiektów. Pierwszy z nich kozysta z parametrowego konstruktora, drugi z konstruktora bezparametrowego. Pojęcie konstruktora zostanie omówione w następnym akapicie.

Słowo kluczowe this

Słowo kluczowe this (w języku polskim możemy przetłumaczyć je na ten) jest bardzo ważnym elementem programowania obiektowego. Pozwala odwoływać się do elementów składowych klasy, zarówno metod jak i zmiennych. Dlatego aby uzyskać dostęp do elementów składowych klasy należy użyć słowa kluczowego this.

this w PHP

W jęzku PHP słowo kluczowe this jest obowiązkowe jeśli chcemy się odwołać do składowej klasy. Sposób użycia:

$this->sName = 'Ann';

Słowo kluczowe this zawsze poprzedzamy znakiem dolara. Dostęp do konkretnego pola/metody klasy uzyskujemy dzięki strzałce (->)

this w Javie

This w Javie ma mniejsze znaczenie niż w PHP i zasadniczo nie jest wymagany. Przydatny jest wtedy, kiedy konkretnie chcemy zaznaczyć, że chodzi o ten, a nie o inny element. Załóżmy taką sytuację:

private int iAge;
public void setAge(int iAge)
{
	iAge = iAge;
}

Powyższy kod choć działa, nie jest poprawny. Przypisujemy do zmiennej funkcyjną, zmienną funkcyjną. Jak go naprawić?

private int iAge;
public void setAge(int iAge)
{
	this.iAge = iAge;
}

Powyższy kod już zadziała prawidłowo. Metoda setAge, zmieni wartość zmiennej składowej klasy iAge. Oczywiście w przypadku gdy jako parametr użyjemy innej nazwy zmiennej, słowo kluczowe this, nie będzie już potrzebne. Przykładowo:

private int iAge;
public void setAge(int iNewAge)
{
	iAge = iNewAge;
}

Konstruktor

Jeśli chcemy by określone czynności wykonywały się podczas inicjalizacji obiektu, tworzymy konstruktor. Konstruktor występuje zarówno w PHP jak i Javie. Do konstruktora możemy przekazać również zmienne i obiekty. Jeśli korzystamy z Javy to dla jednej klasy możemy utworzyć kilka konstruktorów. Muszą one jednak różnić się parametrami (możemy tworzyć również konstruktory bezparametrowe).

Konstruktor w PHP

Konstruktor w PHP tworzymy przy pomocy słowa kluczowego __construct. Dla przypomnienia w klasie Human, wyglądał on następująco:

public function __construct($sName, $sHairs, $iAge, $iHeight)
{
	$this->sName = $sName;
	$this->sHairs = $sHairs;
	$this->iAge = $iAge;
	$this->iHeight = $iHeight;
}

Podczas tworzenia obiektu, do zmiennych składowych klasy przypisaliśmy wartości podane w konstruktorze.

Konstruktor w Javie

W Javie możemy mieć kilka konstruktorów dla każdej klasy. W klasie Human zdefiniowaliśmy dwa:

public Human(String sName, String sHairs, int iAge, int iHeight)
{
	this.sName = sName;
	this.sHairs = sHairs;
	this.iAge = iAge;
	this.iHeight = iHeight;
}

public Human()
{
	System.out.println("Konstruktor bezparametrowy");
}

Warto tutaj zwrócić uwagę na odmienne podejście w tworzeniu konstruktorów w stosunku do języka PHP. Aby utworzyć konstruktor w Javie wykorzystujemy nazwę klasy w której się on znajduje. Ponadto, parametry winny być definiowane razem z ich typami. Przykładowo dla zmiennej przechowującej informacje o imieniu i będącej łańcuchem tekstowym, piszemy kod:

String sName

Destruktor w PHP

W PHP dostępne jest coś na kształt przeciwieństwa konstruktora czyli destruktor. Konstruktor uruchamiany jest w momencie inicjalizacji obiektu, destruktor natomiast, w momencie niszczenia obiektu. Jeśli na obiekcie naszej klasy Human wywołamy kod:

<?php
	$oAnn = new Human('Ania', 'Blond', 20, 175);
	$oAnn = null;
?>

To w momencie gdy obiekt przyrównamy z wartością null (czytaj zniszczymy obiekt), to wtedy wywołamy destruktor. Kod destruktora umieszczamy w funkcji __destruct (patrz listing klasy Human).

Metoda toString

Ponieważ obiekt jest swego rodzaju zmienną, możemy spróbować wyświetlić jego zawartość. Za to co wyświetli się na erkanie odpowiada metoda toString. Tworząc nową klasę dziedziczymy domyślną postać tej metody, która po wyświetleniu obiektu z reguły wyświetli na ekranie jakiś zlepek dziwnych znaczków. Możemy jednak, dla każdej napisanej przez nas klasy utworzyć własną metodę toString. Dzięki temu, w każdej sytuacji, kiedy będziemy chcieli podejrzeć obiekt, na ekranie ujrzymy łańcuch tekstowy w formie zdefiniowanej przez nas. Przykładowe funkcje toString przedstawione są na początku artykułu.

Szkielet funkcji __toString w PHP

function __toString()
{
	return(/* zwracany string /*);
}

Szkielet funkcji toString w Javie

public String toString()
{
	return(/* zwracany string /*);
}

Podsumowanie

W artykule starałem się przedstawić podstawowe elementy programowania obiektowego. Swoiste wprowadzenie, ma umożliwić każdemu szybki i łatwy start w programowaniu obiektowym. W kolejnych artykułach postaram się opisać trzy kluczowe elementu paradygmatu programowania obiektowego czyli hermetyzacje, dziedziczenie i polimorfizm.

Data ostatniej modyfikacji: 05.06.2011, 17:18.

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus