Автор Тема: Посоветуйте, как правильно сделать (ООП)  (Прочитано 10402 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
У меня имеется класс DB, для работы с БД.
Есть другой класс, который в данный момент является extends по отношению к DB:

class DB{
...
}

class OUTPUT extends DB{
...
}

Вот. Почему extends? потому, что в классе OUTPUT (это форматирование информаци перед разного рода выводом) имеется 1 метод из класса DB.

Получается, что в своих сценариях я запускаю либо DB, либо OUTPUT, в зависимости от того, нужно ли будет данные перед отправкой клиенту форматировать или нет.

Вот я и не уверен, правильно ли я делаю.. Может какие-нибудь другие способы есть вызвать метод класса DB из класса OUTPUT? Хотя с другой стороны, удобно инициализировать лишь OUTPUT

$myDB = new OUTPUT();

а не вызывать сначала класс DB, а потом и OUTPUT... Вобщем не знаю...

Оффлайн Croaker

  • Модератор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 927
  • +0/-0
  • 0
    • Просмотр профиля
    • http://alex-files.ru
Посоветуйте, как правильно сделать (ООП)
« Ответ #1 : 04 Мая 2005, 14:02:37 »
Алексей

extends - ключевое слово. Наследование. Т.е. класс OUTPUT должен расширять класс DB, а не использовать.

Наследование может быть необходимо, если DB - это некий абстрактный класс для работы с базами данных вообще, а класс OUTPUT реализует, к примеру, работу с отдельно взятой СУБД (aka MySQL).

Если класс OUTPUT только использует методы класса DB, а не дополняет класс своими методами, то лучше использовать не наследование, а просто добавить в класс OUTPUT ссылку на класс DB. Например так:


class DB {

}

$dbh = new DB;

class 
OUTPUT {

    var 
$dbh;

    function 
OUTPIT($dbh) {
       
$this->dbh $dbh;
    }

}

$out = new OUTPUT(&$dbh);

Не все коту матрица.

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Посоветуйте, как правильно сделать (ООП)
« Ответ #2 : 04 Мая 2005, 14:40:41 »
Croaker
понял, спасибо. Ща попробую разобраться..

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Посоветуйте, как правильно сделать (ООП)
« Ответ #3 : 04 Мая 2005, 14:41:53 »
Алексей
ты случайно не по статьям курепина учился ?



Цитировать
Croaker:
class DB {

}

$dbh = new DB;

class OUTPUT {

var $dbh;

function OUTPIT($dbh) {$this->dbh = $dbh; }

}

$out = new OUTPUT(&$dbh);

ИМХО правильнее :

class OUTPUT {

    var 
$dbh;

    function 
OUTPIT(&$dbh) {
       
$this->dbh = &$dbh;
    }

$out = new OUTPUT($dbh);

твой код выдает warning при allow_call_time_pass_reference = Off в пхп4. В остальном все верно.
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Croaker

  • Модератор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 927
  • +0/-0
  • 0
    • Просмотр профиля
    • http://alex-files.ru
Посоветуйте, как правильно сделать (ООП)
« Ответ #4 : 04 Мая 2005, 14:49:24 »
Макс
Не знал. По логике вещей код

 
function OUTPIT(&$dbh) {
       
$this->dbh = &$dbh;
    } 


Объявляет $this->dbh ссылкой на ссылку на объект. Не? Я не сильно в этом вопросе шарю. =\\
Не все коту матрица.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Посоветуйте, как правильно сделать (ООП)
« Ответ #5 : 04 Мая 2005, 14:51:38 »
Croaker
все верно.
Ведь нам в скрипте  не надо 2 экземпляра объекта соединения с БД
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Croaker

  • Модератор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 927
  • +0/-0
  • 0
    • Просмотр профиля
    • http://alex-files.ru
Посоветуйте, как правильно сделать (ООП)
« Ответ #6 : 04 Мая 2005, 14:54:02 »
Макс
Не надо. Но откуда два экземпляра, если мы ссылку передаем изначально? По логике вещей в классе OUTPUT пользуем ссылку на единственный объект. Откуда второй берется?
Не все коту матрица.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Посоветуйте, как правильно сделать (ООП)
« Ответ #7 : 04 Мая 2005, 15:02:39 »
1. Почему код $a = call_some_func(&$var)
считается некачественным ?
Потому что внутри функции call_some_func() нельзя определить, имеем ли мы дело с переменной или с ссылкой на нее.

2. если писать function call_some_func(&$var) {
   
$b = &$var
}

то мы точно будем иметь дело именно со ссылкой, а не со значением

3. В обсуждаемом случае второй объект (копия объекта) появится если не писать & в конструкторе :function OUTPIT(&$dbh) {
       
$this->dbh = &$dbh;
    }
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Croaker

  • Модератор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 927
  • +0/-0
  • 0
    • Просмотр профиля
    • http://alex-files.ru
Посоветуйте, как правильно сделать (ООП)
« Ответ #8 : 04 Мая 2005, 15:07:48 »
Макс
Спасибо :)

Цитировать
Макс:
утри функции call_some_func() нельзя определить, имеем ли мы дело с переменной или с ссылкой на нее


вот этого не знал.
Не все коту матрица.

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Посоветуйте, как правильно сделать (ООП)
« Ответ #9 : 04 Мая 2005, 16:41:45 »
Макс
нет, я его не читал.

так как правильно?

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Посоветуйте, как правильно сделать (ООП)
« Ответ #10 : 04 Мая 2005, 17:01:45 »
Цитировать
Алексей:
так как правильно?

так как написал  Croaker с моими поправками.
Мои правки носят чисто технический характер. С точки зрения идеологии ООП Croaker все верно написал
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Посоветуйте, как правильно сделать (ООП)
« Ответ #11 : 08 Августа 2005, 11:23:39 »
Опять я возвращаюсь к этой теме.
Вообщем, я понял что и как и куда, зачем ссылки нужны тут, вот что получается:


class DB {
//........
}

class 
OUTPUT {

    var 
$dbh;

    function 
OUTPUT(&$dbh) {
       
$this->dbh = &$dbh;
    }
}

// вызываю
$dbh = new DB//сначала главный класс
$out = new OUTPUT($dbh); //потом класс обработки информации




Теперь я не понимаю, как мне со всем этим работать. раньше был экземпляр лишь одного класса. Теперь я инициализирую 2 класса, и для каждого действия приходится работать с определённым классом.

Т.е. раньше было:


$myDB
= new DB;
// работаем с функцией класса DB - делаем SQL запрос
$data $myDB->get_rezar("SELECT .........");
// работает с функцией класса OUTPUT, которая использует в своём теле функции из класса DB
$data $myDB->replace_template($data);


а теперь как?
воот что получается (неудобно!)


$mainDB 
= new DB;
$myDB = new OUTPUT($mainDB);

// работаем с классом DB - делаем SQL запрос
$data $mainDB->get_rezar("SELECT .........");
// работаем с классом OUTPUT
$data $myDB->replace_template($data);


это правильно? но это чертовски нудобно. инициазизация 2 классов + работа с разными классами.... или я что-то не так сделал?
« Последнее редактирование: 08 Августа 2005, 12:42:39 от Алексей »

Оффлайн sarutobi

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 61
  • +0/-0
  • 0
    • Просмотр профиля
Посоветуйте, как правильно сделать (ООП)
« Ответ #12 : 08 Августа 2005, 23:44:36 »
Алексей
Так в этом идеология ООП и заключается. Класс MainDB ничего не знает о том, что будет происходить с данными, которые он возвращает. Он только знает, что взять и как вернуть. Класс MyDb вообще не интересует, откуда взялись данные. Он единственное что умеет - сделать обработку получаемых данных. У тебя (пока) не совсем праильная архитектура классов. Если я правильно поинмаю то что тебе надо, то написать надо так:

$mainDb 
= new Db();
$result = new MyDb();
$data $result->replace_template($mainDB->getRezar());

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Посоветуйте, как правильно сделать (ООП)
« Ответ #13 : 09 Августа 2005, 10:48:34 »
sarutobi
понятно, спасибо.

Оффлайн Алексей

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 176
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Посоветуйте, как правильно сделать (ООП)
« Ответ #14 : 09 Августа 2005, 13:37:28 »
Люди! Я решил всё на PHP 5 писать.
Насколько я понял, мне теперь просто нужно знаки амперсанд убрать, т.к. в 5 версии мы работаем не с копией, а с сылкой, т.е.:

 
class DB {
//........
}

class 
OUTPUT {

    var 
$dbh;

    function 
OUTPUT($dbh) {
       
$this->dbh $dbh;
    }
}

// вызываю
$dbh = new DB//сначала главный класс
$out = new OUTPUT($dbh); //потом класс обработки информации

да?

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28