Programowanie w języku C#

Enkapsulacja

Trzy filary programowania obiektowego:


1) Enkapsulacja


2) Dziedziczenie


3) Polimorfizm




1) Enkapsulacja


Czym jest enkapsulacja


Enkapsulacja czyli inaczej hermetyzacja. Terminy te oznaczają generalnie ukrywanie w obiektach tego, do czego użytkownik tych obiektów nie powinien mieć swobodnego dostępu. Chodzi tu m.in.:
- o zmianę wartości jakiś pól które wynikają z paru zmiennych, lepiej zaimplementować w klasie logikę ustawiania tych pól prywatnie a dla użytkownika obiektu co najwyżej dać możliwość podglądania wartości tych pól, bez możliwości wprowadzania zmian
- uproszczenie korzystania z obiektów, jest różnica gdy korzystając z jakiegoś obiektu mamy tylko wywołać jakąś metodę z parametrami a sytuacją gdy zanim będziemy mogli wywołać jakąś metodę musimy ustawić kilka właściwości aby wywołanie tej metody w ogóle było możliwe
- ukrywanie chronionych danych w obiekcie za pomocą właśnie modyfikatora private lub protected, dzięki temu możemy kontrolować w jakiej metodzie, kiedy udostępnimy te dane do wglądu lub nawet do modyfikacji przez użytkownika zewnętrznego.

Przykład:
 
    public enum StanyWskazan
    {
        OsiagnietoMinimum,
        WskazaniaZnamionowe,
        OsiagnietoMaksimum
    }
 
    public class Licznik
    {
        private int minLicznika;
        private int maxLicznika;
        private int aktualnaWartoscLicznika;
 
        public int AktualnaWartoscLicznika 
        { 
            get
            {
                return aktualnaWartoscLicznika;
            } 
            private set
            {
                if (value>minLicznika && value<maxLicznika)
                {
                    aktualnaWartoscLicznika = value;
                    StanPracyLicznika = StanyWskazan.WskazaniaZnamionowe;
                }
                else if (value <= minLicznika)
                {
                    aktualnaWartoscLicznika = minLicznika;
                    StanPracyLicznika = StanyWskazan.OsiagnietoMinimum;
                }
                else 
                {
                    aktualnaWartoscLicznika = maxLicznika;
                    StanPracyLicznika = StanyWskazan.OsiagnietoMaksimum;
                }
            }
        }
 
        public StanyWskazan StanPracyLicznika { get; private set; }
 
        public Licznik(int min, int max)
        { 
            this.minLicznika = min;
            this.maxLicznika = max;
            AktualnaWartoscLicznika = minLicznika + (maxLicznika-minLicznika)/2;
        }
 
        public void InkrementujLicznik()  
        {
            if (AktualnaWartoscLicznika < maxLicznika)
            {
                AktualnaWartoscLicznika++;
            }  
 
        }
 
        public void DekrementujLicznik()  
        {
            if (AktualnaWartoscLicznika > minLicznika)
            {                
                AktualnaWartoscLicznika--;
            }
        }
    }

Może toporny przykład ale pare rzeczy na nim będzie widać.

1) zakres wskazań Licznika ustalamy tylko w chwili tworzenia obiektu, potem w trakcie życia obiektu nie możemy zmienić tego zakresu, możliwe to jest dzięki oznaczeniu jako prywatne pól:
private int minLicznika;
private int maxLicznika;

I ustawianiu ich tylko w konstruktorze. Ochroniliśmy w ten sposób do nich dostęp dla zbyt wścibskich użytkowników tego obiektu którzy mieliby pomysł zmienić zakres licznika już w chwili jego działania.

2) Właściwość StanPracyLicznika ustawiane jest tylko wewnątrz obiektu w oparciu o aktualneWskazanieLicznika, z zewnątrz można tylko podejrzeć jaką wartość ma ta właściwość. Dzięki zamknięciu logiki sterującej zmianami tej właściwości mamy pewnośc że zawsze będą zgodne ze wskazaniami licznika. Uniemożliwiliśmy wścibskiemu użytkownikowi naszego licznika, przy stanie licznika 3 na zakresie 0, 10, zmienić StanPracyLicznika na StanyWskazan.OsiagnietoMinimum, co powodowałoby absurd i złe działanie naszego licznika.

3) Metody:
public void InkrementujLicznik()  
public void DekrementujLicznik()  

również mają zamkniętą logikę zwiększania i zmniejszania stanu licznika tylko o 1. Wścibski użytkownik nie może od razu zwiększyć naszego licznika o 5 czy jakąś inna wartość musi cierpliwie zwiększać go lub zmniejszać tylko o 1.
   

1 komentarz

sailor53 2015-02-16 20:13

Witam. Sprawdziałem kod i w miejscu
get;
powinieneś zastąpić
get{return aktualnaWartoscLicznika;}
w przeciwnym wypadku wystapi bład ;)
-Trzeba dostarczyć część właściwości....

Pozdrawiam