ФорумПрограммированиеPHP для идиотовPHP и ООП → построение классов

построение классов

  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 14 августа 2008 г. 16:12, спустя 4 часа 22 минуты 38 секунд

    А если передать аргументом, то такого не будет?

    Если передать аргументом, то это проблема передающей стороны, а не класса. У класса есть интерфейс и если внешний код его придерживается, то класс нормально работает и ни на что не заморачивается.
    В случае глобальной переменной поведение класса завязывается на какое-то конкретное внешнее окружение.
  • Trej Gun

    Сообщения: 5302 Репутация: N Группа: в ухо

    Spritz 14 августа 2008 г. 17:54, спустя 1 час 42 минуты 29 секунд

    Timur, sap, я не спорю про ссылки просто говорю что иногда они могут вести себя не так как хочет автор

    vasa_c все правильно сказал
  • Patrick

    Сообщения: 506 Репутация: N Группа: Кто попало

    Spritz 14 августа 2008 г. 18:27, спустя 32 минуты 17 секунд

    Patrick, читали, ты же не хочешь сказать что я должен засетить базу в обьект чтобы база выполнила над ним действие?

    в коде плиз, или по подробней!
  • Trej Gun

    Сообщения: 5302 Репутация: N Группа: в ухо

    Spritz 19 августа 2008 г. 7:15, спустя 4 дня 12 часов 47 минут

    инверсия зависимостей это когда у тебя объект более высокого уровня зависит от реализации объектов более низкого уровня


    class KeyboardReader{
    function __constructor(){

    }
    function readKeyboard(){

    }
    }

    class FileWriter{
    function __constructor(){

    }
    function writeFile($data){

    }
    }

    class Copier{
    public function copy(new KeyboardReader(),new FileWriter()){
    while ( ($data = $reader->readKeyboard()) !== false )
    {
     $writer->writeFile($data);
    }
    }
    }


    вобщем реюзнуть класс  Copier у вас в другом контексте не выйдет
    а инверсия зависимостей уберает эту зависимость, вобщем масло масленое и маргарин


    class Reader implement Reader{
    function __constructor($outputStream){

    }
    function read(){

    }
    }

    class Writer implement Writer{
    function __constructor($inputStream){

    }
    function write($data){

    }
    }

    class Copier{
    public function copy(new Reader(new FileOutputStream('file1.txt')),new Writer(new FileInputStream('file2.txt'))){
    while ( ($data = $reader->read()) !== false )
    {
     $writer->write($data);
    }
    }
    }


    это пассивная инверсия зависимостей c "впрыском в конструктор" (простите не силен в русской терминологии на англиском звучит как constructor injection)

    так вот если применять эту хрень к базе и какому-либо-объекту


    class SomeClass{
    public function saveData($db){
    $db->save($this);
    }
    }


    то получаеться такая замечательная хрень что база должна знать как сохранить объект
    но вобщем вопрос был не об этом а о том что лучше делигирование через впрыск (делигирование через создание нового экземпляра меня тоже не интересует) или паттерн локатор (регистр)
  • Patrick

    Сообщения: 506 Репутация: N Группа: Кто попало

    Spritz 19 августа 2008 г. 14:21, спустя 7 часов 5 минут 57 секунд


    class Model{
    protected $id
    public function setId($value)
    {
    $this->id = $value;
    }
    public function getId()
    {
    return $this->id;
    }
    }

    class Mapper
    {
    protected $db;
    public function__construct()
    {
    $this->db = Toolkit::Instanse()->getDataBaseConnection();
    }
    public function Save($object)
    {
    $data = $this->ExportObject($object)
    if($object->getId() == -1)
    {
    $this->db->insert($data);
    }else{
    $this->db->update($data);
    }
    }
    }


    ExportObject - преобразует объект в массив field_name => value

  • Patrick

    Сообщения: 506 Репутация: N Группа: Кто попало

    Spritz 19 августа 2008 г. 14:21, спустя 28 секунд

    у меня вообщем так ;)
  • Trej Gun

    Сообщения: 5302 Репутация: N Группа: в ухо

    Spritz 19 августа 2008 г. 14:34, спустя 13 минут 11 секунд

    нехрена не понял зачм в примере класс Model

    а из мапера понял что ты используешь и делигирование и локатор

    $this->db = Toolkit::Instanse()->getDataBaseConnection();
  • Patrick

    Сообщения: 506 Репутация: N Группа: Кто попало

    Spritz 19 августа 2008 г. 16:33, спустя 1 час 58 минут 47 секунд

    блин немного не дописал

    $model = new Model();
    // тут присваевам свойства
    $mapper = new Mapper();
    $mapper->Save($model);
  • Trej Gun

    Сообщения: 5302 Репутация: N Группа: в ухо

    Spritz 20 августа 2008 г. 2:42, спустя 10 часов 9 минут 13 секунд

    вобще я ожидал размышелений о том что если в более 50% (или в частоиспользуемых) методах есть вызовы БД то тогда делигирование, если же бд вызываеться редко то можно и локатор применять, или чтото типа этого

Пожалуйста, авторизуйтесь, чтобы написать комментарий!