X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Объектная ориентация
Arks
Arks
Topic Starter сообщение 24.4.2010, 22:09; Ответить: Arks
Сообщение #1


Имеет ли смысл заимствовать структуру серверных сценариев от C#-подобных языков в
которых без наличия класса и муха не пролетит?
Многие считают что использование классов необходимо лишь для реализации наследования, т.е. когда набор параметров объекта выходит за рамки обычных переменных и процедур.
Но, как показывает жизнь, в проектах в которых все не ограничивается в сумме 100 строчками кода, данная практика заметно облегчает восприятие кода и алгоритмов не только другими людьми, но и подчас самим программистом.
Как вы относитесь к написанию скрипта с использованием только объектной ориентации. Поясню на примере:
Вот, дают нам проект, реализовать.. ну скажем.. социальную сеть типа ВК или какую-нибудь CRM
Мы, отойдя от классических канонов не бежим программировать абы как, но чтобы работало - а садимся придумывать классы и все возможные свойства каждого объекта: юзера, группы, файла, категории - кароче любой классификации которую можем подобрать под ТЗ. Потом думаем что с каждым из свойств может во время работы скрипта происходить в базе и пишем соответствующие функции, также оформляя их как классовые свойства. Смотрим на то что получилось - и вооля! :evrika: остается лишь сделать юзер-интерфейс и прикрепить к ниму классовые свойства. :goodpost:
Человек, даже если он не программист, открыв такой код сразу поймет что за что отвечает, ему достаточно объяснить что такое классы, свойства и методы.

Чтобы не быть голословным, приведу пример подобной бячки:

Classes.php у нас будет к примеру хранилищем кода программы:
[PHP]<?php
class base{
private $host;
private $user;
private $pass;
private $base;
private $encoding;
private $linka;
function __construct(){
$this->host="localhost";
$this->user="root";
$this->pass="pass";
$this->linka=mysql_connect($this->host,$this->user,$this->pass) or die ("Ошибка подключения");
$this->base="test";
mysql_select_db($this->base,$this->linka) or die ("Ошибка выбора базы");
$this->encoding="utf8";
mysql_query("SET NAMES ".$this->encoding,$this->linka) or die("Ошибка кодировки");
}
function query($que){
return mysql_query($que) or die(mysql_error());
}
}
class user{
public $ID; //Номер
public $login; //Логин
public $mailadr; //Е-мейл
public $group; //Группа(права доступа)
public $place; //Место жительства
public $birthday; //День Рождения
public $password; //Хеш пароля
function register(){
base::query("INSERT INTO user (`login`,`mailadr`,`group`,`place`,`birthday`,`password`) VALUES ('".$this->login."','".$this->mailadr."','".$this->group."','".$this->place."','".$this->birthday."','".md5(md5($this->password))."')");
}
}
?>
[/PHP]

А вот сам обработчик формы регистрации(приведено без серверных проверок корректности т.к. они у всех разные):
[PHP]
<?php
include("classes.php");
$base=new base();
$user=new user();
$user->login=$_POST['loginreg'];
$user->mailadr=$_POST['mailadrreg'];
$user->group='user';
$user->place=$_POST['placereg'];
$user->birthday=$_POST['birthdayreg'];
$user->password=$_POST['passreg'];
$user->register();
header("Location: ./");
?>
[/PHP]
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Apay
Apay
сообщение 24.4.2010, 23:08; Ответить: Apay
Сообщение #2


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

з.ы.
прпиведенный пример содерхит три недостатка:

1) при неудаче sql запросов нет никакой обработки ошибок

2) явная ошибка: query вызывается как метод класса а не как метод объекта. в данном случае все сработает, но это системная ошибка

3) в случае использования классов желательно до минимума сократить прямое обращени к полям, лучше все это (инициализацию) завернуть в один метод

но в целом подход верен
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
Topic Starter сообщение 25.4.2010, 8:29; Ответить: Arks
Сообщение #3


2) явная ошибка: query вызывается как метод класса а не как метод объекта. в данном случае все сработает, но это системная ошибка
Потому что мы не знаем(условно) какой именно объект инициализирует программист. Вы видите другой выход из ситуации?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Apay
Apay
сообщение 25.4.2010, 8:44; Ответить: Apay
Сообщение #4


другой выход:

[PHP]class DB {
function __construct(){ ... }
function& getDB(){
static $instance;
if( !isset($instance) ) $instance = new DB();
return $instance;
}
function query( ... ){ ... }
...
}

class user{
...
function register(){
$db =& DB::getDB();
$db->query( ... );
}
}
[/PHP]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
r3ntg3n
r3ntg3n
сообщение 25.4.2010, 12:01; Ответить: r3ntg3n
Сообщение #5


Arks, зачем писать велосипед с лице класса base?
в php давно есть такой веселый объект как mysqli. и он уже содержит в себе и метод query(), который ты написал, и кучу других интересных штук для работы с мускулом.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Apay
Apay
сообщение 25.4.2010, 12:15; Ответить: Apay
Сообщение #6


(r3ntg3n @ 25.4.2010, 15:01) *
Arks, зачем писать велосипед с лице класса base? в php давно есть такой веселый объект как mysqli. и он уже содержит в себе и метод query(), который ты написал, и кучу других интересных штук для работы с мускулом.
открою маленький секрет: database это не только mysql, и еще:
(Apay @ 25.4.2010, 02:08) *
в будущем путем замены этого класса можно легко перейти,например, от mysql к sqlite или postgresql
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Arks
Arks
Topic Starter сообщение 25.4.2010, 16:09; Ответить: Arks
Сообщение #7


другой выход:

Это не другой выход, это мы смотрим была ли инициализирована переменная instance и если нет то инициализируем новый объект класса. Даже с учетом ссылки что в этом выходе другого? Разьве классовые методы не были придуманы чтобы заменить объектные там где это удобно?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Apay
Apay
сообщение 25.4.2010, 16:30; Ответить: Apay
Сообщение #8


(Arks @ 25.4.2010, 19:09) *
Это не другой выход, это мы смотрим была ли инициализирована переменная instance и если нет то инициализируем новый объект класса. Даже с учетом ссылки что в этом выходе другого? Разьве классовые методы не были придуманы чтобы заменить объектные там где это удобно?

не всегда то что удобно - правильно, как говорится в одной поговорке: "иногда удобно и в штаны наложить..." :)

а другое - то что объект полностью отвечает за работу с определенной базой.

1) зачем в вашем случае создавать экземпляр класса base? можно же инициализацию тоже сделать класс-методом. и зачем в этом случае вообще нужен класс base? в чем его смысл? логин-пароль хранить? тут классы не нужны.

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

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

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


 



RSS Текстовая версия Сейчас: 24.4.2024, 14:20
Дизайн