Autor wpisu: sokzzuka, dodany: 04.07.2011 22:53, tagi: php
Podczas swojej już kilkuletniej pracy zawodowej przy tworzeniu aplikacji internetowych, niejednokrotnie musiałem implementować różnego rodzaju systemy kontroli dostępu. Jedne były proste, drugie bardziej skomplikowane, nie mniej jednak każda aplikacja, którą rozwijałem takowy posiadała.
System kontroli dostępu zwykle opiera się na dwóch założeniach:
- istnieją zasoby do których należy ograniczyć dostęp
- ograniczenia dostępu przypisywane są wg ról użytkowników w systemie
Powyższy opis dokładnie odzwierciedla ideę, która leży za każdym rozwiązaniem typu ACL (ang. Access Control List). Zapewne większość z Was miała styczność z różnymi bibliotekami wspomagającymi tworzenie takich list, jak chociażby Zend_Acl z ZF.
W niniejszym artykule pragnę zaprezentować alternatywne rozwiązanie, luźno inspirowane filozofią DDD (ang. Domain Driven Design) i OOD (ang. Object Oriented Design) oraz pokazać gdzie drzemie potencjalna siła systemu typów.
By dobrze zrozumieć całą ideę należy wpierw zadać sobie pytanie „czym jest system typów” ?
Wikipedia definiuje system typów w następujących słowach
W językach programowania system typów może być zdefiniowany jako system klasyfikacji wyrażeń w zależności od rodzajów wartości, jakie one generują. Każdej obliczonej wartości przypisywany jest pewien typ, który jednoznacznie definiuje, jakie operacje można na niej wykonać. Śledząc przepływ wartości, system typów stara się udowodnić, że w programie występuje poprawne typowanie, tzn. nie dochodzi do sytuacji, w której na wartości określonego typu próbujemy wykonać niedozwoloną operację.
W prostych słowach można by powiedzieć, że system typów jest pewnym zbiorem reguł, dzięki którym możemy narzucić takie ograniczenia (constraints) w naszym programie, że będzie on „poprawny”. Oprócz tej definicji, w zorientowanym obiektowo języku programowania, dzięki systemowi typów, możemy kompleksowo opisywać rzeczywistość dokonując jej „klasyfikacji”.
Idąc dalej tym tokiem myślenia, jeżeli przestaniemy przez chwilę traktować elementy systemu typów czysto pragmatycznie – jako narzędzia do upychania kodu i poszukamy dla nich analogii w świecie rzeczywistym, to możemy dość do następujących wniosków:
- klasa – opisuje pewną grupę realnych obiektów
- interfejs – opisuję umiejętności obiektu
- klasa abstrakcyjna – jest szerszym określeniem dla pewnej grupy klas
Jak to się ma do rzeczywistości ? Prześledźmy to na przykładzie klasyfikacji zwierząt: