Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: switch и ООП

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
spirit
Отправлено: 06 Марта, 2012 - 19:18:11
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2012  
Откуда: Россия, Пермь


Помог: 0 раз(а)




Доброго всем времени суток.
Занимаюсь активным внедрением ООП в свой мозг и столкнулся с вот какой проблемой. Как правильно организовать вызов тех или иных методов к-либо класса?

Приведу пример. Класс User в котором есть методы регистрации, авторизации, редактирования и удаления пользователя (к примеру). Есть 4 формы соответственно для регистрации, авторизации, редактирования ну и типа удаления.
Классический вариант для процедурного программирования когда в форме стоит
action="test.php?act=register",
action="test.php?act=login" и тд. В файле test.php мы пользуем switch и запускаем ту или иную функцию. Здесь все предельно ясно. Но вот как быть с ООП? Пользоваться ли switch и если "да", то где его пользовать? После создания экземпляра класса или в теле класса, передавая туда $act? Или всеже есть другой способ? Спасибо.
 
 Top
caballero
Отправлено: 06 Марта, 2012 - 19:24:53
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Дергать статические функции классов точно так же как и в процедурном стиле.
Потому как ООП здесь и не пахнет.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
spirit
Отправлено: 06 Марта, 2012 - 19:31:19
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2012  
Откуда: Россия, Пермь


Помог: 0 раз(а)




caballero пишет:
Потому как ООП здесь и не пахнет.

А можно про запахи поподробнее?
 
 Top
Bio man
Отправлено: 06 Марта, 2012 - 19:55:18
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




spirit пишет:
А можно про запахи поподробнее?
ну для начала стоит понять, что ООП стоит на 3 китах: наследование, инкапсуляция и полиморфизм. при отсутствии одного или более из китов это уже не ООП. в ООП все есть объект а объект это переменная определенного типа (в ООП под типом часто подразумевают класс). у объекта есть поведение (методы) и состояние (свойства)
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Марта, 2012 - 19:59:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Чем пахнет? Радость
-----------------------------
spirit вместо switch можете посмотреть в сторону method_exists
(Добавление)
((мы мягко подойдем к осознанию того, кто такие роутер и контроллер))
 
 Top
caballero
Отправлено: 06 Марта, 2012 - 20:13:16
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
ну для начала стоит понять, что ООП стоит на 3 китах: наследование, инкапсуляция и полиморфизм. при отсутствии одного или более из китов это уже не ООП.

Неверно. Суть ООП - это инкапсуляция. Остальное -удобные фишки.

Цитата:
в ООП под типом часто подразумевают класс

Вообще то класс - всегда есть тип.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Марта, 2012 - 20:16:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Еще бы объяснить доходчиво, что это за "инкапсуляция" такая..
Ато вон в соседней теме уже наинкапсулировали до того,
что юзер наследует мускуля.. Радость
 
 Top
spirit
Отправлено: 06 Марта, 2012 - 20:16:08
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2012  
Откуда: Россия, Пермь


Помог: 0 раз(а)




DeepVarvar пишет:
method_exists

сижу созерцаю... смысл понятен, практического применения пока не вижу(
DeepVarvar пишет:
роутер и контроллер

темный лес...
 
 Top
caballero
Отправлено: 06 Марта, 2012 - 20:25:37
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
spirit вместо switch можете посмотреть в сторону method_exists

в данном случае не имеет смысла -методы все известны наперед.

Цитата:
Ато вон в соседней теме уже наинкапсулировали до того,
что юзер наследует мускуля.

в половине тем где БД упоминается с ООП норовят сделать класс для Mysql и наследовать от него объекты. Этакий гибрид синглетона с active record


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Марта, 2012 - 20:25:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




spirit пишет:
смысл понятен, практического применения пока не вижу(

Предположим у нас в урле всегда ожидаецца вот так:

/?class=xxx&method=yyy

Ну ок, типа не-до-роутер (безо всяких "меджик" __autoload):
PHP:
скопировать код в буфер обмена
  1. $class = isset($_GET['class']) ? $_GET['class'] : "main";
  2. $method = isset($_GET['method']) ? $_GET['method'] : "default";
  3.  
  4. if (!class_exists($class)) {
  5.   require_once "/path/do/classes/$class.php";
  6.   $class = new $class;
  7. }
  8.  
  9. if (method_exists($class,$method))
  10.   $class->{$method}();
 
 Top
spirit
Отправлено: 06 Марта, 2012 - 20:40:40
Post Id


Новичок


Покинул форум
Сообщений всего: 16
Дата рег-ции: Март 2012  
Откуда: Россия, Пермь


Помог: 0 раз(а)




DeepVarvar, все, понял, но caballero прав -
caballero пишет:
в данном случае не имеет смысла -методы все известны наперед.


меня просто беспокоит вот что. У меня весь код внутри классов и switch там же а в обычном файле только автолоад, создание экземпляра и вызов метода в котором лежит switch:
class.test.php
PHP:
скопировать код в буфер обмена
  1.  
  2. class Test(){
  3. function __construct($act){
  4.    $this->act = $act;
  5. }
  6. function service(){
  7.    switch ($this->act){
  8.       case "register" : $this->register(); break;
  9.       case "login" : $this->login(); break;
  10.       ...
  11.  
  12.    }
  13. }
  14. function register(){}
  15. ... итд
  16. }
  17.  

test.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. function __autoload();
  4. $act = $_REQUEST['act'];
  5. $a = new test($act);
  6. $a->service();
  7. ?>
  8.  


код упрощен но я думаю понятен смысл.

(Отредактировано автором: 06 Марта, 2012 - 20:41:00)

 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Марта, 2012 - 21:35:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




caballero, а я считаю что всегда нужно проверять есть ли метод,
даже когда они известны.
И если метода нет - бросать исключение.
Пусть для данной ситуации их четыре.
Но доступных контроллеров/методов может быть и десятка два-три..
И чтобы не лазить больше никуда и не переписывать/дописывать,
лучше сразу сделать не-свитч.
 
 Top
caballero
Отправлено: 06 Марта, 2012 - 22:05:04
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
а я считаю что всегда нужно проверять есть ли метод,
даже когда они известны.

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

Цитата:
меня просто беспокоит вот что.

лучше побеспокойся о другом. Экземпляр чего ты создаешь и на фига ты его создаешь.
После этого проблеммы решатся (ли отпадут) автоматически


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Champion Супермодератор
Отправлено: 07 Марта, 2012 - 07:41:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Bio man пишет:
при отсутствии одного или более из китов это уже не ООП
Нуу это спорно. Например, я считаю, что главный кит - инкапсуляция, потому что грамотная инкапсуляция в первую очередь позволяет снизить сложность проекта.
Чрезмерное наследование - наоборот увеличивает сложность (правда, без него никак не обойтись). Но обходиться на маленьких задачах без него вполне можно.
(Добавление)
caballero пишет:
Суть ООП - это инкапсуляция. Остальное -удобные фишки.
О, я не один так считаю Улыбка
(Добавление)
DeepVarvar пишет:
ще бы объяснить доходчиво, что это за "инкапсуляция" такая..
Попробую. Есть логика. Например, логика того, как мы идем вечером с работы домой.
1. Сохранить наделанное.
2. Надеть куртку.
3. Идти, идти, пока не придешь.
Это три функции. Разберем, например, вторую. Ее реализация будет примерно такой:
2.1. Поднять руку, снять ее с вешалки, повернуть к себе нужной стороной, сунуть в нее руки, проверить, вошли ли руки удачно (если не удачно, то бросить ексепшн и попробовать заново), застегнуть.
Вот функция НадетьКуртку инкапсулировала в себя сложный процесс. Вся эта сложная вещь скрыта в том, что описано в 2.1 (это приватные методы класса. Ими не положено пользоваться из вне и о них не нужно даже думать), а мы беззаботно пользуемся публичным методом НадетьКуркту нашего класса.
А как разработчик класса, мы можем менять, оптимизировать эти приватные методы, инкапсулированные от пользователя класса, никак не мешая ему пользоваться старыми добрыми публичными методами, которые мы ему дали.
Часто мы можем сами выступать и как разработчик класса, и как пользователь, инкапсулировав его сложность на этапе разработки и дальше беззаботно пользоваться его интерфейсом(его публичными методами).
Вот. Это конечно неполное такое описание, но какое-то накатал
 
 Top
DeepVarvar Супермодератор
Отправлено: 07 Марта, 2012 - 10:01:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Champion пишет:
Попробую
А я добавлю еще так:
Инкапсуляция:
Есть объект "машина" и объект "водитель". И вот водителю (блондинке),
совершенно не нужно знать как работает двигатель внутреннего сгорания.
Она просто давит на педали (у нее АКПП) и крутит руль.
Вот раньше чтобы быть водителем нужно было знать как там все внутри работает,
сейчас уже нет.
----------
Не правильное наследование:
Никогда не было так, чтобы машина стала думать за водителя.
Ну положим в настоящее время некоторые зачатки "автопилота" уже существуют.
Но вот чтобы человек пил бензин, прогревался зимой, тарахтел под окнами (бабушки на лавочках не в счет) и "делал ноги колесом" - точно никогда не будет.

Если взялись наследовать, нужно подумать а нужно ли это.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB