Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.02.2016, 20:22   #1
vinniepooh
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 440
Счастье Классы - когда использовать

Привет!
Подскажите по классам. ООП выглядит привлекательно, с одной стороны. Всё красиво и работает.
Вот только есть особенности.
Предположим, что нужно сделать подключение к базе. Можно написать просто 4 переменных $host,$db,$login,$password и подключиться через функции mysql_*, а можно сделать объект типа $MyDbConnection.

$MyDbConnection->query()...

Возникает вопрос - не выглядит ли это перегруженным, не совсем естественным? Точнее - что за объект нужен - база данных, подключение, что-то другое? Часто вижу в примерах по ООП перегруженные вещи, где есть и база, и подключение и дополнительные обёртки.
Главное, иногда непонятно, кто вызывает код - сам объект, или над ним что-то делают, то есть объект активный или пассивный.

$MyDbConnection->query()...
$MyDb->query()...

То ли сама база вызывает метод, то ли программист вызывает у объекта метод. Сделано с попыткой соответствия реальным объектам в мире, а получается искусственно (иногда).
Функция если - то просто: "выполнить подключение". mysql_...
Мы знаем, что скрипт подключится к серверу и что-то сделает. А тут?

Написано много по этой теме, но есть вопросы.

Может появиться желание вообще всегда делать объекты, но это напоминает усложнение, т.к. есть принцип KISS. Из плюсов видна возможность поместить всю функциональность в объект, и если что-то изменится, то автоматически изменится во всём проекте, не надо переделывать ничего. Из "странностей" - что означает "метод объекта" - к примеру бильярдного шара? У самого шара никаких методов нет - и с этой стороны это кажется искусственным.

Получается, что это "ТО, что можно сделать над шаром"? Или это то, что делает сам шар?
----
ADD: получается, что класс имеет смысл делать только если планируется создавать в программе много объектов такого типа, вида?
Именно много, а если один (или в одном файле), то можно и не делать/использовать класс?

Последний раз редактировалось vinniepooh; 20.02.2016 в 20:24.
vinniepooh вне форума Ответить с цитированием
Старый 20.02.2016, 21:48   #2
Lucky beggar
Пользователь
 
Регистрация: 23.05.2012
Сообщений: 34
По умолчанию

Принцип KISS подразумевает использование классов и объектов. Мне помог разобраться в теме данный учебникhttp://www.ozon.ru/context/detail/id/33506422/
Lucky beggar вне форума Ответить с цитированием
Старый 20.02.2016, 22:03   #3
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,603
По умолчанию

Я не считаю себя знатоком ООП, но все же напишу как я это вижу. Пишется класс для соединения с БД и выполнения запросов. Все в одном классе. Данные о соединении читаются из конфига. Для каждой БД своя секция в конфиге. Соединение к конкретной бд запихиваем в синглтон, чтобы не плодить коннекты. В модели, там где нужно работать с этим классом пишется примерно следующее
Код:
 $DB = new MySuperDbClass('db_name');// параметр - имя базы данных(ведь баз данных  может быть несколько). Возвратит коннект с конкретной базе
 $aMyData = $DB->getAll('SELECT * `my_table` ......'); // вернет данные из базы в виде массива или объекта
Lucky beggar, ну дак и написали бы как правильно реализовать все это. Раз вам так помог учебник

Последний раз редактировалось Gorychev; 20.02.2016 в 22:11.
Gorychev вне форума Ответить с цитированием
Старый 21.02.2016, 17:05   #4
vinniepooh
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 440
По умолчанию

Мне только что пришла мысль, что класс имеет делать смысл тогда, когда система может расширяться, что-то появляться, новое.

Это даже видно по фигурным скобкам - они как бы разрешают масштабирование.
А вот квадратные как у массива - ориентированы на входные данные известных заранее объёмов.

Хотя если баз несколько, почему бы не обойтись массивом, пусть и динамическим?

В данном случае я говорю о том, когда 1 база, известная заранее. А параметры ее могут быть переменными (имя, хост, логин, пароль). Можно ее в настройках сделать, тоже чтобы из файла читалось (ну или в коде жестко забить). В конце концов почему бы не читать из текстового файла несколько баз, если уж они есть?

Ну то есть объект нам нужен в зависимости от ТЗ - если там что-то может появляться, то делаем класс. Если заранее чётко фиксировано - пусть и динамическое - то обойтись можем текстом, строками, массивами, файлами.
vinniepooh вне форума Ответить с цитированием
Старый 21.02.2016, 17:16   #5
vinniepooh
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 440
По умолчанию

// $DB = new MySuperDbClass('db_name');
спасибо.

Класс - это шаблон объекта. В чём основной смысл создания шаблона? По идее можно сделать ассоциативный массив, а не объект.
Тогда будет так: $db[$host], $db[$pass], и т.п.

В расчёте на возможное добавление свойств только (создание объектов?)?
Или объект берём тогда, когда сложность структуры объекта реального не позволяет обойтись массивом? Тогда как бы объект содержит в одном целом все параметры.
vinniepooh вне форума Ответить с цитированием
Старый 21.02.2016, 17:19   #6
vinniepooh
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 440
По умолчанию

Или же вообще - делаем объект и всё тут, потому что так принято. И не важно, почему функции содержатся внутри - просто это удобно может быть.
vinniepooh вне форума Ответить с цитированием
Старый 21.02.2016, 17:20   #7
vinniepooh
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 440
По умолчанию

Итого: массив, если заранее известны ограничения и не предвидится увеличение серьезное, а объект если может добавляться что-то из свойств и т.п., система планирует развиваться. Так?

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

Последний раз редактировалось vinniepooh; 21.02.2016 в 17:23.
vinniepooh вне форума Ответить с цитированием
Старый 21.02.2016, 19:30   #8
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,603
По умолчанию

Что то у вас вопросы в разброс пошли.. Как бы класс работы с БД обязательно нужен. Если не хотите, чтобы ваш код не превратился в спагетти из коннектов и запросов. О каком массиве вы толкуете, не могу понять. Выражайте более четко свои мысли. Если сделать как я написал, то ничего глобального дописывать потом не придется. Тренируйтесь. И да, почитайте учебники, у вас плохо с теорией. Функции внутри класса, называются методами

Последний раз редактировалось Gorychev; 21.02.2016 в 19:32.
Gorychev вне форума Ответить с цитированием
Старый 21.02.2016, 19:45   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Функции внутри класса, называются методами
Да какая разница как называть. В С++ обычно member function называют и все пока живы.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.02.2016, 20:19   #10
vinniepooh
Форумчанин
 
Регистрация: 11.04.2010
Сообщений: 440
По умолчанию

Да, вот сегодня как раз подумал про спагетти. Собственно, всё это делается ради отсутствия оного? Т.е., для удобочитаемости, производительности, масштабируемости?

Класс работы с БД, вот это оно. Тут важно понять, почему класс работы, а не отдельные классы - сама БД, класс коннекта и т.п. Потому что можно сгруппировать максимально и в один объединить? Хотя ведь БД может быть тоже объектом (классом). Но можно ведь остаться в рамках процедурного программирования.

Правда, тогда будет:
Код:
if (mysql_connect($host))
{
...
};
А это можно запрятать в сам класс работы с БД. Я имею в виду случай, когда у нас много скриптов в веб-приложении, и тогда надо в каждом скрипте подключаться к базе. И в каждом скрипте придётся это вставлять. Собственно, фишка в этом?
vinniepooh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Когда стоит использовать постоянные соединения с Mysql? Illusiony PHP 5 13.10.2015 18:45
ООП - когда стоит использовать классы ? A9050 Общие вопросы C/C++ 10 25.02.2013 17:04
Когда нужно использовать ООП? leklerk Общие вопросы по программированию, компьютерный форум 49 01.06.2012 09:09
Не будет ли ошибкой использовать инвок для случаев, когда он не требуется? gramp C# (си шарп) 4 18.04.2012 20:41
сортировка, когда невозможно использовать свойства таблицы IndexFieldName Римма БД в Delphi 5 07.09.2007 10:56