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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пара вопросов по ООП, Ход мысли по созданию классов верный 
V
    Опции темы
zero50x
Дата 5.5.2014, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 13.4.2007
Где: Нижний Новгород

Репутация: нет
Всего: 0



Только начал ООП. Тренируюсь на системе с планируемыми объектами: человек с его личным счётом, банк, магазин. Вопросы:

1. Т.к. счёта это однотипные объекты решил сделать для них класс и работать с ними как его экземплярами. Это нормально что при наличии нескольких тысяч пользователей будет несколько тыс. экземпляров этого класса?

2. Пополняется счёт в банке, а тратится в магазине, но вот методы я что-то никак не могу придумать, кто подскажет или наведёт на мысль?

3. Т.к. магазинов много и они тоже однотипные для них я так понимаю тоже рационально создать свой класс, а магазины - это его объекты?

4. Банк только один (единственный экземпляр). Для такого объекта имеет смысл создавать класс с 1 экзепляром или лучше обойтись как-то по другому?


Код

<?php
class Count{

        public $login; // владелец счёта
        public $balance; // баланс счёта
 
        function __construct($number){
                echo "<p>Конструктор сработал! $number<br>";
        }
   
        public function infoMoney(){ //метод для проверки баланса
        echo "Login: ".$this->login."<br>";
                echo "Остаток на счёте: = ".$this->balance;
        }
        public function takeMoney(){ //метод для пополнения счёта
                //здесь метод пополнения счёта
 
        }
        public function spendMoney(){ //метод для списания со счёта
                //здесь метод списания со счёта
 
        }
}
 
$count_ivanov = new Count(1);
$count_ivanov->login = "Иванов Иван Иванович";
$count_ivanov->balance = 100;
$count_ivanov->infoMoney();
 
$count_petrov = new Count(2);
$count_petrov->login = "Петров Пётр Петрович";
$count_petrov->balance = 100;
$count_petrov->infoMoney();
?>

PM MAIL   Вверх
FiMa1
Дата 5.5.2014, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 6



zero50x, некоторые вещи о которых вы упоминаете весьма спорны.


Цитата(zero50x @  5.5.2014,  08:25 Найти цитируемый пост)
1. Т.к. счёта это однотипные объекты решил сделать для них класс и работать с ними как его экземплярами.


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


Цитата(zero50x @  5.5.2014,  08:25 Найти цитируемый пост)
Это нормально что при наличии нескольких тысяч пользователей будет несколько тыс. экземпляров этого класса?

В каком случае в логике вашего приложения вы планируете инстанцировать одновременно такое количество объектов? Вряд ли это будет необходимо по логике приложения держать такое количество объектов в памяти.

Цитата(zero50x @  5.5.2014,  08:25 Найти цитируемый пост)
2. Пополняется счёт в банке, а тратится в магазине, но вот методы я что-то никак не могу придумать, кто подскажет или наведёт на мысль?

Понимаете все дело в том, что невозможно определить единственный однозначно верный способ проектирования классов. Это как моделирование реальной жизни. Так если объект банк пополняет (putMoney) счета, то объект магазин снимает (getMoney) деньги со счета. Таким образом объекты имеют обыкновение взаимодействовать друг с другом.

Цитата(zero50x @  5.5.2014,  08:25 Найти цитируемый пост)
3. Т.к. магазинов много и они тоже однотипные для них я так понимаю тоже рационально создать свой класс, а магазины - это его объекты?

Однотипные магазины - класс, а магазины - объекты? Этот вопрос скорее показывает, что вы не до конца разобрались, что есть класс, а что есть объект.
Класс - это описание свойств и методов объекта. Скажем описанием класса человек может быть: две ноги, две руки, шерсть на голове, нос. А Инокентий - конкретный объект класса человек.

Цитата(zero50x @  5.5.2014,  08:25 Найти цитируемый пост)
4. Банк только один (единственный экземпляр). Для такого объекта имеет смысл создавать класс с 1 экзепляром или лучше обойтись как-то по другому?

Банк только один - тоже явное упрощение smile В остальном смотреть предыдущий комментарий.

zero50x, я бы рекомендовал вам продолжить изучение ООП. Хорошая книжка в этом плане это Гради Буч: Объектно-ориентированный анализ и проектирование. Поищите ее в сети. Также настоятельно рекомендую прочитать о шаблонах проектирования. Удачи!
PM   Вверх
Aliance
Дата 5.5.2014, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

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



Если банк только один - имеет смысл реализовать его как Singleton (см. ссылку по шаблонам проектирования).

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

И еще, не стоит называть свой класс именем встроенной функции php (count).
PM MAIL WWW ICQ Skype   Вверх
baldina
Дата 5.5.2014, 13:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 26
Всего: 101



Цитата(zero50x @  5.5.2014,  08:25 Найти цитируемый пост)
 при наличии нескольких тысяч пользователей будет несколько тыс. экземпляров этого класса

php приложение в конкретный момент времени будет работать со счетами только одного (текущего) клиента, их редко будет больше одного, больше десяти - практически никогда.

Цитата(zero50x @  5.5.2014,  08:25 Найти цитируемый пост)
 методы я что-то никак не могу придумать

методология ООП проектирования, в двух словах, такова: 
1. производим декомпозицию задачи на объекты.
2. определяем, какими сообщениями обмениваются объекты (перечень функций) и какова их семантика
3. классифицируем объекты, выявляя общие свойства/методы, в результате получается иерархия классов

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

если упростить задачу до одного вида счета, то я вижу три функции: 
- синхронизировать объект с БД, эта же функция используется в конструкторе
- выдать состояние счета
- перевести деньги на другой счет

можно движение средств осуществлять и двумя функциями - операциями по дебиту и кредиту, но врядли объект php является первоисточником информации, скорее всё в БД и логике над ней, а на php только интерфейсная часть. тогда, т.к. списывание со счета связано с начислением на (другой) счет, операция должна быть атомарной (транзакцией), и логично иметь одну функцию.

со счетом, кстати, должна быть ассоциирована история движения средств

Цитата(Aliance @  5.5.2014,  10:52 Найти цитируемый пост)
не стоит называть свой класс именем встроенной функции php (count)

Код

class BankAccount{}

PM MAIL   Вверх
zero50x
Дата 7.5.2014, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 13.4.2007
Где: Нижний Новгород

Репутация: нет
Всего: 0



Всё понял что вы сказали, спасибо, в голове прояснилось немного. Про шаблоны проектирования на википедии посмотрю.

Оффтоп: что-то не пойму, я вроде подписывался на сообщения в теме а на почте не было ничего.
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.

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


 




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


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

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