Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ОО Проектирование CMS 
V
    Опции темы
bobik02
Дата 1.6.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: 2
Всего: 14



В общем приблизительно такая задача:
user posted image
Ну и сам проект: "изобретения колеса"
Я представляю(и могу),  это все написать на структурно-функциональном.
Но ключевое здесь:  : Практика и первый шаг на встречу ООП ...

Естественно хочу попробовать объектно-ориентированный подход к разработке. 

Страница будет такая:
user posted image
( Сверестаное html-представления есть, блоки разбиты на таблицы не фреймы)
ЧПУ будет вида  ?page=1 ...

контент-менеджер, для зарегистрированных пользователей будет приблизительно таким:
user posted image

Админ панель(а там будет управления Меню-Навигация, Управления Пользователями и Статьями), например уголок для статьи будет таким:
user posted image
(ну конечно же в реальности там будет чуть больше полей, и расширенно!)

Только вот в голове куча мыслей ... (Никак собрать не получается)

Как это организовать(на ООП,) от чего мне оттолкнуться? 
(В частности интересует модель MVC, возможно зенд фраймворк)

Подскажите хотя бы сам принцип как это все должно работать на ООП ?
(как спроектировать правильно систему в целом, разбить на классы, отделить логику от view и т.к)
По поводу проектирования БД - это подсказывать не нужно! (это я сделаю сам smile )

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

Но для этого простого колеса, хотелось бы использовать уже некоторые готовые решения(подшипники,гайки и т.к.), посоветуйте какие ? (только не полностью готовая cms подобного вида, а для этого колеса подрядные элементы).

Если у вас есть свободное время поделиться опытом, натолкнуть на мыслю, пнуть носом. Буду весьма признателен!  smile 


--------------------
Have a nice day
PM   Вверх
krundetz
Дата 1.6.2008, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Попробую помочь.
Первый этап паттерн MVC
1. М-Model(Модель)
По сути все классы которые будут описывать таблицы в БД.
Есть у нас  допустим таблица user с полями id, name, password
Ей создаем соответствующей класс User
Код

class User
{
     private $id;
     private $name;
     private $password;
     public function __construct($id, $name, $password)
     {
          $this->id = $id;
          $this->name = $name;
          $this->password = $password;
     }
     public function getId()
     {
          return $this->id;
     }
     public function getName()
     {
          return $this->name;
     }
     public function getPassowrd()
     {
          return $this->password;
     }
}

2. V-View(Представление)
Это классы которые отвечают за формирования ответов(представления) браузеру.
Допустим у нас есть некая абстрактная страница на которой мы хотим видеть отображение списка имен зарегистрированных пользователей. Создаем класс UserListView.
Код

class UserListView
{
     private $content = '';
     public function __content($userList)
     {
          foreach($userList as $element)
          $this->content .= $element->getName() . '<br/>';
     }
     public function getContent()
     {
           return $this->content;
     }
}

На выходе получим список пользователей. В представление мы можем подгрузить также шаблон с HTML-кодом и формировать его по нему. Это позволит нам легко менять представление и исправить только шаблон вывода без изменения кода самой системы. Тоесть если мы захотим вывести не просто список пользователей а список из ссылок на странички о пользователях то мы делаем шаблон из следующей строчки.
Код

$this->content .= '<a href="/user/' . $element->getId() . '">' . $element->getName() . '</a><br/>';

3. C-Controller(Контроллер)
Класс который по сути будет говорить как и что делать в зависимости от пришедших в него параметров.
Код

class Controller
{
     public function __controller($param)
     {
          if($param = 'showUserList')
          {
               $this->showUserList();
          }
     }
     public function showUserList()
     {
          $userlLst[] = new User('1', 'admin', 'password');
          $userListView = new UserListView($userList);
          echo $userListView->getContent();
     }
}

это все очень упрощенно но надеюсь про паттерн MVC представление появилось.

Это сообщение отредактировал(а) krundetz - 1.6.2008, 21:01


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
bobik02
Дата 1.6.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: 2
Всего: 14



krundetz, что ж спасибо за начало...
Я себе так это приблизительно и представлял, 
т.е. первым делом сделать классы например
User
Admin возможно будет наследником User
Article
Menu и т.к.

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

Стоит ли делать отдельный объект(класс) для работы СУБД MySQL ?  (в частности подключения(постоянный конект) и использовать во всех запросах его ресурс, что туда еще можно закрепить?) 
    



--------------------
Have a nice day
PM   Вверх
krundetz
Дата 1.6.2008, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Цитата(bobik02 @ 1.6.2008,  21:00)
krundetz, что ж спасибо за начало...
Я себе так это приблизительно и представлял, 
т.е. первым делом сделать классы например
User
Admin возможно будет наследником User
Article
Menu и т.к.

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

Стоит ли делать отдельный объект(класс) для работы СУБД MySQL ?  (в частности подключения(постоянный конект) и использовать во всех запросах его ресурс, что туда еще можно закрепить?)

Первым делом вам нужно выделит все возможные сущности из диаграммы прецендентов для этого собственно она и рисуется. Admin точно будет наследником User по диаграмме сделанной вами четко видно что функционал совпадает а OOP как раз и направлен на то чтобы использовать раз написаный код несколько раз.

Второй этап. Строем диаграмму прецендентов(вами это уже проделано) и выделяем сущности. Не стоит забывать что система тоже сама по себе отдельная сущность зачастую выливается в класс Aplication.

View - это как я уже говорил все то что отдается браузеру исходите из этого причем View может состоять сам посебе из других View. Вот еще такой пример мне нужно вывести то список статей и первую статью на одной странице следовательно мы при помощи контролера запрашиваем у системы необходимые нам данные выражаемые в через модели и предаем их представлению на формирование в соответствие с определенными требованиями а потом забираем это представление и отдаем браузеру.

Клас для работы с БД делать обязательно стоит, но в качестве Обертке(паттерн) к mysqli или PDO так как это позволит вам воспользоваться паттерном Синглетон. Что позволит делать обращение к БД из любой точки программы и любого класса непосредственно не передовая им класс отвечающий за работу с БД.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
bobik02
Дата 1.6.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: 2
Всего: 14



Цитата(krundetz @  1.6.2008,  21:22 Найти цитируемый пост)
Второй этап. Строем диаграмму прецедентов(вами это уже проделано) и выделяем сущности. Не стоит забывать что система тоже сама по себе отдельная сущность зачастую выливается в класс Aplication.

Попробую выделить сущности:
  •  Пользователь (User)
  •  Администратор (Admin)
  •  Система (Aplication)
  •  Вход В Систему (Access)
  •  Статьи (Articles)
  •  Меню (Menu)
(Если что поправьте меня, это мои первые шаги)
Эти сущности я так понимаю и будут каркасом для объектов ? (т.е. отдельные классы)

хм. как приблизительно реализация класса  Aplication ? (пока не представляю)

Цитата(krundetz @  1.6.2008,  21:22 Найти цитируемый пост)

Клас для работы с БД делать обязательно стоит, но в качестве Обертке(паттерн) к mysqli или PDO так как это позволит вам воспользоваться паттерном Синглетон. Что позволит делать обращение к БД из любой точки программы и любого класса непосредственно не передовая им класс отвечающий за работу с БД.

паттерн Обертке ? (не читал, если можно объяснить, или ссылку на информативное описание)

А вот по поводу PDO (если правильно понял) , как считаете целесообразно использовать базовый класс PEAR DB ? (или самому что то такое написать) (хотя не вижу смысла, СУБД будет только MySQL)

по поводу паттерна Singleton читаю  Джордж Шлосснейгл "Профессиональное программирование на PHP" страница 67, очень кратко описано ,но саму суть уловить сложновато :(

(я пока в паттернах не ориентируюсь, но постараюсь исправиться)

Добавлено через 5 минут и 15 секунд
Цитата(krundetz @  1.6.2008,  20:30 Найти цитируемый пост)
это все очень упрощенно но надеюсь про паттерн MVC представление появилось.

Действительно, меленькое представления про MVC появилось smile


--------------------
Have a nice day
PM   Вверх
krundetz
Дата 1.6.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Сначала по паттернам.
Обертка. Более правильное название Adapter. Одно из назначений предоставление унифицированного способа доступа к куску программы не зависящему от вас, простой пример есть некий модуль и вы используете его функционал в нескольких местах програмы допустим этот модуль както изменился и нам приходится изменять програvму ища в ней места его использования(например хостер взял и обновил каrой либо модуль PHP, а там функционал работает по другому). Выход написать класс обертку который будет инкапсулировать в себе работу со сторонним решением.
Singleton или Одиночка. Используется там где требуется как раз создание одного единственного класса в системе. Для этого делаем клас у которого приватный конструктор и есть статический методом возвращающий экземпляр этого класса при этом о
Для этого создаем класс который возвращает статическим методом экземпляр самого себя. Перед тем как возвращать экземпляр класса будем проверять есть ли в системе уже такой класс или нет для этого введем статическое свойство которое будет указывать либо на null либо на созданный экземпляр класса. Для того чтобы в программе невозможно было создать экземпляр класса сделаем конструктор закрытым. В итоге получим вот такой код.
Код

class Singliton
{
      private static $instance = null;
      private function __construct()
     {
          //сдесь реализация конструктора
     }
     public static function getInstance()
     {
          if(self::$instance == null)
               self::$instance = new Singliton();
          return $instance;
     }
}

Теперь вы можете вызвать этот класс из любой части программы, написав следующую строчку.
Код

$singliton = Singliton::getInstance();

И работать с экземпляром класса дальше.

Добавлено через 13 минут и 31 секунду
Теперь по Aplication. Здесь у вас должно создаться всё то что необходимо для работы системы как то какой сейчас пользователь пользуется системой, инициализироваться все необходимые настройки, определиться какой вариант работы выбрать в зависимости от него определить и запустить необходимый контроллер и т.д. В большинстве случаев у него только один случай либо только конструктор либо статический метод run.

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

На следующем этапе надо нарисовать диаграмму существующих в системе классов и их взаимозависимостей и диаграмму последовательностей.

Литературу на память не помню но подберу списочек и здесь отпишу.



Это сообщение отредактировал(а) krundetz - 1.6.2008, 23:19


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
solenko
Дата 2.6.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



Для базы лучше использовать не singleton, а реестр (т.к. рано или поздно хочется пользоватся более чем одной базой). Он очень схож с сингтоном, но возвращает едиственный instance для каждого ключа.


По поводу почитать...
Есть две "классические" книги:
1. Т.н. "банда четырех" ISBN: 978-5-469-01136-1. Очень сухая книга, воспринимается очень тяжело.
2. Фаулер. ISBN: 978-5-8459-0579-6. Написана живым языком, читается намного легче да и охватывает больше.
3. Wiki )
Более ничего порекоендовать не могу, т.к. это все что читал по теме.

А вообще, перед тем как делать такое колесо, я бы порекомендовал посмотреть готовое. Возьмите хорошо структурированый фреймверк (Zend, symfony, etc) и попробуйте что-то сделать. Для symfony, например, есть такой обучаюший курс Askeet, который очень хорошо помогает понять не только как это работает, но, зачастую, и почему именно так.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
bobik02
Дата 2.6.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: 2
Всего: 14



solenko, Спасибо! Буду "курить"  smile (п.с. wiki курю ежедневно)
krundetz, честно говоря сложно пока в шаблонах разобраться (хотя нашёл в книгах паттерны Adapter, Singleton,Factory,Template и др. но понять их смысл не за одни день...наверное это пройдёт со временем/опытом). 

Цитата(krundetz @  1.6.2008,  23:19 Найти цитируемый пост)
Сущности выделены правильно за одним исключением будет не вход в систему а модуль авторизации, который будет проверять авторизован ли пользователь и в случае если не авторизован выдавать в браузер в качестве представления форму авторизации. В процессе реализации необходимо совершенствовать диаграмму прецедентов так как могут выплыть то что сразу было не увидено соответственно также могут появиться новые сущности.

На следующем этапе надо нарисовать диаграмму существующих в системе классов и их взаимозависимостей и диаграмму последовательностей.

Литературу на память не помню но подберу списочек и здесь отпишу.

Существенных изменений не будет в диаграмме прецедентов...

Сейчас попробую организовать Диаграммы Классов И возможно если осознаю суть и получитсья Диаграммы Состояний smile

Это сообщение отредактировал(а) bobik02 - 2.6.2008, 23:56


--------------------
Have a nice day
PM   Вверх
krundetz
Дата 2.6.2008, 15:06 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



bobik02 паттерны вещь такая их надо потрогать и пощупать на собственном опыте и желательно на реальных проектах. У нас в универе курс из 4 семестров по ним был и то понимание многого уже пришло на реальных проектах. Вы пока не пытайтесь применить все паттерны которые есть это в вашей системе не нужно используйте простейшие а уже создав чтото попробуйте сделать её рефакторинг узнаете очень много нового про ООА. Пример как это делаю я приведу обязательно ориентировочно завтра с утра.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
bobik02
Дата 2.6.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: 2
Всего: 14



krundetz,  Все советы учту!
До завтраsmile

Это сообщение отредактировал(а) bobik02 - 2.6.2008, 23:56


--------------------
Have a nice day
PM   Вверх
krundetz
Дата 3.6.2008, 10:47 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



Доброе утро.
Есть некий модуль допустим это простенькая галерея умеющая выводить список файлов которые в ней есть, отображать один файл, загружать файл и удалять файл.
Какие классы у нас есть:
1. GalleryContrloler
Контролирует логику работы модуля. Включает следующие методы:
1.1. __construct() производит вызов нужного метода контролера,
1.2. showImageList() показывает список имеющихся файлов,
1.3. showImage() показывает файл,
1.4. addImage() загружает картинку и показывает форму загрузки,
1.5. deleteImage() удаляет картинку.
2. Gallery
Класс с двумя статическими методами:
2.1. getImageList() возвращает список из картинок,
2.2. getImage() возвращает картинку.
3. Image
Класс модель для картинки. Имеет следующие методы:
3.1. __construct() здесь все понятно,
3.2. getUrl() тоже думаю понятно,
3.3. save() сохраняет картинку,
3.4. delete() удаляет картинку.
Эти классы непосредственно относятся к модулю и лежат в папке модуля.
Для нормальной работы нам нужно также ещё класс Aplication со статическим методом run() и класс который будет разбирать пришедшие параметры обычно его называют Router он будет иметь конструктор в который будут переданы пришедшие параметры обычно url и метод getParam() возвращающий ассоциативный массив из параметров nameModule, action, idImage и т.д.
Далее я приведу только код контролера и класса Aplication.
Код

class GalleryContrloler
{
     public function __construct($params)
     {
           switch($params['action'])
           {
               case 'showImageList': $this->showImageList(); break;
               case 'showImage' : $this->showImage($params['idImages']); break;
               // и т.д.
           }
     }
     private function showImageList()
     {
           $imageList = Gallery::getImageList();
           $imageListView = new ImageListView($imageList, $tpl);
           echo $imageListView->getContent();
     }
}

Код

class Aplication
{
    public function run()
    {
         $router = new Router(//сюда передаем url);
         $params = $route->getParam();
         if(file_exists(//путь к файлу модулю который получаю пдставляя к константе переменную полученую от Router $params['nameModule'] ))
         {
              include_once(//смотри выше);
              $controller = new ucfirst($params['nameModule']) . Controller($params);
         }
    }
}

Забыл сказать что нужны классы представления в частности ImageListView в который мы предаем список картинок и путь к шаблону отображения. Можно обойтись одним классом представления но это сложнее и я так не делаю. Вот собственно опрошенный пример того как у меня работает модуль. Не забывайте про проверке большинство которых я опустил. Также сдесь убрана работа с пользователями и реализация прав доступа.

Это сообщение отредактировал(а) krundetz - 3.6.2008, 11:13


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
bobik02
Дата 3.6.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 451
Регистрация: 26.11.2007

Репутация: 2
Всего: 14



krundetz,  Окончательно меня запутали.  smile Но Спасибо  smile 
(зато за эти два дня много паттернов узнал, некоторые даже осознал, литературу "поднял")
Пришёл к выводу: Программист сам доходит до основных моментов использования ООП , паттернов и т.к. 

Можно считать вопрос исчерпанным. (так как понял - катастрофически нехватка знаний в ОО подходе, буду "курить" умные книжки)

Посмотрим что с этого получиться  smile 
 


--------------------
Have a nice day
PM   Вверх
krundetz
Дата 3.6.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 20
Всего: 69



bobik02 бог в помощь.


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.