Помогите разобраться с ООП?

kodzo

Новичок
Помогите разобраться с ООП?

Доброго здравия всем!!

Ребят, помогите разобратЬся с ООП. Короче набрал кучу литературу и документации, решил основателЬно понятЬ ООП, но оченЬ тяжко даётся. Наверно ещё не поспел, но надо же когда то начинатЬ. Я осознаю что работая с классами я оченЬ облегчил бы свою работу и сыкономил бы время, но что то уж оченЬ это запутанно.
У меня вот такой вапрос.
Где лучше создоватЬ запросы к базе даных, в сценрии или в классах? И как это выглядит на практике? Может кто нибудЬ показатЬ на примере?

Спасибо всем.
 

Фанат

oncle terrible
Команда форума
работая с классами я оченЬ облегчил бы свою работу и сыкономил бы время
это очень, очень спорное утверждение.

-~{}~ 01.02.06 13:06:

Где лучше создоватЬ запросы к базе даных, в сценрии или в классах?
можно попросить задать этот вопрос чуть подробнее?
 

kodzo

Новичок
Фанат
>>Где лучше создоватЬ запросы к базе даных, в сценрии или в классах?


ОченЬ рад что ты на форуме!
Подробнее.
Хочу сделатЬ класс который работал бы с базой данных (выводил продукт в браузер, удолял продукт с базы данных, изменял данные в бд. етс.)
Где лучше сделатЬ цон... и селект, в самом классе или в сценарии.
Хотя у меня нет никаких идей как к это будет выглядитЬ, просто я буду знатЬ с чего мне начинатЬ

-~{}~ 01.02.06 13:23:

Ой ошибка,

>>>Где лучше сделатЬ цон... и селект
Где лучше сделать connect и select from?

-~{}~ 01.02.06 14:24:

судя по ответам понял что задал не коректный вопрос...
 
kodzo
Для начала:
1. Распиши на бумажке что тебе нужно, по пунктам: Добавление, удаление и т.д.... (а так же в каком виде тебе нужны данные и откуда они берутся )
2. Постарайся найти как можно большее количество общего у всех этих вещей, тоже запиши, только отдельным скписком...

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

Alexandre

PHPПенсионер
а, еще лучше, постараться накидать диаграмму классов или взсамодействия на листке бумаги. Не обязательно эта должна быть диаграмма UML. Рисуй как понимаешь. Интуиция тебе подскажет.

Книжки лучше читать по теории ООП, типа http://www.books.ru/shop/books/56332 (классика ООП ) или
http://www.books.ru/shop/books/25832 наиболее популярная

Очень хорошо описано как правильно программировать на ООП

Так же рекомендую http://www.books.ru/shop/books/30436
очень помогает при наведении порядка в коде

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

-~{}~ 01.02.06 15:42:

Где лучше создоватЬ запросы к базе даных, в сценрии или в классах? И как это выглядит на практике? Может кто нибудЬ показатЬ на примере?
что понимать под сценарием, что классом, можно об этом подробнее

-~{}~ 01.02.06 15:44:

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

texrdcom

Новичок
kodzo
Делай так как тебе удобно, вот для удобно чтобы в одном месте были sql запроссы для опереции например для гостевой книги - раздел администрирования вот клас выглядет таким образом:
PHP:
<?php
/**
 * Администрирования гостевой модуль гостевой 
 *
 * @version v0,1b 
 */
class adminGustebook
{
/**
 * соединения с базой
 *
 * @var IdataBase
 */
	private $_db;

/**
 * Ид сообщения
 *
 * @var int
 */
	private $id_message;

	function __construct($_db)
	{
		//print_r($_POST);
		$this->_db=$_db;
		// добавим слеши
		$this->_db->add_slesh($_POST);
		if(isset($_POST['operation']))
		{
			$this->id_message=$_POST['id_message'];
			$operation=trim($_POST['operation']);
			if(!method_exists($this, $operation))
			{
				return;
			}
			call_user_func(array($this, $operation));
		}
		else
		{
			return;
		}


	}
/**
 * Удаляем сообщение
 *
 */
	function del()
	{
		$sql="DELETE FROM `gustebok_message` where `id_message`='$this->id_message'";
		$this->_db->sql_queri($sql);
		return;
	}
/**
 * Редактируем сообщение
 *
 */
	function edit_message()
	{
		$sql="UPDATE `gustebok_message` SET `message` = '".$_POST['textarea']."',
`date_edit` = NOW( ) WHERE `id_message` ='$this->id_message' LIMIT 1";
		$this->_db->sql_queri($sql);
		return;
	}
/**
 * Отвечаем на сообщение
 *
 */
	function re_message()
	{
		$sql="INSERT INTO `gustebok_re` (`id_re`, `id_message`, `admin_name`, `data`, `message`) VALUES ('', '$this->id_message', 'admin', NOW(), '".$_POST['re_message_text']."')";
		$this->_db->sql_queri($sql);
		$sql="UPDATE `gustebok_message` SET `re_admin` = '1',
`date_edit` = NOW( ) WHERE `id_message` ='$this->id_message' LIMIT 1";
		$this->_db->sql_queri($sql);
		return;
	}

}
?>
Про ооп можно прочитать много книг но применять его на практике трудно и еще Прав был Фанат на счет сомнений ефиктивности ооп для начинающих - писать с помощью классов - это не много другое чем програмировать с помощью ооп на практике добиться ефиктивности заявленной про ооп трудно и это приходит только с опытом ....
 

