![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| JackGmen |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.8.2011 Репутация: нет Всего: нет |
Пытаюсь разобраться с ООП, помогите кто в теме, пожалуйста.
Итак, к примеру, есть: SMS сервер, у которого есть различные смс (обычные, отложенные, подписки), отличающиеся запросами к БД, также есть различные операторы к примеру МТС и Beeline, через которые эти смс я буду отправлять, как бы на этом все. Что себе надумал я:
вот так подумал я должен работать смс сервер, но тут же возник вопрос, почему не просто $sms->sendSMS()? зачем я всунул $sms->getSMS()? где граница? что нужно логически выносить в отдельные методы? вот кусок класса СМС сервера
вот кусок Оператора
Мне нужен совет, правильно ли я все делаю, или есть более рациональное решение? PS код писал во время вопроса, на корректность не проверял ... |
||||||
|
|||||||
| Sentox |
|
|||
|
как то так ![]() ![]() Профиль Группа: Участник Сообщений: 392 Регистрация: 27.1.2009 Где: Зимбабве Репутация: 7 Всего: 7 |
Вы смешали две разных абстракции.
Оператора и sms. Они раздельны и оператор не может быть подтипом (наследоваться) SMS. В начале проектирования нужно определить абстракции и их интерфейсы (public) методы\свойства. Затем можно и спроектировать их взаимодействие между собой (если нужно паттерны применять). Логически подумать, SMS не может отправлять саму себя (фактически SMS всего лишь структурно-информационная единица с примитивными методами по обработке текста\изображений), отправляют SMS операторы. Очень помогает графическая документация например UML. Это сообщение отредактировал(а) Sentox - 1.4.2012, 18:05 |
|||
|
||||
| JackGmen |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.8.2011 Репутация: нет Всего: нет |
Если вы внимательно прочли вопрос, то должны были понять что класс SMS, это SMS сервер, который шлет все смс, а не одну смс как подумали вы ... немного объясню если не все понимают что я имел ввиду: СМС сервер выбирает все смс, в методе getSMS, а потом в методе sendSMS их все отправляет, а в самом методе я могу определить каким оператором эти смс отправлять, ну а в самом операторе я уже могу определить какой тип смс отправлять ... вот такую структуру я себе сделал и спрашиваю, если способ эту структуру сделать гибче, паттерны читал, мой способ похоже на паттерн Facade ... Я уже немного начал разбираться ... но все равно не уверен что все правильно ... |
|||
|
||||
| Sentox |
|
|||
|
как то так ![]() ![]() Профиль Группа: Участник Сообщений: 392 Регистрация: 27.1.2009 Где: Зимбабве Репутация: 7 Всего: 7 |
Я ещё раз утверждаю что смешаны абстракции, а то что Вы называете SMS сервером является абстракцией Operator (это в чистом коде называется дезинформацией, неправильно выбранным именем абстракции) от которой фактически должны были бы наследованы все остальные подтипы операторов (MTC ...), так же этот класс бы заявлял контракты (интерфейсы) и являлся бы контроллером (facade) с композицией sms. Хотя я бы сделал на основе паттерна observers при котором бы была бы событийная схема при которой бы тип "Operator" (соответственно его наследующие классы) был бы наблюдателем за изменёнными данными то есть SMS. То есть если бы пулл SMS наполненн оповещались наблюдатели и запускались соответственные процессы. Это сообщение отредактировал(а) Sentox - 1.4.2012, 19:51 |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
JackGmen,
если хотите отправлять через одного оператора все сразу, можно например так
|
||||
|
|||||
| JackGmen |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.8.2011 Репутация: нет Всего: нет |
baldina спасибо!
На основе вашего примера сделал так
Классы:
Sentox тоже спасибо. Там мне еще нужно читать, не все понял из того что Вы написали ... Это сообщение отредактировал(а) JackGmen - 1.4.2012, 23:30 |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
||||
|
||||
| JackGmen |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.8.2011 Репутация: нет Всего: нет |
||||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
может поручить это классу SMS? просится разделение: SMS работает с данными, умея получать их для конкретного оператора, Operator только передает.
Добавлено @ 11:32 Это сообщение отредактировал(а) baldina - 2.4.2012, 11:33 |
|||
|
||||
| JackGmen |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.8.2011 Репутация: нет Всего: нет |
То есть теперь в зависимости от оператора будет собираться блок смсок в самом смс сервере, никак не используя сущность оператора, что-то по моему не то с точки зрения ООП, или это нормально? или нужна еще пачка классов моделей где эти выборки блоков смс реализованы по операторам? |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Абстрактной гибкости не бывает ;) Нужно придумать путь потенциального расширения системы и постараться не заткнуть. Потенциальный путь расширения, кроме простого добавления нового сотового оператора - рассылка по усеченным спискам - по группам. Потребует наличие в базе номеров еще и разбивку по группам. При отсылке sms нужно указать группу рассылки. Для "классовой организации" это означает, что список номеров для рассылки получается методом класса sms. Вероятнее всего, потребуется класс `number` - хранитель номера клиента, вычислитель оператора и группы рассылки... Это сообщение отредактировал(а) ksnk - 2.4.2012, 12:00 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
нормально будет так, как соответствует задаче. я не телепат, выводы о вашей задаче делаю на основе ваших слов и обывательского понятия о пересылке смс "в зависимости от оператора будет собираться блок смсок в самом смс сервере, никак не используя сущность оператора" - не в зависимости от оператора-объекта, а в зависимости от префикса номера либо явной связи с именем оператора. давайте рассмотрим оба случая. и предположим, что из БД получен префикс (или имя) оператора, неизвестного системе. что должно произойти? а вот что будет происходить: а) в случае, если SMServer получает все смс, а потом на основе префикса или имени использует соответствующий объект оператора связи, возникнет ошибка времени выполнения. б) в случае, если SMServer получает смс для специфичного оператора из его собственного списка, смс неизвестных операторов просто не будут обработаны. можно реализовать эти и любые другие варианты, а исходить - из задачи (т.е. того, что "должно" произойти) |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 26 Всего: 101 |
в каждом случае будет своя специфика архитектуры.
в любом случае потребуется разделить систему на части: одни классы отвечают за данные, другие - за пересылку конкретным операторам, третьи еще за что-то. посмотрите еще раз вот этот фрагмент
|
|||
|
||||
| Sentox |
|
|||
|
как то так ![]() ![]() Профиль Группа: Участник Сообщений: 392 Регистрация: 27.1.2009 Где: Зимбабве Репутация: 7 Всего: 7 |
Может будут не точности вот если нужен паттерн "observers"
![]() Код:
Это сообщение отредактировал(а) Sentox - 2.4.2012, 22:15 |
|||
|
||||
| JackGmen |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.8.2011 Репутация: нет Всего: нет |
Sentox спасибо, а в чем вы рисовали диаграмму классов?
PS я бы всем, кто здесь писал, поднял бы карму, но не могу, мало постов у меня ( |
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |