Подтвердить что ты не робот

Стоит ли создавать и устанавливать методы в ООП?

Я видел некоторые проекты, в которых классы имеют методы get и set для управления данными вставки. Позвольте мне привести пример:

    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);
    }
}

Выше приведен пример класса, который я видел. Ниже приведен процесс их использования:

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

$studen->UpdateStudent();

Стоит ли так делать? Я лично считаю, что бесполезно устанавливать поле, а затем получать и обновлять записи. Это действительно занимает много времени, чтобы сделать это для каждого модуля. Каков наилучший способ справиться с такой вещью? Существует ли какая-либо безопасность в этом отношении?

4b9b3361

Ответ 1

Стоит ли так делать?

Это зависит.

Абстрагирование поля от пользователя путем воздействия на "умное" свойство (т.е. геттер и/или сеттер) имеет два недостатка:

  • Вам нужно написать больше кода; если свойство действительно не делает ничего умного, это код, который ничего не полезен.
  • Пользователь свойства немного неудобен, потому что он должен ввести еще немного.

И у него есть одно преимущество:

  • В будущем вы можете добавить логику к свойствам, даже если раньше не было ничего, кроме кода пользователя.

Если это преимущество имеет смысл (например, вы пишете многократно используемую библиотеку программного обеспечения), тогда имеет смысл писать свойства вместо голых полей. Если нет, вы делаете работу без пользы.

Каков наилучший способ справиться с такой вещью?

Вы можете переопределить магические функции __get и __set (возможно, в базовом классе, чтобы вы могли наследовать переопределение), чтобы автоматически перенаправлять доступ к свойствам вашим получателям и сеттерам. Упрощенный код:

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);
}

Предостережение emptor: Так как __get и __set переопределены, __isset и __unset также должны быть переопределены!

Есть ли какая-либо защита, которая делает это таким образом?

Нет, нет вообще (если вы не вставляете ошибки случайно).

Ответ 2

В языках, не имеющих свойств (public member "переменные", которые фактически приводят к вызовам функций) с использованием getter/seters вместо общедоступных переменных, обычно рекомендуется. В противном случае вы не сможете добавить логику (например, при установке переменной) позже, если люди уже используют ваше простое поле.

Поскольку PHP - такой язык (к сожалению), ответ да, используйте их.

Ответ 3

Создание сеттеров и геттеров помогает обеспечить инкапсуляцию ООП. Я не уверен в PHP, но для многих других языков (Java, С++) хорошая среда IDE (eclipse/netbeans) автоматически сгенерирует эти сеттеры и геттеры для вас.

Это может быть не сразу очевидным для простых типов, но если необходимо выполнить какую-либо более сложную обработку, это становится более очевидным.

Ответ 4

Пример того, почему иногда использовать геттеры и сеттеры: у меня есть код, который устанавливает значение в 200 разных файлах:

$cat->name = 'Fery'          // in file one
$favoriteCat->name = 'Tery'  // in another file
$fatCat->name = 'jery'             // in another file
// 200 more calls in alot of places

Представьте, что у клиента неожиданно появилось новое требование: "Все имена кошек должны быть добавлены" Sweet "

Теперь мы должны найти все объявления кошек и заменить их назначения:

$cat->name = 'Sweet '.'Fery'
// times 200   

С другой стороны, если мы использовали метод setter, все, что нам нужно сделать, это добавить код для добавления "Sweet" в одном месте:

public function setCatname($catname)
{
  $this->catName = 'Sweet ' . $catname;
}