ООП vs функции

1 234 5
T.R.O.N
На сайте с 18.05.2004
Offline
314
#21

Miracle, Больше верьте своему опыту и поменьше слушайте крики, особенно ярых сторонников/противников

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
WS
На сайте с 17.11.2010
Offline
25
#22
Miracle:
пытаюсь понять где это может пригодится

Может пригодится либо

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

б) Есть много глобальных переменных в скриптах, которые вредны для безопасности, тогда лучше использовать класс, в который вынести все эти переменные.

в) Есть группы функций делающие примерно одинаковые задачи, но которые отличаются небольшими изменения - можно создать один класс + кучу классов наследников

Например: Есть группы функций работающие с различными базами данных (MySQL, Microsoft SQL, Portress и т.п.), выполняют почти одинаковые действия за исключением коннекта и например получение значения автогенерирующего поля, тогда имеет смысл сделать их в виде классов.

То же самое с различными видами авторизации (через сессии, post, get и т.п.), парсерами

различных сайтов, загрузки различных файлов на сервер (изображений, видео, документов) и т.п.

Т.е. везде где функций несколько, а действия не сильно отличаются друг от друга.

P.S. Аналогия с функциями если у вас есть три функции которые на 99% одинаковые, имеет смысл добавить лишние аргументы и сделать одну на их основе, если у вас есть целые группы функций делающие одно и тоже имеет смысл использовать классы.

P.P.S. Плюсы использования классов на этом не ограничиваются, но они имеют смысл только при крупных и очень крупных проектах (например, то ООП реализует концепцию так называемых черных ящиков).

sirota77
На сайте с 08.09.2008
Offline
161
#23

ИМХО для использования ООП нужно иметь подходящий стиль мышления.

N
На сайте с 06.05.2007
Offline
419
#24
WhiteSmartFox:
делаете общий класс и кучу классов наследников в которых перекрываете незначительные части основного парсера.

И делаете функцию, передаете ей имена других частных функций, которые непосредственно парсят. В каком-то смысле это эмуляция виртуальных методов в ООП.

WhiteSmartFox:
например, то ООП реализует концепцию так называемых черных ящиков

а на практике программист из стремления к унификации тратит кучу времени на проектирование классов, попытки переопределить методы и разобраться в API, вместо написания бизнес-логики.

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

Кнопка вызова админа ()
edogs software
На сайте с 15.12.2005
Offline
775
#25
Miracle:
Владею несколькими интересными проектами, всегда все делаю сам, начиная от программирования и до.. ну не важно, так вот, почему-то в своих проектах мне всегда достаточно функций, и с классами (ООП) не работаю совсем. В каждом новом проекте стараюсь делать все на уровень выше, использую разные технологии, разные подоходы и тд, но вот к ооп никак не подойду. Я понимаю что это не страшно раз все работает и работает нормально, но как то чувствую себя недопрограммером, что ли, нет, я не вешаю нос и не плачусь, просто интересно, один я такой и на столько ли важно ООП в веб разработках?

Спасибо. Надеюсь понятно изложил мысли. (Просто дети во время письма усердно мне что-то рассказывали, спрашивали и тд.)

Почитайте пару умных книжек про ООП.

И запомните одну простую вещь - ООП нужно тогда, когда Вы с удивлением обнаруживаете, что с помощью функций реализуете "функционал" классов.

Естественный "путь", это сначала хранить настройки в глобальных переменных типа

$host,$login,$pwd

потом проект подрастает и появляется

$mysql_host, $ftp_host, $mysql_login...

потом Вы обнаруживаете что переменных слишком много и упаковываете их в

$mysql['host'], $ftp['login'];

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


function getGlobal ($var) {
static $globals;
//тута какой-нибудь полезный код отслеживающий изменение переменных
return $globals[$var];
}

или не дай бог даже нечто вроде


function getGlobal ($var) {
static $globals;
//тута какой-нибудь полезный код отслеживающий изменение переменных
//а тут нечто вроде кэширования
if($var=='newlogin' && !isset( $globals[$var])) { connect_to_FTP; get_file_from_FTP; save_var; }
return $globals[$var];
}

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


class globs {
static $gl;
function __set($var,$val) {
$this->gl[$var]=$val;
}
function __get($var) {
return $this->gl[$var];
}
}
globs::$var=5;
echo globs::$var;

То есть ООП есть смысл имплементировать только тогда, когда Вы понимаете, что своим велосипедом реализуете функционал ООП. Если Вы делаете это раньше, то Вы или фанатик или работаете над большим проектом или делаете "внешний" класс, который будут использовать другие.

Какое же дальнейшее логичное развитие, опять же приведем аналогичный пример.

Если у Вас сначала был код вида

