Взаимодействие с внутренними объектами - PullRequest
0 голосов
/ 11 ноября 2010

Я работаю над системой регистрации дел.К каждому случаю могут быть прикреплены комментарии, поэтому я собираюсь создать класс Case и класс Comment и встроить объект Comment в класс Case.

Я думаю о том, как предоставить интерфейс для встроенного объекта Comment.Я мог бы сделать его общедоступным членом и позволить программисту обращаться к нему напрямую ($case -> comment -> addComment()) или сделать его закрытым и поместить методы в класс Case, чтобы обеспечить доступ к комментариям через объект Comment (p ublic function addComment () { return ($this -> comment -> addComment ()); }).

Если подумать, последний стиль будет означать, что объект Case становится зависимым от объекта Comment.Однако в первом случае программист может сделать что-то, например, сделать свойство comments комментариев объекта-ссылки Case, которые не принадлежат случаю, или даже элементам, которые не являются объектами комментария!

Из двух подходов, который считается лучшим?

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Я не совсем понимаю, что вы имеете в виду, но ...

Я думаю, вам нужно что-то вроде этого:

class Case {
    private $comment;

    public function getComment() {
        // Add some checks if necessary
        ...
        return $this->comment;
    }

    public function addComment(Comment $comment) {
        // Add some checks if necessary
        ...           
        $this->comment = $comment;
    }
}

Вы также можете выбрать защиту своего комментария. Это особенно полезно, если вы хотите расширить объект.

Всегда широко используйте инкапсуляцию, это одно из самых больших преимуществ ООП. Всегда целесообразно сделать свойство класса защищенным или частным. Без этого вы не сможете принудительно проверять его, когда устанавливаете свойства. Имейте в виду, что если вы сделаете свойство общедоступным, каждый класс сможет получить к нему доступ и изменить его без каких-либо проверок. Подумайте о возможных последствиях этого!

$ comment не примитивный тип, это ссылка на экземпляр комментария clas

Удачи!

@ Гордон: Не имеет значения. Даже если это экземпляр Комментария, и вы делаете его публичным, вы все равно можете сделать что-то вроде:

// $Case is a Case object, doh ;)...
$Case->comment = "Just a string value";

И вдруг ваш комментарий является примитивным типом, в то время как вы ожидаете экземпляр класса Comment ... Это может привести к нескольким ошибкам. Если вы сделаете это защищенным или частным свойством, строка кода будет просто невозможна вне класса. Тогда вы вынуждены использовать для него сеттер, например:

public function setComment(Comment $comment) {
    ...
}

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

@ Гордон: Это не метод класса Comment, который вы строите в своем классе Case. Описанные выше методы необходимы только для вашего класса Case. Единственное, что они делают - это получение объекта Comment, который принадлежит классу Case, и Setting объекта Comment, который принадлежит классу Case. После того, как вы успешно получили объект Comment с помощью метода get, вы можете запустить все открытые методы, определенные в вашем классе Comment. Так что он ничего не делает с самим объектом Comment.

Ваш комментарий все еще полностью независим. Связь между этими объектами (скорее всего) сохраняется в таблице объекта Case. Ваш класс Case является единственным классом, который знает об отношениях. Таким образом, вы все еще можете повторно использовать свой класс Comment для других целей.

Ваш класс Case должен каким-то образом знать ваш класс Comment, и это путь!

Кстати, рассмотрим отношения многие ко многим. Я полагаю, что дело может иметь более одного комментария.

Удачи!

1 голос
/ 11 ноября 2010

Класс Case должен иметь свои собственные методы для добавления / удаления комментариев. Это позволяет вам изменить способ реализации комментариев в будущем. Вы можете использовать эти методы, просто заключая вызовы в ваш класс Comment сейчас, но полностью измените его в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...