2011-01-22 14 views

Odpowiedz

7

Setery ściągaczy są zazwyczaj używane z zewnątrz, bezpośrednio z poziomu pól. Główna zaleta/cel to enkapsulacja setera gettera,

Jeśli twoje setery pobierające mają jakiś kod logiczny, użyj go.

na przykład:

public void setValue(int val){ 
    if(val > 100) 
    this.val = 0; 
    else 
    this.val = val; 
    } 

zobaczyć również

+0

link do innego artykułu wyjaśnia to bardzo dobrze. – Knubo

+0

Podpowiedź typu int nie działa w PHP. – GolezTrol

+0

@Geolez Nie widzę tagu PHP według OP, jego koncepcja opisanego tutaj OOP nie jest specyficzna dla żadnego języka –

5

Tak, pobierające i ustawiające są użyteczne. Ponieważ PHP nie obsługuje podpowiedzi typów dla prostych typów, takich jak int lub string, nie można wymusić wartości odpowiedniego typu.

Używając setera, zawsze masz możliwość sprawdzenia ustawionej wartości. Jeśli wartość ustawiona na właściwość int nie jest int, możesz wybrać jej typowanie lub podnieść błąd, zamiast po prostu przyjąć niewłaściwą wartość.

To znacznie ułatwi debugowanie i konserwację aplikacji. Dobrym pomysłem jest więc używanie programów pobierających i ustawiających, nawet jeśli nie zawierają one dużo logiki poza tymi sprawdzeniami.

+0

+ 1. To jest przydatne, dziękuję i org.life ma rację.Nie dodałem jeszcze tagu specyficznego dla języka. –

0

Powinieneś używać zdobywców i setera prawie wszędzie, także w klasie. Jeśli tego nie zrobisz, to potencjalnie przełamujesz enkapsulację, a co gorsza, możesz unieważnić swoje niezmienniki.

Jako prosty przykład w C++:

class BankAccount 
{ 
public: 
    void withdraw(int amount) 
    { 
     m_balance -= amount; 
     m_withdrawals++; 
    } 

    void transfer(BankAcount& other, int amount) 
    { 
     m_balance -= amount; 
     other.m_balance += amount; 
    } 

private: 
    int m_balance; 
    int m_withdrawals; 
}; 

zobaczyć błąd? transfer wypłaca pieniądze, ale nie zwiększa się o m_withdrawals. Można było tego uniknąć, gdyby po prostu zadzwonił pod numer withdraw zamiast ręcznie zmniejszać saldo.

To samo dotyczy programów pobierających i ustawiających. Na przykład, dość często spotykamy się z tymi, które leniwie inicjują swoje wartości. Jeśli inna funkcja członkowska próbuje bezpośrednio uzyskać dostęp do niezainicjowanego członka, wówczas otrzymasz zerowy wskaźnik wskaźnika.

Zasadniczo zawsze powinieneś próbować używać modułów pobierających i ustawiających, ilekroć zapewniają one pożądaną funkcjonalność. Im więcej rzeczy zrobisz na niskim poziomie, tym więcej błędów na niskim poziomie będziesz mieć. Nie ma sensu pisać osób pobierających i ustawiających, jeśli nie zamierzasz ich używać.

+1

Myślę, że opisałeś przykład nie dla obiektów pobierających/ustawiających, ale raczej enkapsulacji –

+0

Getters i setery * to * enkapsulacja - to ich cały cel. –

+0

"Przeciągacze i setery są enkapsulacją" nie :) obiekty pobierające i setery przerywają enkapsulację. Enkapsulacja == obiekt nie przekazuje danych (właściwości) na zewnątrz. – smentek

1

@GolezTrol

Nie ma znaczek na temat PHP i nie masz racji. To, co opisujesz, nie ma nic wspólnego z ustawiaczami. Możesz wymusić wpisanie parametru (w PHP) za pomocą dowolnej metody nie tylko ustawiającej.

Można napisać:

setX(X $x){ ...} 
setY(Y $y){ ...} 

lub po prostu:

iAmMethodNotASetter(X $x, Y $y){ 

    //20lines of code here end then: 

    $this->x = $x; 
    $this->y = $y; 
    } 

jak widać nie muszę ustawiające wymusić typ właściwości obiektów.

A błąd rzucania w setera po sprawdzeniu typu zmiennej i tak jest zły. Jest to typowy błąd programistów, którzy przeszli z języka statycznie wpisanego na dynamiczny język.

Setery i zdobycze są KONWENCJONALNE i niczego nie egzekwują! Dziś zwykle używamy ich do tworzenia prostych starych obiektów Java. (POJO - w php word POPO) Jest to po prostu konwekcja (standard) do tworzenia obiektów, które mogą być używane między bibliotekami lub projektami.

Możesz łączyć seterów ze sprawdzaniem typu lub cokolwiek, ale nie sprawi, że będą one czymś więcej niż są.

O Encapsulation:

@ org.life.java - Jigar Joshi

"Główną zaletą/celem jest hermetyzacja ustawiaczy getter"

@Peter Aleksandra

"Powinieneś używać geterów i seter prawie wszędzie, w tym wewnątrz "klasy. Jeśli nie, to jesteś potencjalnie łamanie hermetyzacji”«pobierające i ustawiające są hermetyzacja»

Źle, źle, źle. Encapsulation nie ma nic wspólnego z pobierające i ustawiające i to jest bardzo częstym błędem, wiem, że wiele artykułów powtarzało to cały czas do góry nogami ...
Osoby pobierające i ustawiające nie pomagają hermetyzacji nawet gorzej, mogą przerwać hermetyzację. Robią tak, gdy używasz ich dane z obiektu zamiast proszenia obiektu o zrobienie czegoś dla ciebie z własnymi danymi.

Enkapsulacja == obiekt bierze pełną odpowiedzialność za swoje dane i nie podaje danych wiersza. A korzystanie z własności prywatnej nie jest czymś więcej, niż tylko publiczne upublicznianie tej własności == hamowanie enkapsulacji.

Chceck ustęp enkapsulacji: http://en.wikipedia.org/wiki/C%2B%2B lub http://en.wikipedia.org/wiki/Encapsulation_%28computer_science%29 Nawet jedno słowo o ustawiające lub pobierające ...

+0

Z wiki: "[Encapsulation is] Konstrukt językowy, który ułatwia wiązanie danych z metodami (lub innymi funkcjami) operującymi na tych danych." Programy pobierające i ustawiające to metody, które są dołączane do klasy i operują na jej danych. W każdym razie, dałem ci -1, ponieważ nie odpowiedziałeś na to pytanie i wysłałeś je tylko po to, by nękać innych. Użyj komentarzy do tego. –

+0

Możesz mi podać, co chcesz, po prostu proszę przeczytać książkę ... – smentek

+0

+ 1. Chociaż jesteś nieco spięty, przedstawiasz interesujący punkt widzenia. Muszę trochę więcej przeczytać na ten temat.dziękuję –

Powiązane problemy