2012-05-16 5 views
12

Widziałem kilka projektów, w których klasy mają uzyskać i ustawić metody manipulowania danymi wstawiania. Pozwól mi mieć przykład tutaj:Czy warto tworzyć i ustawiać metody w OOP?

class Student extends dbClass 
{ 
    private $TableID; 
    private $FullName; 
    private $Gender; 
    private $Address; 




    function setTableID($Value) 
    { 
     $this->TableID = $Value; 
    } 

    function getTableID() 
    { 
     return $this->TableID; 
    } 

    function setFullName($Value) 
    { 
     $this->FullName = $Value; 
    } 

    function getFullName() 
    { 
     return $this->FullName; 
    } 

    function setGender($Value) 
    { 
     $this->Gender = $Value; 
    } 

    function getGender() 
    { 
     return $this->Gender; 
    } 

    function setAddress($Value) 
    { 
     $this->Address = $Value; 
    } 

    function getAddress() 
    { 
     return $this->Address; 
    } 


    function UpdateStudent() 
    { 
     $sql = "UPDATE INTO usertable SET 
     FullName = '".$this->getFullName()."', 
     Gender = '".$this->getGender()."', 
     Address = '".$this->getAddress()."' 
     where TableID='".$this->getTableID()."'"; 
     $this->query($sql); 
    } 
} 

Powyżej znajduje się przykładowa klasa, którą widziałem. Poniżej znajduje się opis sposobu ich używania:

$student = new Student; 
$student->setTableID = 1; 
$student->setFullName('My Name'); 
$student->setGender('Male'); 
$student->setAddress('this is my address'); 

$studen->UpdateStudent(); 

Czy warto to robić w ten sposób? Osobiście uważam, że nie ma sensu ustawiać pola, a następnie pobierać i aktualizować w nim zapisy. Zrobienie tego w każdym module zajmuje naprawdę dużo czasu. Jaki jest najlepszy sposób na radzenie sobie z takimi rzeczami? Czy istnieją jakieś zabezpieczenia w ten sposób?

+1

Modyfikatory dostępu (takie jak "prywatne") są często źle interpretowane jako funkcja bezpieczeństwa. W obecnym inkarnowaniu w C++ zamierzali ograniczyć ekspozycję ABI (nie API); co nie jest tak istotne dla PHP i języków skryptowych. Wymaganie ustawiających i pobierających jest często efektem ubocznym, ale nie jest obiektowe. Zobacz także [PHP Getters and setters: evil or necessary evil?] (Http://berryllium.nl/2011/02/getters-and-setters-evil-or-necessary-evil/) oraz [Java: Getters and setters are evil] (http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html) – mario

+0

możliwy duplikat [Czy to naprawdę źle, nie używając ustawiaczy i pobierających?] (http: // /stackoverflow.com/questions/808348/is-it-really-that-wrong-not-using-setters-and-getters) – mario

Odpowiedz

10

Czy warto to robić w ten sposób?

To zależy.

Abstrahując pole z użytkownikiem poprzez wystawienie „inteligentny” własności (tj getter i/lub setter) ma dwie wady:

  1. Musisz napisać więcej kodu; jeśli właściwość nie robi nic inteligentnego, jest to kod, który nie przynosi niczego pożytecznego.
  2. Użytkownik nieruchomości jest nieco niedogodny, ponieważ musi również wpisać trochę więcej.

I ma jedną zaletę:

  1. W przyszłości można dodać logikę właściwości, nawet jeśli nie było nikogo przed bez łamania kodu swoich użytkowników.

Jeśli ta przewaga jest znacząca (np. Piszesz bibliotekę oprogramowania do wielokrotnego użytku), wówczas warto wpisywać właściwości zamiast pustych pól. Jeśli nie, wykonujesz pracę bez żadnych korzyści.

Jaki jest najlepszy sposób na radzenie sobie z takimi rzeczami?

Można zastąpić magiczne __get i __set funkcje (w klasie bazowej może więc można odziedziczyć nadpisanie również) do przodu nieruchomość automatycznie uzyskuje dostęp do pobierające i ustawiające. Kod uproszczony:

public function __get($name) { 
    $getter = 'get'.$name; 
    if (method_exists($this, $getter)) { 
     return $this->$getter(); 
    } 

    $message = sprintf('Class "%1$s" does not have a property named "%2$s" or a method named "%3$s".', get_class($this), $name, $getter); 
    throw new \OutOfRangeException($message); 
} 

public function __set($name, $value) { 
    $setter = 'set'.$name; 
    if (method_exists($this, $setter)) { 
     return $this->$setter($value); 
    } 

    $getter = 'get'.$name; 
    if (method_exists($this, $getter)) { 
     $message = sprintf('Implicit property "%2$s" of class "%1$s" cannot be set because it is read-only.', get_class($this), $name); 
    } 
    else { 
     $message = sprintf('Class "%1$s" does not have a property named "%2$s" or a method named "%3$s".', get_class($this), $name, $setter); 
    } 
    throw new \OutOfRangeException($message); 
} 

Caveat emptor: Od __get i __set są zastępowane, __isset i __unset powinny zostać zastąpione, jak dobrze!

Czy są jakieś zabezpieczenia w ten sposób?

Nie, brak (zakładając, że nie wstawiasz błędów przypadkowo).

+0

Nie sądzę, że będzie w nim jakaś logika przyszłości. Ludzie w mojej nowej firmie używają tego do zwykłej bazy danych. Uważają, że jest bezpieczny. Nie wiem, jak to zabezpieczać. –

+2

@Salman Khimani: Ludzie są bardzo źli w przewidywaniu przyszłości. Jeśli jest to kod firmy, idź do pobierających i ustawiających i nie oglądaj się za siebie. – Jon

1

Tworzenie seterów i modułów pobierających pomaga w egzekwowaniu hermetyzacji OOP. Nie jestem pewien dla PHP, ale dla wielu innych języków (Java, C++), dobry IDE (eclipse/netbeans) automatycznie wygeneruje te ustawiające i pobierające dla ciebie.

Może nie być od razu oczywiste w przypadku typów prostych, ale jeśli konieczne jest przeprowadzenie bardziej skomplikowanego przetwarzania, staje się bardziej oczywiste.

+0

Nie poprawiają one hermulacji OOP, ale raczej stanowią obejście dla braku * właściwości * w języku. – ThiefMaster

+0

@ThiefMaster, myślę, że to naprawdę pomaga, jeśli jakikolwiek logiki/przetwarzania jest konieczne do przechowywania wartości. – Brady

+0

Tak, ale nadal stanowią nieprzyjemne obejście. W Pythonie można na przykład użyć publicznych vars i po prostu utworzyć właściwość * * (która uzyskuje dostęp do niestandardowych funkcji pobierających/ustawiających), jeśli potrzebna jest dodatkowa logika. W języku C# utworzysz właściwości i albo pozwól kompilatorowi stworzyć "prosty" program pobierający/ustawiający dla niego wewnętrznie (nigdy ich nie widzisz i nie są to rzeczywiste funkcje, które możesz wywołać bezpośrednio) i jeśli kiedykolwiek potrzebujesz niestandardowej logiki, po prostu implementujesz te funkcje samemu. Jednak dostęp do własności - bez względu na to, czy istnieją programy pobierające/ustawiające, czy nie - jest zawsze wykonywany poprzez 'obj.prop' jak zmienna – ThiefMaster

5

W językach, które nie mają właściwości (publiczne "zmienne", które faktycznie prowadzą do wywoływania funkcji) zwykle zaleca się używanie getter/setters zamiast publicznych zmiennych. W przeciwnym razie nie można dodawać logiki (np. Podczas ustawiania zmiennej) później, jeśli ludzie już używają zwykłego pola.

Ponieważ PHP jest takim językiem (niestety) odpowiedź brzmi: tak, użyj ich.

Powiązane problemy