whirlwind

TDD infected, paranoid
> а, еще лучше, постараться накидать диаграмму классов или взсамодействия на листке бумаги. Не обязательно эта должна быть диаграмма UML.

Фигня этот UML на самом деле. В документации - да, а на этапе разработки нифига не годится. Потому что код много раз может поменяться, а в месте с ним придется перерисовывать всякие схемы. Тесты, вот что надо. И мыслить абстракциями.

Вот к пример как выглядит доступ к экземпляру определенного класса
PHP:
include_once("reference/group.class.php");

$obj = new Group;
$conn = DBConnectionManager::getConnection();
echo "Init ".get_class($obj).": ";
try {
	$conn->executeUpdate( $obj->getSqlCreateTable() );
	echo "ok\n";

	// make default groups
	$obj->make();
	$obj->f_system = true;
	$obj->f_active = true;
	$obj->name = "all";
	$obj->description = "All users";
	$obj->save();

}catch (SQLException $e){
	echo "fail\n";
//	echo $e->getMessage(),"\n";
}
Это инит БД, а в типовых случаях никаких экспекшенов, и никаких крейттейбл.

А это декларация вышезаюзанного класса
PHP:
include_once("orm/persistent.class.php");

class Group extends Persistent {
	
	protected function _registerAtoms(){
		parent::_registerAtoms();
		// primary attributes
		$this->_setAtom( "name" ,		new Atom_String(16),true );
		$this->_setAtom( "f_system",	new Atom_Boolean() );
		$this->_setAtom( "f_active",	new Atom_Boolean() );
		$this->_setAtom( "description",	new Atom_String(64) );		
	}

	protected function _onDelete(){
		if ( $this->f_system ){
			$this->log("%s::%s Couldn't delete system group: %s",
				ML_WARNING,__CLASS__,__FUNCTION__,$this->name);
			return false;
		}
		return true;
	}

}
По моему выглядит достаточно лаконично. И поведение объекта как и положено реализовано в классе. Это простой пример. Можно привести посложнее. Например User

PHP:
include_once("orm/persistent.class.php");
include_once("group.class.php");
include_once(dirname(__FILE__)."/../map/user_group.class.php");

class User extends Persistent {
	
	protected function _registerAtoms(){
		parent::_registerAtoms();
		// primary attributes
		$this->_setAtom( "login" ,		new Atom_String(16,3) ,true);
		$this->_setAtom( "password", 	new Atom_String(32,32) );		
		$this->_setAtom( "name",		new Atom_String(64) );
		$this->_setAtom( "email", 		new Atom_String(64)   ,true);
		$this->_setAtom( "registred",	new Atom_Timestamp() );
		$this->_setAtom( "f_active",	new Atom_Boolean() );

		// flags & secondaries
		$this->_setAtom( "signature",	new Atom_Text() );

		// other settings
	}

         // и методы

         // аутентификация на основе данных базовой авторизации
         public function authBasic($login,$password)

        // работа с группами (на основе объектов класса Group)
        public function addToGroup($v)
        public function inGroup($v)
        public function getGroupList()
        public function removeFromGroup($v)

        // переопределяем, что бы хешировать пароль при задании
        public function _set($name,$value)  

        // и поведение по умолчанию
	protected function _onInsert(){
		if ( !$this->login ){
			$this->setLastError("Login value must be defined");
			return false;
		}
		if ( !$this->name ){
			$this->name = $this->login;
		}
		return parent::_onInsert();
	}

	protected function _onUpdate(){
		return $this->onInsert();
	}

	protected function _onSave(){
		$this->addToGroup("all");
	}
В базовых классах скрыта вертикаль абстракций. Т.е. уходя в глубину иерархии наследования понятие нашего объекта расплывается.

Т.к. поведение объекта такого типа лишь косвено зависит от источника данных, никаких коннектов в иерархии. Для управления источниками данных мы абстрагируемся до уровня DSN. А нужный коннект нам выдает DBConnectionManager::getConnection() в который можно передать DSN.

И еще раз к тестам. Сначала мы пишем тест. Пусть это будет тест абстракции которой не существует, но этот тест четко описывает - что мы хотим получить от этого класса. Естественно мы хотим получить методы и атрибуты. Тест определяет что должно быть в классе, а сам класс реализует механизм. Иначе говоря тест это ответ на вопрос - что, а класс - ответ как (каким образом). Рассматривая проектирование с этой точки зрения трудно представить, как можно программировать без тестов. Вот и я не представляю :) Любое фатальное изменение класса отражается в тесте. Это значит что вам не придется искать "гдежев этойгребаннойкучемалескрылсябаг". Так как каждому классу соответствует свой тест (unittest,unitcase), набор тестов можно рассматривать как схему вашей системы. При чем эта схема однозначно и точно говорит о актуальности кода (в отличии от всяких схем, которые могут быть исправлены не зависимо от кода).

Кароч, я могу продолжать долго и примеров могу привести массу :) но основная мысль - это учиться программировать не модульно или объектно-ориентировано, а test driven. А начать можно и отсюда
http://phpclub.ru/faq/wakka.php?wakka=TDD&v=155f
 

Фанат

oncle terrible
Команда форума
kodzo
Слушай whirlwind-а - он правильные вещи говорит!
А послушав - подумай хорошенько, сколько времени тебе сЫкономит ООП.
 

texrdcom

Новичок
whirlwind
Какую книгу рус можеш посоветовать по TDD ?
p/s
хотя я и не применяю на практике четко tdd
но со временем дошел сам к чему то подобному :)
 

Denix

Новичок
Автор оригинала: texrdcom
whirlwind
Какую книгу рус можеш посоветовать по TDD ?
p/s
хотя я и не применяю на практике четко tdd
но со временем дошел сам к чему то подобному :)
Тут список не плохой:
http://phpclub.ru/faq/wakka.php?wakka=TDD/TDDBooks&v=y4q

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

Alexandre

PHPПенсионер
Фигня этот UML на самом деле. В документации - да, а на этапе разработки нифига не годится.
На счет Фигни не согласен, помогает сосредоточиться мыслями - если, правда, в этом смыслишь...
Потому что код много раз может поменяться, а в месте с ним придется перерисовывать всякие схемы.
для этого есть разные инструменты. UML очень помогает на этапе проектирования, когда еще ни чего не написано
Тесты, вот что надо. И мыслить абстракциями.
Тесты рулят однозначно

-~{}~ 01.02.06 17:27:

Про ооп можно прочитать много книг но применять его на практике трудно и еще Прав был Фанат на счет сомнений ефиктивности ооп для начинающих - писать с помощью классов - это не много другое чем програмировать с помощью ооп на практике добиться ефиктивности заявленной про ооп трудно и это приходит только с опытом ....
texrdcom, вот именно, после прочтения базовых книг (я их указал) приходит понимания про применение ООП на практике. По этому, советую начать с Фаулера - чисто практическая книга.
 

whirlwind

TDD infected, paranoid
texrdcom Какую книгу рус можеш посоветовать по TDD

Весь прикол в том, что для этого не надо читать книг. Это очень хорошая технология, потому что она не требует особых усилий и времени для изучения. Есть одно правило которое надо соблюдать - сначала тест, потом класс или тест одновременно с классом, но никак не класс, а потом тест (потому что в большинстве случаев на тест просто забиваешь). Вводной статьи, что здесь на сайте (правда там не очень удачные примеры) и мануала к системе тестирования предостаточно. Все остальное можно только советовать. Никто не напишет тест к своему классу лучше, чем это сделает разработичик класса. Да и тесты можно писать по разному. Главное что бы они были достаточно полными и желательно не избыточными. А уж планируете вы проектировать тест как документацию, или же вам важно проверить исключительно отработку - дело пятое.
 
Frol
Почему следует делать имеено так - очень хорошо написано в книге "Экстремальное программирование", автора не помню, дома посмотрю... ;-)
 

Гравицапа

elbirret elcno
насчёт TDD in PHP
могу порекомендовать
PHP|ARCHITECT’S GUIDE TO PHP DESIGN PATTERNS
by Jason E. Sweat
на английском правда,...но написано достаточно понятно и богато примерами
 

WayBe

Новичок
А есть-ли что-нить в электронном виде по данному вопросу?
И ещё вопрос - по сабжу. Действительно-ли классы УДОБНЕЕ чем привычный процедурный подход?
 
Сверху