mysql_query(, это ок

потом Вы сделали возможность логирования запросов, mysql_query переименовали в mysql_query2 а функцию mysql_query2 реализовали вида


function mysql_query2($sql) {
static $sqls=array();
$sqls[]=$sql;
return mysql_query($sql);
}

но потом Вы решили добавить еще один тип обращения к БД и Вам понадобилось нечто вроде


function query2($sql,$dbtype='mysql') {
static $sqls=array();
$sqls[]=$sql;
if($dbtype=='mysql) return mysql_query($sql);
else return mssql_query($sql);
}

И вот именно в этот момент Вы начинаете реализовывать велосипедное ООП, поэтому лучше перейти к настоящему вида


class db {
private $dbtype;
function __construct($type) {
$this->dbtype=$type;
}
function query($sql) {
if($this->dbtype=='mysql) return mysql_query($sql);
else return mssql_query($sql);
}
}

На функциях несложно сделать то же самое, но так Вы банально используете более распространённый подход.

Примеры привели намеренно упрощенные и наверное с очепятками, просьба не докапываться, а смотреть в суть.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
WS
На сайте с 17.11.2010
Offline
25
#26
netwind:
И делаете функцию, передаете ей имена других частных функций, которые непосредственно парсят. В каком-то смысле это эмуляция виртуальных методов в ООП.

Я не говорил что нельзя ООП реализовать через функции, делать эмуляцию можно, но зачем?

netwind:
а на практике программист из стремления к унификации тратит кучу времени на проектирование классов, попытки переопределить методы и разобраться в API, вместо написания бизнес-логики.

Если он не знает (плохо знает) ООП или его плохо знают те кто проектировал программму тогда да, если хорошо разбирается нет. Если происходит то что вы описывали скорее всего ООП в данном случае просто не был нужен.

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

Уже 3 года на основной работе занимаюсь явой, поверьте когда в проект'е миллиарды строк кода и десятки тысяч сотрудников без ООП не обойтись, поэтому для таких вещей самые популярные чисто ООП языки Ява и C#.

P.S. Для PHP ООП вовсе не является обязательным и для многих задач просто бесполезным, т.к. назначение ООП это крупные проекты, а не небольшие скрипты. И я не призываю всех немедленно идти учить ООП, как правило 99% кода в PHP можно реализовать функциями без всякого ООП и это будет и понятнее и проще, просто вопрос был "Когда ООП может пригодится".

N
На сайте с 06.05.2007
Offline
419
#27
Я не говорил что нельзя ООП реализовать через функции, делать эмуляцию можно, но зачем?

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

А никогда не приходило в голову что именно вследствие ООП

в проект'е миллиарды строк кода и десятки тысяч сотрудников

?

10 тыс сотрудников это ж вы что за проект пишите?

А, я понял - это вы придумали. Привычка к абстракциям и глобальным фантазиям неискоренима. Ну я уже писал об этом

HraKK
На сайте с 02.03.2009
Offline
128
#28

Нету стандартных правил где стоит применять ООП. ООП надо чувствовать и понимать.

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

Так и с ООП. Я долго думал где его надо применять и главное как, каждый раз писал и переписывал свои проекты, каждый раз думая о том как же я реализую то или другое. Так, вот в один прекрасный день я стал это чувствовать на уровне сердца. Я просто не представляю теперь как можно по другому сделать или написать. Где и как можно что-то применить. Я просто стал думать в стиле ООП.

Так что мой совет - не спрашивайте где и как надо его применять, а просто пишите. Без практики толку не будет. Just code!

Ну и конечно желательно почитайте что-то типа "Рефакторинг" М. Фаулера или "Совершенный код" Макиавелли(вроде).

P.S. Зачастую за процедурное программирование выступают люди поверхностно знающие ООП, которым оно тяжело дается и главное не правильно. Есть такие люди которые сдаются, а чтоб не выглядеть неудачниками, начинают обсырать ООП или говорить что процедурное лучше. Да, есть области где процедурное допустимо или мастхев, но в 90% это именно 1 случай.

я гарант (/ru/forum/493343) уже не оказываю данные услуги, извините.
WS
На сайте с 17.11.2010
Offline
25
#29
netwind:

10 тыс сотрудников это ж вы что за проект пишите?
А, я понял - это вы придумали. Привычка к абстракциям и глобальным фантазиям неискоренима. Ну я уже писал об этом

Почему придумал? http://netcracker.com

Проект по большому счету конечно не один, но программный продукт один (просто у каждого заказчика своя реализация основного кода) и его делают десятки тысяч человек (это кстати для ява проектов не предел, см. к примеру размеры продуктов Oracl'a).

Кстати подобные вещи делаются либо на яве, либо на C#, даже на С++ слишком тяжело проектировать при таких объемах. И вот при таких объемах ООП это жизненая необходимость.

netwind:

А никогда не приходило в голову что именно вследствие ООП

Нет, просто весь функционал БД Oracl'a не сделать одному прграммисту на коленке даже с использованием процедурного программирования. :)

Dreammaker
На сайте с 20.04.2006
Offline
570
#30
HraKK:
"Совершенный код" Макиавелли(вроде).

Макконнелл. Макиавелли - это, иезуит который "цель оправдывает средства" :)

1 234 5

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий