Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Избранное > объектное vs процедурное


Автор: Gold Dragon 28.12.2006, 07:22
ладно, примерно понял.. Только не видят проблем те, кто это умеет  делать smile 

Тогда вопрос в развитие темы.. Я разбирался в разных готовых скриптах и вижу что все спользуют классы. Я почему-то обхожусь одими функциями. Есть ли вообще смысл в классах (немного не так спросил smile ) , т.е. как сильно это облегчает или ускоряет работу?

Автор: -=Ustas=- 28.12.2006, 10:30
Цитата(Gold Dragon @  28.12.2006,  07:22 Найти цитируемый пост)
. Я почему-то обхожусь одими функциями. 

Функции это рутина, которая в конечном счете превращается в кашу, в которой потом разработчик начинает месить грязь. Классы, это иерархическая структурированная модель твоего приложения. Обратись к литературе по ООА и ООП, не важно какой язык, лишь бы теория была.

ЗЫ. Могу посоветовать почтитать на досуге Гради Буч-а "Объектно-ориентированный анализ и проектирование". Занимательная весч smile

Добавлено @ 10:35 
Тем более что в пятом PHP полностью переработана объектная модель smile

Автор: Mal Hack 28.12.2006, 15:46
Gold Dragon, разницы в подходе - никакой. Реализация просто несколько более запутанная и менее структурированная получается.

Автор: -=Ustas=- 28.12.2006, 16:04
Цитата(Mal Hack @  28.12.2006,  15:46 Найти цитируемый пост)
Gold Dragon, разницы в подходе - никакой.

Т.е.?! Можешь пояснить?

Автор: Mal Hack 28.12.2006, 16:11
-=Ustas=-, когда ты пишешь на ООП, ты в нужном месте делаешь $obj = new MyModulClass(), где MyModulClass - класс подключаемого модуля. Получается универсализм. Дальше работает уже сам модуль, через конструктор.
Тоже самое с функцями. Ты вызовешь какую-ть MainMyModulFunction, которая примет управление на себя и дальше будет вызывать те функции модуля, которые ей надо. Т.е. ядро только вызывает главную функцию модуля. Все. Ядру плевать что будет делать сам модуль.

Автор: -=Ustas=- 28.12.2006, 17:45
Цитата(Mal Hack @  28.12.2006,  16:11 Найти цитируемый пост)
ты в нужном месте делаешь $obj = new MyModulClass(), где MyModulClass - класс подключаемого модуля. Получается универсализм. Дальше работает уже сам модуль, через конструктор.

Ну это уже детали реализации smile Когда я говорил постом выше, я имел виду более обощено архитектуру модели и т.д. в этих самых подходах. 
Просто с твоим выражением "разницы в подходе - никакой" я категорично не согласен, т.к. тогда бы не было таких понятий как ООП и ПОП. ПОП - это последовательность выполнения действий, ООП - это поведение и взаимодействие. Зацитирую одного теоретика (непомню кто, либо Буч либо Страуструп)
Цитата

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


Ладно, Mal Hack, я прекращаю, ибо пахнет "ПОП vs ООП"  smile

Автор: Mal Hack 28.12.2006, 18:06
-=Ustas=-, это все так, ты прав, но моей ключевой мыслью было то, что:

Цитата(Mal Hack @  28.12.2006,  16:11 Найти цитируемый пост)
Т.е. ядро только вызывает главную функцию модуля. Все. Ядру плевать что будет делать сам модуль. 

Уж как это будет представлено - другой вопрос, ООП так ООП, СП, так СП.


Цитата(-=Ustas=- @  28.12.2006,  17:45 Найти цитируемый пост)
ООП - это поведение и взаимодействие

Давай будем реалистами. Применительно к PHP, объекты все равно несут лишь информационную модель скрипта, событиыйности-то нету smile

Автор: -=Ustas=- 28.12.2006, 18:32
Цитата(Mal Hack @  28.12.2006,  18:06 Найти цитируемый пост)
Применительно к PHP

Ну объектной модели PHP еще ползти smile Хотя в 5-ой значительные измения.
Цитата(Mal Hack @  28.12.2006,  18:06 Найти цитируемый пост)
Ядру плевать что будет делать сам модуль.

Ну это уже парадигма, сложенная на протяжении нескольких тысячилетий smile) Если же ядро будет контролировать еще и модули, то это не будет являться модульной архитектурой smile Высказался немного утрировано, но думаю понятно smile

Автор: Mal Hack 28.12.2006, 19:02
Цитата(-=Ustas=- @  28.12.2006,  18:32 Найти цитируемый пост)
Ну объектной модели PHP еще ползти smile Хотя в 5-ой значительные измения.

Но событийности, без изменения концепции языка, в нем все равно не будет.

Автор: Vaulter 28.12.2006, 22:43
а если взять конкретно OOП и PHP?
ведь по сути обьекта удобно это когда он существует "лопатя" запросы и т.д.
а в PHP важно в тоже время скорость обработки запроса smile
кстати давно задумывался над PHPшными демонами smile

Автор: Mal Hack 28.12.2006, 22:49
Цитата(Vaulter @  28.12.2006,  22:43 Найти цитируемый пост)
а если взять конкретно OOП и PHP?
ведь по сути обьекта удобно это когда он существует "лопатя" запросы и т.д.
а в PHP важно в тоже время скорость обработки запроса smile

Это уже надо смотреть на конкретной реализацией.


Цитата(Vaulter @  28.12.2006,  22:43 Найти цитируемый пост)
кстати давно задумывался над PHPшными демонами smile 

Все-таки это не PHP'шное дело.

Автор: Gold Dragon 29.12.2006, 14:30
Цитата(-=Ustas=- @  28.12.2006,  10:30 Найти цитируемый пост)
ЗЫ. Могу посоветовать почтитать на досуге Гради Буч-а "Объектно-ориентированный анализ и проектирование". Занимательная весч
 если есть в электронном виде, с удовольствием почитаю..

Так народ, что такое ПОП и ООП? smile

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

Автор: Mal Hack 29.12.2006, 15:25
Цитата(Gold Dragon @  29.12.2006,  14:30 Найти цитируемый пост)
Так народ, что такое ПОП и ООП? smile

ООП - объектно ориентированное программирование.
ПОП - процедурно-ориентированное, если я правильно понял. Мы его просто структурным называли.

Цитата(Gold Dragon @  29.12.2006,  14:30 Найти цитируемый пост)
всё равно не могу понять... Вот как я делаю.. Просто создаю разные функции: одна подключает бызу, другая получает данные, третья запихивает в базу. На сколько я понимаю, класс это тоже самое, только подключается чуть по другому и помоему код больше получается

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

Автор: Gold Dragon 29.12.2006, 21:39
давайте на примере если не трудно.. вот пример моих функций

Код

function fContentMenu($z){
//********************************************************************
// функция подключения к базе
//********************************************************************
       GLOBAL $baza;
       mysql_connect($baza['SERVER'], $baza['USER'], $baza['PASSW']) or die("Ошибка соединения с сервером");
       mysql_query("SET NAMES cp1251;") or die("Ошибка выбора кодовой страницы"); 
       mysql_select_db($baza['DB']) or die("Ошибка подключения базы");
}

function fContentMenu($z){
//********************************************************************
// функция для получение списка материала по категории
//********************************************************************
    $r = mysql_query($z);
    $info = array();
    for ($i=0; $i<mysql_num_rows($r); $i++) {
        $f = mysql_fetch_array($r);
        $info[$i]['id'] = $f['id'];
        $info[$i]['kat'] = $f['kat'];
        $info[$i]['name'] = $f['name'];
        //$info[$i]['text'] = $f['text'];
        $info[$i]['data'] = fDataToString($f['data']);
        $info[$i]['file'] = $f['file'];
        $info[$i]['n'] = ($i+1);
    }
    if(mysql_num_rows($r)==0){
        header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?page=error&id=1");
        exit;
    }
    return $info;
}

function fContentText($z){
//********************************************************************
// функция для получение текста материала
//********************************************************************
    $r = mysql_query($z);
    if(mysql_num_rows($r)>0){
        $f = mysql_fetch_array($r);
        $info['id'] = $f['id'];
        $info['kat'] = $f['kat'];
        $info['name'] = $f['name'];
        $info['text'] = $f['text'];
        $info['data'] = fDataToString($f['data']);
    }else{
        header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?page=error&id=1");
        exit;
    }
    return $info;
}

как это заменить на класс?


ps
кто-то обещал доку про классы.  smile 

Автор: Mal Hack 29.12.2006, 21:54
Код

class RD{

function fContentMenu($z){
//********************************************************************
// функция подключения к базе
//********************************************************************
       GLOBAL $baza;
       mysql_connect($baza['SERVER'], $baza['USER'], $baza['PASSW']) or die("Ошибка соединения с сервером");
       mysql_query("SET NAMES cp1251;") or die("Ошибка выбора кодовой страницы"); 
       mysql_select_db($baza['DB']) or die("Ошибка подключения базы");
}
function fContentMenu($z){
//********************************************************************
// функция для получение списка материала по категории
//********************************************************************
    $r = mysql_query($z);
    $info = array();
    for ($i=0; $i<mysql_num_rows($r); $i++) {
        $f = mysql_fetch_array($r);
        $info[$i]['id'] = $f['id'];
        $info[$i]['kat'] = $f['kat'];
        $info[$i]['name'] = $f['name'];
        //$info[$i]['text'] = $f['text'];
        $info[$i]['data'] = fDataToString($f['data']);
        $info[$i]['file'] = $f['file'];
        $info[$i]['n'] = ($i+1);
    }
    if(mysql_num_rows($r)==0){
        header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?page=error&id=1");
        exit;
    }
    return $info;
}
function fContentText($z){
//********************************************************************
// функция для получение текста материала
//********************************************************************
    $r = mysql_query($z);
    if(mysql_num_rows($r)>0){
        $f = mysql_fetch_array($r);
        $info['id'] = $f['id'];
        $info['kat'] = $f['kat'];
        $info['name'] = $f['name'];
        $info['text'] = $f['text'];
        $info['data'] = fDataToString($f['data']);
    }else{
        header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?page=error&id=1");
        exit;
    }
    return $info;
}

}

$obj = new RD();
$obj -> fContentMenu($z);

Автор: Vaulter 29.12.2006, 22:52
Gold Dragon, а что это? smile

Автор: Gold Dragon 30.12.2006, 09:41
я там малость ошибся... первая функция називается fConnect smile

Mal Hack, т.е. я тупо все свои функции загоняю в класс и получаю к ним доступ через $obj -> что-то??

Тогда нет никакой разницы между

Код

$q = $obj -> fContentText($z);
и
Код

$q = fContentText($z);


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


Цитата(Vaulter @  29.12.2006,  22:52 Найти цитируемый пост)
Gold Dragon, а что это? 

одна функция получает список названий статей и материалов, другая получает сам материал конкретной статьи. А что есть замечания или предложения?  smile с удовольствием выслушаю

Автор: Mal Hack 30.12.2006, 10:16
Цитата(Gold Dragon @  30.12.2006,  09:41 Найти цитируемый пост)
Mal Hack, т.е. я тупо все свои функции загоняю в класс и получаю к ним доступ через $obj -> что-то??


Цитата(Gold Dragon @  30.12.2006,  09:41 Найти цитируемый пост)
Наверное это самое примитивное использование классов и там есть что-то такое, чего я ещё не понимаю.. 



Угу

Автор: BuShaRt 2.1.2007, 00:50
 smile 
Потести смарти и сразу поймешь, что такое целостый класс...
 
Недавно с другом готовились сдавать Удаленные базы данных, ну он вообшем ламер полный, спросил че такое класс, я подумал подумал и ответил, что это коллекция методов (функций)... Хотя ответ не раскрывает все сути, но в целом становиться яснее...
Кроме того все методы связанны между собой=) 

Вот примерчик юзанья класса.. может не самый удачный... но я именно с этого момента понял, что классы лучше функций (когда писал код)
Код

class WorkMySQL {
    var $query;
    var $link;
    var $dbhost;
    var $dbuser; 
    var $dbpass; 
    var $dbname; 
    var $dbprif;  
    
    
    function WorkMySQL ($select=true) {
        //Подключение файла конфигурации
        include 'config.php';
        //Определение внутриклассовых переменных
        $this->dbhost = $dbhost;
        $this->dbuser =    $dbuser;
        $this->dbpass =    $dbpass;
        $this->dbname =    $dbname;
        $this->dbprif =    $dbprif;
        //Подключение к СУБД
        ($this->link = mysql_pconnect($this->dbhost, $this->dbuser, $this->dbpass)) || die("Couldn't connect to MySQL");
        //Если в качестве аргумента не передеанно FALSE, то выделяем определененную БД.
        if ($select) mysql_select_db($this->dbname, $this->link) || die("Couldn't open db: ".$this->dbname.". Error if any was:".mysql_error() );
        
    }
    
    //Метод экранирования запроса
    function quote_smart($value,$x=true) {
         // если magic_quotes_gpc включена, то снимаем экранированние
     if (get_magic_quotes_gpc()) $value = stripslashes($value);
        //Если переменная не число и $x не вводилось, то окружаем кавычками и экранируем
     if ($x) {
            if (!is_numeric($value)) $value = "'" . mysql_real_escape_string($value) . "'";
            return $value;
        //Если переменная $x была введена со значением FALSE, значит $value уже окруженна кавчками
        } else {
            if (!is_numeric($value)) $value = mysql_real_escape_string($value);
            return $value;
        }        
    }
    
    //Проверка пароля
    function CheckPass($login, $password) 
    {    
        $this->query = sprintf ("SELECT login, password, grup FROM %s WHERE login=%s and password=%s",
                $this->quote_smart($this->dbprif."_users",false),
                $this->quote_smart($login),
                $this->quote_smart($password));
        $result=mysql_query($this->query, $this->link) or die("Error returned if any: ".mysql_error());
        if(mysql_num_rows($result)==1) {
            $row=mysql_fetch_array($result);
            return $row;
        }
        return false;
    }

//Теперь чтоб проверить совпадает ли логин и пароль надо только
include 'WorkMySQL';
$mysql_obj = new WorkMySQL;
if (!($row = $mysql_obj->CheckPass ($_POST['login'], $_POST['password']))) {
    $filter_obj->messages[] = 'Логин - пароль не совпадают.';    




Автор: Opik 2.1.2007, 06:15
Цитата

Итак, в чем же основные преимущества ООП, почему оно стало таким популярным ? 

Как ни странно, но трудно ответить на этот вопрос не объяснив базовых понятий. Уверен, что усвоив базовые понятия ООП, вы сами без труда ответите на этот вопрос. 

Несмотря на то, что в различных источниках делается акцент на те или иные особенности внедрения и применения ООП, 3 основных (базовых) понятия ООП остаются неизменными. К ним относятся: 

Наследование (Inheritance) 
Инкапсуляция (Encapsulation) 
Полиморфизм (Polymorphism) 
Эти понятия, как три кита, лежат в основе мира ООП и, конечно же, будут рассмотрены мною подробнейшим образом. Наряду с ними будет рассмотрен и ряд других понятий и определений. 
А для начала рассмотрим пару мнений, которые в какой-то степени помогут Вам прояснить сложившуюся вокруг поставленного вопроса ситуацию. 

Итак, первое из них имеет некоторый академический оттенок: 

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

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

Не очень понятно ? Тогда попробуем зайти с другой стороны и упростим описание. Начнем с общеизвестного примера. 

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

Что Вы сделали для того, чтобы получить соль ? Просто сказали: "Передай мне, пожалуйста, соль". 

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

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

Так в чем же принципиальная разница ? 

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

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

Этот простой пример иллюстрирует только один из принципов ООП, суть которого: "Объект отвечает за все действия, которые он производит в ответ на запрос клиента". 

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

http://www.firststeps.ru/theory/oop/r.php?2

Автор: Eugene_Bond 2.1.2007, 11:13
Mal Hack, очень вредный пример. только отпугивать от применения ООП годится smile

В продолжение начатого Opikом: http://www.kuro5hin.org/story/2006/3/14/175929/544 -- простое и ясное объяснение полиморфизма

Автор: Mal Hack 2.1.2007, 14:55
Opik, без обид, но статья ни о чем smile
Точнее она о основах ООП, как о его возможностях при реализации тех или иных вещей, но нет ни слова, относительно того, что такое ООП для проектирования... К сожалению, инет кишит такими статьями, а сути, которая не в реализации и возможностях, а в теории проектирования нигде нет... ИМХО, конечно.

Цитата(Eugene_Bond @  2.1.2007,  11:13 Найти цитируемый пост)
Mal Hack, очень вредный пример. только отпугивать от применения ООП годится smile

Интересно чем? Что я показал базовый синтаксис описания класса и создания объекта?
Да и вашего "не вредного" примера я тут что-то не видел.

Автор: Blaga 2.1.2007, 15:02
А может кто нибудь даст почитать по теме? А то никак не могу найти. Нужно что бы было применимо именно к PHP. И что бы на русском. smile

Автор: Mal Hack 2.1.2007, 15:14
Из того, что видел я (и писал сам), могу предложить:
http://phpclub.ru/detail/article/oop-vs-proc
http://phpclub.ru/detail/article/intro_php5
http://vingrad.ru/PHP-ART-002848

Автор: BuShaRt 2.1.2007, 15:51
Код

<?php 

print "Hello, world."; 

?>  

Вот пример объектно-ориентированного кода, который делает то же самое: 

<?php 

class helloWorld { 
  function myPrint() { 
    print "Hello, world."; 
  } 

$myHelloWorld = new helloWorld(); 
$myHelloWorld->myPrint(); 

?>
 

Я плакал, новички теперь будут счастливы писать на ООП )))

Автор: Mal Hack 2.1.2007, 15:56
BuShaRt, плакать ты можешь столько, сколько тебе вздумается, только вот попробуй объяснить начинающему, что такое ООП и как вообще оно работает вот на таком коде:

Код

<?php

    class clKernel extends clGlobalSQL 
    {
        protected  $TEXT = "";
        
        public  $Errors = array();
        public  $ErrorCount = 0;
        
        protected   $ModulLink = null;
        protected   $PDO = null;
        protected    $LNG = null;
        
        public  $CurrTime = "";
        public  $glURI = "";
        
        public  $User = null;
        public  $UserAuth = false;
        public  $us_ip = "";
        public  $us_agent = "";
        public  $us_hash = "";
        
        public function __construct( $mod , $pdo , $lng , $glURI )
        {
            $this->ModulLink = & $mod;
            $this->PDO       = & $pdo;
            $this->LNG       = $lng;

            $this->ModulLink->KernelLink = & $this;
            
            $this->glURI     = $glURI;    
            $this->us_ip     = $this->kerSfGetIP();
            $this->us_agent     = $_SERVER['HTTP_USER_AGENT'];            
            $this->CurrTime  = time() + ( date( "z" ) * 3600 - C_TIMEZONE * 60 );
            
            if ( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_POST['action'] ) ) 
            {
                switch ( $_POST['action'] )
                {
                    case "auth":        $this->kerAuth();
                    break;
                }
            }
            
            $this->kerMwOutPut();
        }

        protected function kerMwOutPut()
        {
            $this->kerAuthCheck();
            $this->TEXT = $this->skGlobalMain();        
            $this->kerTMPLParser();
            print $this->TEXT;    
        }
        
        protected function __call( $name , $arguments )
        {
            return  ( $this->ModulLink != null && method_exists( $this->ModulLink , $name ) ) 
                    ? call_user_func( array( $this->ModulLink , $name ) )
                    : ( ( $name == "modCreate" ) ? $this->kerMwGET() : "" );
        }
        
        protected function __get( $name )
        {
            return  ( $this->ModulLink != null && isset( $this->ModulLink-> { $name } ) ) 
                    ? $this->ModulLink-> { $name }
                    : "[Unknown property " . $name . "]";
        }

        protected function kerMwGET()
        {
            if ( ! empty( $this->glURI[1] ) ) 
            {
                switch ( $this->glURI[1] )
                {
                    default:        return $this->skGlobalWelcomeText();
                    break;      
                }
            }
        }

        protected function kerMwErrors()
        {
            return  ( sizeof( $this->Errors ) == 0 )
                    ? ""
                    : $this->skGlobalErrors( implode( "<br />" , $this->Errors ) );
        }

        public function kerMwSetError( $error )
        {
            $this->Errors[] = $error;
            $this->ErrorCount++;
        }

        public function kerPDO( $query , $params = array() )
        {    
            $link = null;

            if( ! method_exists( $this , $query ) )
            {    
                if( ! method_exists( $this->ModulLink , $query ) )
                {    throw new PDOException( "Unknown query: " . $query );    }
                else    
                {    $link = $this->ModulLink;    }
            }
            else 
            {    $link = $this;    }
            
            //print_r($params);
            $dbh = $this->PDO->prepare( call_user_func( array( $link , $query ) ) );
            $dbh->execute( $params );

            return $dbh;
        }

        protected function kerTMPLParser()
        {
            $this->TEXT = str_replace( "<% CSS %>" , $this->skGlobalCSS() . "\n" . $this->kerMwGetModMethodResult( "skModulCSS" ) , $this->TEXT );
            $this->TEXT = str_replace( "<% JAVASCRIPT %>" , $this->skGlobalJavaScript() . "\n" . $this->kerMwGetModMethodResult( "skModulJavaScript" ) , $this->TEXT );
            $this->TEXT = str_replace( "<% BASEPATH %>" , $this->skGlobalBasePath() , $this->TEXT );
            $this->TEXT = str_replace( "<% TOP %>" , $this->skGlobalTop() , $this->TEXT );
            $this->TEXT = str_replace( "<% QUIT_BUTTON %>" , ( ( $this->UserAuth ) ? $this->skGlobalQuitButton() : "" ) , $this->TEXT );
            
            $temp = ( $this->UserAuth ) 
                    ? $this->skGlobalContent() 
                    : $this->skGlobalLoginForm();
            
            $this->TEXT = str_replace( "<% CONTENT %>" , $temp , $this->TEXT );    
            $this->TEXT = str_replace( "<% MAIN_MENU %>" , ( ( $this->UserAuth ) ? $this->skGlobalMainMenu() : "" ) , $this->TEXT );    
            $this->TEXT = str_replace( "<% BODY %>" , $this->modCreate() , $this->TEXT );    
            $this->TEXT = str_replace( "<% BOTTOM %>" , $this->skGlobalBottom() , $this->TEXT );
            $this->TEXT = str_replace( "<% ERRORS %>" , $this->kerMwErrors() , $this->TEXT );
        }

        public function kerSfRedirect( $url = "" )
        {
            header( "Location: " . ( ( empty( $url ) ) ? $_SERVER['REQUEST_URI'] : $url ) );
            exit();
        }

        public function kerSfSetCookie( $name , $value , $time )
        {    setcookie( $name , $value , $this->CurrTime + $time , "/" );    }

        public function kerSfDelCookie( $name )
        {    setcookie( $name , "" , 3 , "/" );    }

        public function kerSfGetIP()
        {
            if ( $ip = getenv( "HTTP_CLIENT_IP" ) )
         {  return ( ip2long( $ip ) !== false ) ? $ip : "[unknown]";  }

            if ( $ip = getenv( "HTTP_X_FORWARDED_FOR" ) )
         {
              if ( $ip == '' || $ip == "unknown" )
               {  $ip = getenv( "REMOTE_ADDR" );  }

              return ( ip2long( $ip ) !== false ) ? $ip : "[unknown]";    
         }
        
         if ( $ip = getenv( "REMOTE_ADDR" ) )
         {  return ( ip2long( $ip ) !== false ) ? $ip : "[unknown]";  }
        }

        public function kerSfGetMicroTime()
        {
            $mt = explode( " ", microtime() );
            return ( (float) $mt[0] + (float) $mt[1] );
        }

        public function kerSfBuildListBox( $arr , $checked = "" )
        {
            $ret = "";

            foreach( $arr as $k => $v )
            {    $ret .= "<option value=". $k ." " . ( ( $k == $checked ) ? "selected" : "" ) . ">" . $v . "\n";        }
            
            return $ret;            
        }

        public function kerSfCheckEmail( $email )
        {    return ( preg_match( "#^([a-z0-9]){1}[a-z0-9\-_.+]*([a-z0-9]){1}@[a-z0-9]{1,}(([a-z0-9]{1,}[a-z0-9\-\.]{0,1}[a-z0-9]{1,})|[a-z0-9]{1,})*\.[a-z]{2,4}$#i" , $email ) ) ? true : false;    }

        public function kerSfGetGroups()
        {
            $dbh = null;
            $dbh = $this->kerPDO( "sqlGlobalGetGroups" );
            
            $result = $dbh->fetchAll();
            
            foreach( $result as $k => $v )
            {    $g[ $v['group_id'] ] = $v['group_name'];    }
                
            return $g;
        }
        
        public function kerSfVerifyPasswords( $p1 , $p2 )
        {
            if( ! empty( $p1 ) && ! empty( $p2 ) )
            {
                if( sha1( $p1 ) != sha1( $p2 ) )
                {    $this->kerMwSetError( $this->LNG['error_pass_did_match'] );    }
                elseif( strlen( $p1 ) < 8 )
                {    $this->kerMwSetError( $this->LNG['error_pass_short'] );    }
                else 
                {    return true;    }
            }
            elseif( empty( $p1 ) )
            {    $this->kerMwSetError( $this->LNG['error_pass_enter'] );    }
            else 
            {    $this->kerMwSetError( $this->LNG['error_pass_repeat'] );    }
        
            return false;
        }
        
        public function kerSfRus2Lat( $text )
        {
            $rus = array( "Рђ" , "Р‘" , "Р’" , "Р“" , "Р”" , "Р•" , "РЃ" , "Р–" , "Р—" , "Р˜" , "Р™" , "Рљ" , "Р›" , "Рњ" , "Рќ" , "Рћ" , "Рџ" , "Р " , "РЎ" , "Рў" , "РЈ" , "Р¤" , "РҐ" , "Р¦" , "Р§" , "РЁ" , "Р©" , "РЄ" , "Р«" , "Р¬" , "Р­" , "Р®" , "РЇ" ,
                          "Р°" , "Р±" , "РІ" , "Рі" , "Рґ" , "Рµ" , "С‘" , "Р¶" , "Р·" , "Рё" , "Р№" , "Рє" , "Р»" , "Рј" , "РЅ" , "Рѕ" , "Рї" , "СЂ" , "СЃ" , "С‚" , "РЈ" , "С„" , "С…" , "С†" , "С‡" , "С?" , "С‰" , "СЉ" , "С‹" , "СЊ" , "СЌ" , "СЋ" , "СЏ" 
                        );
            $lat = array( "A" , "B" , "V" , "G" , "D" , "E" , "E" , "ZH" , "Z" , "I" , "IY" , "K" , "L" , "M" , "N" , "O" , "P" , "R" , "S" , "T" , "U" , "F" , "KH" , "C" , "CH" , "SH" , "SHCH" , "" , "Y" , "'" , "E" , "YU" , "YA" ,
                          "a" , "b" , "v" , "g" , "d" , "e" , "e" , "zh" , "z" , "i" , "iy" , "k" , "l" , "m" , "n" , "o" , "p" , "r" , "s" , "t" , "u" , "f" , "kh" , "c" , "ch" , "sh" , "shch" , "" , "y" , "'" , "e" , "yu" , "ya" 
                        );
                        
            return str_replace( $rus , $lat , $text );
        }

        protected function kerAuthSecurityHash()
        {  $this->us_hash = md5( $this->User->user_nick ) . md5( $this->us_agent ) . md5( $this->us_ip ) . md5( $this->CurrTime );  }

        protected function kerAuthFalse()
        {
            $this->kerSfDelCookie( "session_user" );
            $this->kerSfDelCookie( "session_time" );
        }

        protected function kerAuthCheck()
        {
            if( ! isset( $_COOKIE['session_user'] ) || ! isset( $_COOKIE['session_time'] ) )
            {    
                $this->User = null;
                return;
            }
            
         $dbh = null;
            $dbh = $this->kerPDO( "sqlGlobalGetUser" , array( ":user_nick" => $_COOKIE['session_user'] ) );
                
            if( ( $result = $dbh->fetch( PDO::FETCH_OBJ ) ) === false )
            {    $this->kerAuthFalse();    }

         $this->User = $result;
         $this->kerAuthSecurityHash();
         
         $temp =  $this->CurrTime + ( 15 * 60 );

         $dbh = null;
         $dbh = $this->kerPDO( "sqlGlobalGetUserSession" , array( ":id" => $this->User->user_id , ":hash" => $this->us_hash , ":time" => $temp ) );
            
            if( ( $result = $dbh->fetch( PDO::FETCH_OBJ ) ) === false )
            {    $this->kerAuthFalse();    }

            if( isset( $_GET['quit'] ) )
         {
             $dbh = null;
             $dbh = $this->kerPDO( "sqlGlobalDeleteUserSession" , array( ":id" => $this->User->user_id , ":hash" => $this->us_hash ) );

                $this->kerAuthFalse();
                $this->kerSfRedirect( "/admin/" );
         }
            
         $dbh = null;
         $dbh = $this->kerPDO( "sqlGlobalUpdateUserSession" , array( ":id" => $this->User->user_id , ":hash" => $this->us_hash , ":time" => $this->CurrTime ) );

         $this->kerSfSetCookie( "session_user" , $this->User->user_nick , 604800 );
            $this->kerSfSetCookie( "session_time" , $temp , 604800 );
         
         $this->UserAuth = TRUE;        
        }

        protected function kerAuth()
        {
            if( empty( $_POST['login'] ) || empty( $_POST['pass'] ) || empty( $_POST['security_hash'] ) || sha1( $_POST['security_hash'] ) != C_ADMIN_HASH )
            {    $this->kerSfRedirect();    }
            
         $dbh = null;
         $dbh = $this->kerPDO( "sqlGlobalGetUserPass" , array( ":user_nick" => $_POST['login'] , ":user_pass" => sha1( $_POST['pass'] ) ) );

         if( ( $result = $dbh->fetch( PDO::FETCH_OBJ ) ) === false )
            {    $this->kerAuthFalse();    }

         $this->User = $result;
            $this->kerAuthSecurityHash();
         
         $temp = $this->CurrTime + ( 15 * 60 );

         $dbh = null;
         $dbh = $this->kerPDO( "sqlGlobalCreateUserSession" , array( ":id" => $this->User->user_id , ":hash" => $this->us_hash , ":time" => $temp ) );

            $this->kerSfSetCookie( "session_user" , $this->User->user_nick , 604800 );
            $this->kerSfSetCookie( "session_time" , $temp , 604800 );
            
            $this->kerSfRedirect();        
        }
    };

?>

Автор: BuShaRt 2.1.2007, 16:09
Mal Hack
Ну как не как новичок врядли решит программироваться на том примере, где 7 строк, когда есть пример в 1 строку=))

Автор: Mal Hack 2.1.2007, 16:12
Цитата(BuShaRt @  2.1.2007,  16:09 Найти цитируемый пост)
Ну как не как новичок врядли решит программироваться на том примере, где 7 строк, когда есть пример в 1 строку=)) 

Еще раз объясняю для тех кто на подлодке.
Ты будешь новичку показывать основы синтаксиса и применения ООП в PHP на модуле из 1000 строк? Нет.
Я говорю о том, как показать основы. Чтобы человек решил использовать ООП, он должен до этого дорасти, тобишь осознать ТЕОРЕТИЧЕСКИЕ аспекты ООП, а не код на 1000 строк.

Автор: BuShaRt 2.1.2007, 16:14
Mal Hack
Цитата

Чтобы человек решил использовать ООП, он должен до этого дорасти, тобишь осознать ТЕОРЕТИЧЕСКИЕ аспекты ООП, а не код на 1000 строк.


 smile Верно... 

тока получается новичку вообше нет смысла показывать плюсы ООП+))

Автор: Eugene_Bond 2.1.2007, 22:09
Цитата(Mal Hack @  2.1.2007,  14:55 Найти цитируемый пост)
Интересно чем? Что я показал базовый синтаксис описания класса и создания объекта?

Скорее тем, что после такого примера кроме усложнения синтаксиса преимуществ не ощущается..


Цитата(Mal Hack @  2.1.2007,  14:55 Найти цитируемый пост)
Да и вашего "не вредного" примера я тут что-то не видел.

Мне тоже лень что-то обильное писать, но ща поднатужусь..

Автор: Opik 2.1.2007, 22:26
Цитата(Mal Hack @  2.1.2007,  13:55 Найти цитируемый пост)
Opik, без обид, но статья ни о чем


Я не так не считаю, там на явном примере поясняется смысл.
Читайте тогда здесь: http://www.intuit.ru/department/se/tppobj/

Автор: Eugene_Bond 2.1.2007, 22:32
Что-то вроде этого..
Опять таки упрощенно и "на коленке" в блокноте написанное. Может и не запуститься

Код

<?php


    class db {        
        protected $host = 'localhost'; 
        protected $base = 'test'; 
        protected $port = 3306; 
        protected $user = 'root'; 
        protected $pass = ''; // ;-)
        
        // Hold an instance of the class
        private static $instance;
        
        private function __construct() {
            mysql_connect($this->host, $this->user, $this->pass) or die("Ошибка соединения с сервером");
            mysql_select_db($this->base) or die("Ошибка подключения базы");
        }
        
        public static function singleton() {
            if (!isset(self::$instance)) {
                $c = __CLASS__;
                self::$instance = new $c;
            }
            return self::$instance;
        }
        
        public function Exec($sql) {
            $result = mysql_query($sql);
            if (!$result) {
                trigger_error("Could not successfully run query ($sql) from DB: " . mysql_error(), E_USER_ERROR); // You can to throw exception if you like it more
                return false;
            }
            $res = array();
            if (mysql_num_rows($result) > 0) {
                while ($row = mysql_fetch_assoc($result)) {
                    $res[] = $row;
                }
            }
            return $res;
        }
    }
    
    class pageProcessor {
        
        private $db;
        private $pageId;
        
        private function __construct() {
            $this->db = db::singleton();
        }
        
        public function getContentText() {
            $sql = "SELECT * FROM table WHERE id='$id'";    // I think it's something like this here
            if (count($res = (array) $this->db->Exec($sql))) {
                return array_shift($res);
            } else {
                header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?page=error&id=1");
                exit;
            }
        }
        
        public function getContentMenu() {
            $sql = "???";    // Some SQLfor menu
            if (count($res = (array) $this->db->Exec($sql))) {
                return $res;
            } else {
                header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?page=error&id=1");
                exit;
            }
        }
    }
    
    
    $pageOne = new pageProcessor(18);    //This is page #18
    $pageTwo = new pageProcessor(69);    // This is page #69
    
    $pageOneMenu = $pageOne->getContentMenu();    // Menu for page #18
    $pageOneText = $pageOne->getContentText();    // Text for page #18


Автор: Mal Hack 2.1.2007, 22:57
Цитата(Opik @  2.1.2007,  22:26 Найти цитируемый пост)
Я не так не считаю, там на явном примере поясняется смысл.

Вот честно, перечитал еще раз... Уже зная что такое ООП не могу ну никак соединить этот пример с ООП. Да, отдалено суть показывает, но отдаленно. Но, ИМХО, конечно же.


Цитата(Opik @  2.1.2007,  22:26 Найти цитируемый пост)
Читайте тогда здесь: http://www.intuit.ru/department/se/tppobj/ 

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

Цитата(Eugene_Bond @  2.1.2007,  22:32 Найти цитируемый пост)
Опять таки упрощенно и "на коленке" в блокноте написанное. Может и не запуститься

Тогда какого черта надо сюда это постить !!

Цитата(Eugene_Bond @  2.1.2007,  22:09 Найти цитируемый пост)
Скорее тем, что после такого примера кроме усложнения синтаксиса преимуществ не ощущается..

Почитай внимательнее о чем я с BuShaRt'ом дискутировал... Тоже самое и в твоем случае.


Автор: Eugene_Bond 2.1.2007, 23:14
Цитата(Mal Hack @  2.1.2007,  22:57 Найти цитируемый пост)
Тогда какого черта надо сюда это постить !!

Многоуважаемый Мал Хак.
Грубите, пожалуйста, своей бабушке! Вы же модератор..



Цитата(Mal Hack @  2.1.2007,  22:57 Найти цитируемый пост)
Почитай внимательнее о чем я с BuShaRt'ом дискутировал...

Любые основы должны демонстрировать преимущества. Например уменьшение количества строк кода, функциональность и удобство в применении.

Автор: Mal Hack 2.1.2007, 23:18
Цитата(Eugene_Bond @  2.1.2007,  23:14 Найти цитируемый пост)
Многоуважаемый Мал Хак.
Грубите, пожалуйста, своей бабушке! Вы же модератор..

Я считаю неуважение к участникам форума выкладывать код, который: "Может и не запуститься".

Цитата(Eugene_Bond @  2.1.2007,  23:14 Найти цитируемый пост)
Любые основы должны демонстрировать преимущества. Например уменьшение количества строк кода, функциональность и удобство в применении. 


Цитата(Mal Hack @  2.1.2007,  16:12 Найти цитируемый пост)
Еще раз объясняю для тех кто на подлодке.
Ты будешь новичку показывать основы синтаксиса и применения ООП в PHP на модуле из 1000 строк? Нет.
Я говорю о том, как показать основы. Чтобы человек решил использовать ООП, он должен до этого дорасти, тобишь осознать ТЕОРЕТИЧЕСКИЕ аспекты ООП, а не код на 1000 строк. 


Автор: Eugene_Bond 3.1.2007, 07:35
Цитата(Mal Hack @  2.1.2007,  23:18 Найти цитируемый пост)
Я считаю неуважение к участникам форума выкладывать код, который: "Может и не запуститься".

http://forum.vingrad.ru/index.php?showtopic=129302&view=findpost&p=979753

Вопросов больше не имею

Автор: -=Ustas=- 3.1.2007, 23:54
Gold Dragon, я тебе говорил за эту литературу, на мой взгляз неплохие труды в плане теории. http://vmk.ugatu.ac.ru/book/buch/index.htm. Потом можно заодно и Страуструпа почитать.

Автор: awers 4.1.2007, 03:02
Вообще каждой цели свои методы.
Там где надо написать hello world я буду писать hello world
А там где пахнет модулем - class hello { functuion message(){print(__CLASS__.' world'); } }

Думаю так )

Автор: Gold Dragon 4.1.2007, 10:40
Так, народ, я хоть и новичок, но создать class hello в состоянии. Меня больше интересует не элементарное использование, а именно то, что другими способами сделать труднее.



PS 
кстати, тему лучше переименовать с Философия class smile

Добавлено @ 10:44 

кстати, очень понравилась статья
http://vmk.ugatu.ac.ru/book/buch/index.htm

правда пока только начал читать

Автор: -=Ustas=- 4.1.2007, 11:26
Gold Dragon, потом как ты ознакомишься с теорией ООП, советую прочитать http://www.citforum.ru/SE/project/pattern/, чтобы ты имел представление где и как строить архитектуру классов и самого приложения ;)

Автор: Mal Hack 4.1.2007, 14:51
Цитата(Gold Dragon @  4.1.2007,  10:40 Найти цитируемый пост)
Меня больше интересует не элементарное использование, а именно то, что другими способами сделать труднее.

Большая задача. Большое кол-во переменных. При структурном подходе ты был вынужден каждую через global подключать или через параметры передавать, а при объектом тебе достаточно ее один раз в конструкторе в свойство записать и затем с ним работать.

Автор: Gold Dragon 4.1.2007, 15:58
вот! это уже интересно. Если честно, то для меня это уже стоновится проблемой.

Автор: nerezus 15.4.2007, 19:40
Цитата

Давай будем реалистами. Применительно к PHP, объекты все равно несут лишь информационную модель скрипта, событиыйности-то нету
 Как это нету? Когда нто лишь недостаток реализации определенной программы, в которой ее нету.

Автор: CyClon 17.4.2007, 21:34
Если хочется понять ООП в PHP - имхо нужно читать литературу по ООП, в которой все примеры демонстрируются на PHP, а не на других языках...

Вообще, я смотрю ООП мало кому дается так легко smile Буквально год назад я вообще не понимал зачем это нужно, какой из этого толк и вообще "функции рулят". Когда перечитал несколько статей о ООП в PHP от разных авторов и понял основы, все равно не примеял его. Но постепенно начал сталкиваться с задачами и вспоминая основы ООП задумывалвася "А ведь это можно написать с использование классов, получится проще и красивее". Сейчас время от времени применяю.

Автор: -=Ustas=- 18.4.2007, 22:38
Цитата(CyClon @  17.4.2007,  21:34 Найти цитируемый пост)
Если хочется понять ООП в PHP - имхо нужно читать литературу по ООП, в которой все примеры демонстрируются на PHP, а не на других языках...

Ну тут ты в корне не прав, и я могу тебе это доказать и даже убедить тебя. ООП - это Объектно-Ориентированный Подход, а на каких языках - это уже по-барабану. Да, я согласен, в некоторых языках такая объектная модель, в других такая-то, но теоретическая основа везде аналогична, и ОБЪЕКТ он и в африке объект. Поэтому прежде - МАТ-чать!

Автор: CyClon 21.4.2007, 16:39
Цитата
Ну тут ты в корне не прав, и я могу тебе это доказать и даже убедить тебя. ООП - это Объектно-Ориентированный Подход, а на каких языках - это уже по-барабану. Да, я согласен, в некоторых языках такая объектная модель, в других такая-то, но теоретическая основа везде аналогична, и ОБЪЕКТ он и в африке объект. Поэтому прежде - МАТ-чать!


Если будет выбор книг: ООП, ООП в (Visual Basic || Delphi || C++), ООП в PHP. Объем книг одинаковый, автор у всех вменяемый. Я бы выбрал ООП в PHP. Теория подкрепляется примерами на самом PHP. Если мне нужно понять ООП вообще и использовать его в PHP, этот выбор будет разумнее чем книга про просто ООП, и тем более про ООП в других языках.

Автор: nerezus 21.4.2007, 20:42
А что, много книг про ООП в ПХП?  smile 
Насколько я знаю, это не так ;)

Автор: Sergey912 21.4.2007, 20:43
Из всего топика и вообще в ООП понял, что оно лучше в проектировке так как задумывается как единое целое т.е. объекты могут взаимодействовать и пишутся с учетом связей в друг друге + к тому однотипные группируются в один класс, скажем класс баз данных и потом их удобно юзать. Кстати если класс грамотно написан им удобно пользоваться даже если его писал не ты, скажем в отличии от 50 процедур, которые писались под конкретную задачу и использовать их по делу для других часто довольно сложно....

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

- 3 группы текстов
- по 50 в каждом
- нестандартная верстка

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

Автор: Vaulter 3.5.2007, 22:05
ООП там где много повторного кода.

Автор: Letov 7.5.2007, 22:08
ООП - как стиль программирования. Кто-то его придерживается, а кто-то - нет. Каждый выбирает сам для себя. ООП - структурированная модель. Удобно в больших приложениях. Функция - для маленьких приложений или старых версий языка. Переносить, например, приложение с PHP5 на PHP4 удобнее, если использовать функции.

Автор: -=Ustas=- 8.5.2007, 09:22
Слушайте, подобная тема "объектное vs процедурное" уже далеко не актуальна, по интернету подобных обсуждей как грязи. Чтоб понять ху из ху, нужно взять любую книгу какого-нить ООриентированного языка, пусть тот же C++ или Java (есть и просто теория) , там в первых главах обзательно эта тема затрагивается, после прочтения которых вопросы у вас сами отпадут.

Добавлено через 4 минуты и 20 секунд
Ну... не все вопросы конечно, сразу отпадут, но часть эт точно, а после практической реализации точно все.

Автор: WolfON 13.5.2007, 13:24
Каждый подход применим к своей задаче.
Хороший программист должен писать хороший не только ОО код, но и функциональный и структурный.

Автор: koreshX 22.5.2007, 17:24
Цитата

Функции это рутина, которая в конечном счете превращается в кашу, в которой потом разработчик начинает месить грязь.

CMS Drupal - пример, где модули пишутся исключительно с использованием функционального подхода. И я почему-то совершенно не видел каши, рутины или грязи. В тоже время встречал исключительно объектные проекты, в которых было разобьраться почти не реально. ПРограммируя на php использовать ооп нужно там где это нужно, а не везде, как мне кажется. Ибо это не Java и не C# (и не руби..), где ооп есть основа всего и вся.
Моё ИМХО - пытаться писать на пхп исключительно объектно - это будет лишь пародия на системы написанные на исключительно объектных языках.

Автор: vasac 23.5.2007, 10:33
Цитата(koreshX @  22.5.2007,  17:24 Найти цитируемый пост)
И я почему-то совершенно не видел каши

А я видел smile

Цитата(koreshX @  22.5.2007,  17:24 Найти цитируемый пост)
пытаться писать на пхп исключительно объектно - это будет лишь пародия на системы написанные на исключительно объектных языках. 

Мотивируйте, пожалуйста. А так же поясните, что такое "исключительно объектно".

Автор: koreshX 24.5.2007, 00:00
Цитата

Мотивируйте, пожалуйста. А так же поясните, что такое "исключительно объектно".


"Исключительно объектно" - это значит что нельзя сложить 2 числа не создав класса. А "ИМХО", на сколько я знаю в мотивациях не нуждается...

Цитата

А я видел smile

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

Автор: WolfON 24.5.2007, 00:32
koreshX, абсолютно объектно-ориентированным языком можно назвать разве-что руби, да и то с натяжкой, по этому не надо гиперболизировать.
очевидно, что автор подразумевал разумное использование возможностей ооп, которыми наделен php

Автор: WIPS 4.6.2007, 00:35
На мой взгляд ООП более приемлем, чем ПОП хотябы потому, что окружающий мир состоит из объектов (экземплятов классов, если угодно), а не из функций (читай действий) и имеет след. преимущества:

 1. Повышается понимаемость кода. Возьмем, напр., ф-ю __стрелять(). Снайпер стреляет по мишени, бомж стреляет сигареты, девушка стреляет глазками. Используя ПОП необходимо либо передавать доп. параметр "кто_стреляет", либо использовать префиксное именование ф-ций, а отсюда вторая выгода:
 2. Отчасти решается проблема именования. 
 3. Пусть у девушки есть ещё методы кроме __стрелять(), напр. __могу_ли_охмурить(), __могу_ли_съесть_пирожное(), __надо_ли_худеть() и пр.. Все они зависят от огромного числа параметров (рост, вес, объем груди, талии и бедер, харизма, наличие косметики и т.п.). В ООП достаточно задать эти параметры единожды для объекта, а в ПОП вам каждый раз придется описывать девушку передавая кучу её параметров в каждую ф-ю пусть даже и массивом.
 4. Мы можем заставить всю нашу компанию (снайпер, бомж и девушка) стрелять по одной команде (__стрелять()), т.к. все они имеют таковой интерфейс. 
 5. Так же легче добавлять новых членов в нашу компанию (спина напр. тоже может __стрелять()).
 6. Наша компания может состоять и из нескольких девушек (объектов одного класса), кот. тоже можно заставить стрелять по одной команде. Все будут делать это примерно одинаково, но каждая немножко по своему в зависимости от параметров (см. п. 3).

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

Процедурный подход хорош для чисто вычислительных задач, т.к. так же далек от реальности как и "чисто вычислительные задачи".

Р.S. А понимать ООП проще все же вообще в отрыве от языка. Главное - понять концепцию. А ее реализация в каждом конкретном случае (читай - ЯП), это лишь вопрос синтаксиса и наличия/отсутсвия некоторых возможностей.

P.Р.S. Все вышесказанное - мое ИМХО.

Автор: Alan 4.6.2007, 16:58
Перехожу на ООП... постепенно. Преписывать старые проекты не буду. Но новые начну с ООП.

Автор: Sergey912 26.7.2007, 02:21
WIPS,
Он не изучен даже до конца, не то чтобы сделаны однозначные выводы и построена четкая модель smile Сходство, конечно больше, но все равно это сомнительный довод.

Цитата

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

Но никуда не денешься от реализации всех функций "стреляния" т.е. именно кода который за них отвечает и реализации огромного кол-ва классов. Но их избыточность это совсем не хорошо.

Автор: Diesel Draft 26.7.2007, 10:42
ООП может дать особое понимание программирование. Когда то программа представляла собой только линейную структуру. ООП даёт не просто красивый и читабельный код, а представление мира в его аналогах. Для некоторых людей это просто способ обеднать свои функции в отдельную библиотеку и оно отличается от ПОП только тем что можно впихнуть больше кода, но другие могут написать аналог предмета или живого существа и тогда складывается впечатление что ты работаешь з реальным предметом, а не з программным кодом. Когда ты это поймешь то мир программирования покажется другим. Думаю многие  согласятся.

Автор: Mal Hack 26.7.2007, 13:53
ООП ничего не может дать, это понимание программирования может дать возможность использовать "фишки" ООП, которые на больших проектах сильно улучшают структуриацию и модульную схему приложения.

Автор: Diesel Draft 26.7.2007, 17:26
Вот ты не понимаешь, ты не видел абстрактную сторону

Автор: WIPS 30.7.2007, 16:40
Цитата(Sergey912 @  26.7.2007,  01:21 Найти цитируемый пост)
Он не изучен даже до конца, не то чтобы сделаны однозначные выводы и построена четкая модель

Кто это "он"? Который не изучен до конца?

Цитата(Sergey912 @  26.7.2007,  01:21 Найти цитируемый пост)
Но никуда не денешься от реализации всех функций "стреляния" 

Естественно вся функциональность должна быть где-то реализована, будь то ОПП/ПОП или что-то еще. Код сам не напишется, это и ежу понятно.

Цитата(Sergey912 @  26.7.2007,  01:21 Найти цитируемый пост)
реализации огромного кол-ва классов. Но их избыточность это совсем не хорошо.

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

Цитата(Diesel Draft @  26.7.2007,  09:42 Найти цитируемый пост)
но другие могут написать аналог предмета или живого существа и тогда складывается впечатление что ты работаешь з реальным предметом, а не з программным кодом. Когда ты это поймешь то мир программирования покажется другим.

Полностью согласен. Это то, что я пытался сказать в своем посте.

Цитата(Mal Hack @  26.7.2007,  12:53 Найти цитируемый пост)
это понимание программирования

В чем же заключается это самое "понимание программирования"?

Автор: NNaarreekk 30.7.2007, 16:41
Насколько я знаю класы нужны только для того чтобы секономить время!

То есть можешь написать ту же програму без класов, но получится в 3 раза длинее и медленее!

Автор: Diesel Draft 30.7.2007, 17:03
Цитата(NNaarreekk @ 30.7.2007,  15:41)
Насколько я знаю класы нужны только для того чтобы секономить время!

То есть можешь написать ту же програму без класов, но получится в 3 раза длинее и медленее!

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

Автор: Mal Hack 30.7.2007, 18:27
Цитата(Diesel Draft @  30.7.2007,  17:03 Найти цитируемый пост)
Класс позволяет поделить программу на конкретные модули

Не говори глупостей, пожалуйста. Модули это модули. Классы это классы. Никакой связи между собой они не имеют...
На функциях теже самые модули так же совершенно спокойно делаются.

Автор: Diesel Draft 31.7.2007, 09:49
Разве? Кто еще со мной несогласен на счет модулей в форме классов?

Автор: Daevaorn 31.7.2007, 14:27
Цитата(Diesel Draft @  31.7.2007,  10:49 Найти цитируемый пост)
Разве? Кто еще со мной несогласен на счет модулей в форме классов? 

модули не обязательно классы и наоборот.

Автор: Diesel Draft 31.7.2007, 16:01
Daevaorn, а я не говорил что обязательно, и это все образно. Каждый понимает модуль по своему.

Автор: WIPS 1.8.2007, 09:40
Цитата(Diesel Draft @  30.7.2007,  16:03 Найти цитируемый пост)
Самый большой плюс сановит удобство

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

Цитата(Mal Hack @  30.7.2007,  17:27 Найти цитируемый пост)
Не говори глупостей, пожалуйста. Модули это модули. Классы это классы. 

Что в вашем понимании модуль?

Автор: Mal Hack 1.8.2007, 11:41
Diesel Draft, модуль это не образно....

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

Автор: Diesel Draft 1.8.2007, 11:51
Цитата(WIPS)

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

Да, правильно, как я мог забыть про интерфейсы, это вообще выручает не редко


Цитата(Mal Hack)

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

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

Автор: Mal Hack 1.8.2007, 11:57
Diesel Draft, и чего-же тут не точного???
Шаблон, это заготовка и к модулям отношения не имеет. Да, модули ты делаешь по смысловому шаблону, но это не то...

Учи матчасть !!!

Автор: Diesel Draft 1.8.2007, 12:07
Mal Hack, Ты вот влепил мне минус в репу, а вот за что? Цитирую "Прежде чем что-то делать, надо сначала хотя бы основные понятия понять....". Вот если ты не знаешь, то не путай других. Шаблон это заготовка, но не только дизайна. Это может быть и шаблон кода.
У тебя есть компьютерное образование, или ты учился как большая часть здесь на примерах? Просто то что ты говоришь доказывает что ты не ориентируешься в этом. Ты видишь только одну сторону монеты. Почитай этот раздел, тебе это говорю не только я.


П.С. И хватит мне портить репу, посте тебя меня народ за дилетанта какого принимает. Ты уже мне 3 минуса втиснул. 

Автор: Mal Hack 1.8.2007, 15:18
Diesel Draft, у меня как раз образование по специальности "программное обеспечение вычислительной техники и автоматизированных систем", поэтому, поверь, уж, понятия я - знаю.

Цитата(Diesel Draft @  1.8.2007,  12:07 Найти цитируемый пост)
 Шаблон это заготовка, но не только дизайна. Это может быть и шаблон кода.

Вот я не понимаю. Ты тупой или прикидываешься, прости конечно (и пусть мне модеры вешают кирпич, может хоть так, удасться достучаться до твоих, талантливых, стоящих мозгов, которые вместо того, чтобы учиться, пытаются учить других). Уже в который раз ты не хочешь понять тех вещей, которые тебе говорят люди, понимающие больше тебя. Не надо мне приписывать тех слов, которых я не говорил? Я говорил о дизайне? Хоть слово, хоть намек? Нет. Если ты не в состоянии осознать то, что понятие модуля и понятие шаблона не имеют ничего общего, а связь того, что модули, состоящие из классов или функций написаны по одним правилам, читаю для тебя специально, по шаблону, имеет лишь практический смысл реализации, а не теоретической основы, нечего тебе делать в программировании.

Цитата(Diesel Draft @  1.8.2007,  12:07 Найти цитируемый пост)
Просто то что ты говоришь доказывает что ты не ориентируешься в этом. Ты видишь только одну сторону монеты. Почитай этот раздел, тебе это говорю не только я.

МОжет быть ты просто не можешь понять того, что  я говорю, точнее подумать над этим? ;)
Я привожу факты, определения, от тебя я только слышу: "ты не прав" и т.п. Где обоснование?
Не надо думать слишком поверхностно..


Минусы в репу "ты мне я тебе" можешь лепить сколько влезет, мне на репу - плевать, она тут уже давно профессиональные навыки не отображает...

Автор: Diesel Draft 1.8.2007, 15:36
Хорошо, давай начнем с начала или этот разговор начинает переходить в тупой спор.

Цитата(Diesel Draft)

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

Я человеку хотел абстрактно объяснить что такое класс.


Давай так. З чем ты со мной не согласен? Скажи, а я постараюсь аргументировать свой ответ.


П.С. Я закончил "Компьютерная инженерия". Веб не учили. Но я з самого маслу сам занимался.



Автор: Mal Hack 1.8.2007, 15:39
В данной процитированной фразе не согласен с тем, что именно класс позволяет разделить программу на модули. На модули программу разделяет программист при проектировке, классы - вид реализации модулей.... Это лишь способ реализации модуля или его части.

Удобство это зависит от задачи.

Автор: Diesel Draft 1.8.2007, 15:46
Вот, мы уже сошлись во мнении.

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

Автор: Mal Hack 1.8.2007, 15:55
Цитата(Diesel Draft @  1.8.2007,  15:46 Найти цитируемый пост)
Вот, мы уже сошлись во мнении.

Если ты понял, наконец, что я тебе объяснял...


Цитата(Diesel Draft @  1.8.2007,  15:46 Найти цитируемый пост)
теперь смотри. Почему я сказал что позволяет поделить на модули? Потому что большая часть людей понимает модуль как отдельную часть, которую можно подключить, отключить и делать другую бесполезную роботу. Но это я сказал на таком простом уровне. Просто когда человеку скажешь термином он не поймет (нет хорошо сформулированного термина). 

И где в фразе слово класс??? Нету.. Термины объяснять надо...

Автор: Diesel Draft 1.8.2007, 15:59
Основа ООП  это объект  smile  и он есть главный. Тобто главное понимание вещи в объектном мире

Автор: sTa1kEr 1.8.2007, 22:37
Diesel Draft, извините, но я не совсем понимаю. Что вы пытаетесь доказать? По-моему уже из определения предельно ясно, что такое модуль. Модуль это составная часть общей системы, но весь смысл модуля заключается в легкой отделимости от общей системы и такого же простого присоединения без вреда для всей системы. И для программирования это не исключение, не важно на чем написан модуль и какие технологии при этом использованы, если это условие выполняется. За примерам далеко ходить не надо, те же расширения PHP могут быть собраны как модули, т.е. если есть файл - есть требуемая функциональность, и пусть он хоть на ассемблере написан.
Объекты не имеют *никакого* отношения с модулями. Я согласен с тем, что ООП имеет похожую модульную структуру, но при этом не стоит путать понятия ООП и модульная система.

Автор: Mal Hack 1.8.2007, 22:43
Diesel Draft, основы ооп, это принципы наследования, инкапсуляции и полиморфизма.. Объект - лишь способ реализации ;)

Автор: WIPS 1.8.2007, 23:38
Цитата(sTa1kEr @  1.8.2007,  21:37 Найти цитируемый пост)
Объекты не имеют *никакого* отношения с модулями. 

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

P.S. По моему, все говорят одно и тоже, но друг друга считают при этом неправыми =)

Автор: sTa1kEr 2.8.2007, 00:42
Цитата(WIPS @  1.8.2007,  23:38 Найти цитируемый пост)
Однако согласитесь, что модуль может быть реализован как объект. При этом будет отвечать всем выдвигаемым к модулю требованиям.

Я так и сказал -  объектная модель похожа на модульную. Но любые объекты тесно связаны с другими объектами - в этом и заключается смысл ООП.

Цитата(WIPS @  1.8.2007,  23:38 Найти цитируемый пост)
.S. По моему, все говорят одно и тоже, но друг друга считают при этом неправыми =)

А по моему, либо кто-то не понимает простого смысла слова *модуль*, либо просто боится показаться не компетентными в данной области.

Автор: WIPS 2.8.2007, 08:31
Цитата(sTa1kEr @  1.8.2007,  23:42 Найти цитируемый пост)
А по моему, либо кто-то не понимает простого смысла слова *модуль*


после этого тяжело не понять, что такое модуль:
Цитата(sTa1kEr @  1.8.2007,  21:37 Найти цитируемый пост)
Модуль это составная часть общей системы, но весь смысл модуля заключается в легкой отделимости от общей системы и такого же простого присоединения без вреда для всей системы.

Автор: Diesel Draft 2.8.2007, 10:33
А вам не кажется мы говорим о том самом но разными словами?

Цитата(Mal Hack)

Diesel Draft, основы ооп, это принципы наследования, инкапсуляции и полиморфизма.. Объект - лишь способ реализации ;) 

Наследование, инкапсуляция и полиморфизм это его свойства

Цитата

Объе́ктно-ориенти́рованное программи́рование — парадигма программирования, в которой предметная область представляется системой структур данных, каждая из которых представляет некий отдельный предмет (объект), относящийся к своему типу с его внутренними свойствами и действиями над ним.

Автор: Fally 2.8.2007, 11:21
Цитата(WIPS @  1.8.2007,  23:38 Найти цитируемый пост)
что модуль может быть реализован как объект.

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

Цитата

Но любые объекты тесно связаны с другими объектами - в этом и заключается смысл ООП.

Если одни объекты тесно связаны с другими, то это нарушает гибкость и расширяемость приложений, что противоречит принципу http://wiki.agiledev.ru/doku.php?id=ooad:dependency_injection . Тесно могут быть связаны обычные классы с реализациями абстрактных или реализациями интерфейсов.

Автор: Mal Hack 2.8.2007, 13:51
Цитата(Diesel Draft @  2.8.2007,  10:33 Найти цитируемый пост)
А вам не кажется мы говорим о том самом но разными словами?

Совершенно нет.

Цитата(Diesel Draft @  2.8.2007,  10:33 Найти цитируемый пост)
Наследование, инкапсуляция и полиморфизм это его свойства

Это - основа ООП, потому что и наследование и полиморфизм и инкапсуляция не характеризуют объект или класс, т.е. не являются его свойством (синим белым, тяжелым, мягким), они дают функциональность объекту, возможность наследовать свойства не одного класса и т.д.. Свойства бывают у объекта, это по сути его переменные.

Когда я писал своей предыдущий пост, я отвечал вот на это сообщение:
Цитата
Основа ООП  это объект  smile  и он есть главный. Тобто главное понимание вещи в объектном мире 


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

Автор: Fally 2.8.2007, 13:54
Цитата(Mal Hack @  2.8.2007,  13:51 Найти цитируемый пост)
Объект - лишь практическя реализация, которая использует все возможности парадигмы ООП !!!! 

+1

Автор: Diesel Draft 2.8.2007, 14:19
Что является основой ООП?

Автор: Mal Hack 2.8.2007, 14:58
Основа - концепция программирования, включающая в себя такие концепции, как полиморфизм, наследование и инкапсляция.

Автор: Diesel Draft 2.8.2007, 15:01
Основа это представление все в объектном виде. Поэтому и называется объектно ориентированное программирование

Автор: Mal Hack 2.8.2007, 15:05
Основа - это теория, а объект лишь ее практическая реализация.
ООП подразумевае под собой не только описание классов и создание объектов, но и подход к решению задачи, отличный от структурного программирования.

Автор: SamDark 2.8.2007, 15:08
Diesel Draft
Принципы.

Вообще модуль сам по себе не обязательно должен быть реализован на принципах ООП.

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

Автор: Diesel Draft 2.8.2007, 15:09
Mal Hack, тебе не кажется что мы будем спорить еще страниц 20? Думаю это бессмысленно, все ровно говорим то самое всегда

Автор: SamDark 2.8.2007, 15:11
Mal Hack
Вообще новичкам отлично объяснятся ООП на примере модулей. Только я предпочитаю открывать системный блок и показывать им железо(объекты классов), разъёмы(интерфейсы) и т.д.

Автор: Diesel Draft 2.8.2007, 15:16
SamDark, Вот хоть ты согласен со мной что мы говорим почти о том самом просто на разных языках?

Автор: Mal Hack 2.8.2007, 15:18
Модули это модули... Мне их объясняли на сях, структурных...
Дизель, ты не прав!!! (с) ЕБН

Автор: Diesel Draft 2.8.2007, 15:26
Mal Hack, Объекты это не модули!!! Но на Них можно построить!!!! И не только на них!!! 

Ты уже сам наченаеш изменять своим словам. И вовсе все что я скажу тебе не нравится!!!

Автор: Mal Hack 2.8.2007, 15:30
Цитата(Diesel Draft @  2.8.2007,  15:26 Найти цитируемый пост)
Mal Hack, Объекты это не модули!!!

Я тебе это и пытаюсь объяснитьб и доказаваю, что модули это модули и к ооп никакого отношения не имеют !!!

Автор: SamDark 2.8.2007, 15:33
Diesel Draft
Mal Hack
Давайте я срезюмирую?

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

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

Автор: Fally 2.8.2007, 15:38
Эмм.. конечно прошу прощения, что вмешиваюсь в столь ожесточённую дискуссию smile, но: 
Цитата(SamDark @  2.8.2007,  15:08 Найти цитируемый пост)
можно реализовать модули классами, можно объектами,

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

Автор: Diesel Draft 2.8.2007, 15:41
SamDark, +1



Mal Hack, ООП можно объяснить разными способами. Я пояснил на модулях, я не привязал. раньше я объяснял на яблоках, но тут долго писать, а мне на русском это сложно делать. А то что ты вцепился в это это уже твоя проблема

Автор: SamDark 2.8.2007, 15:48
Fally
Конечно чувствую. Не зря же написал.

Реализация объектами подразумевает описание модулей одноимёнными классами следуя некоторым правилам (такое практиковалось на PHP4) и инстанциирование только одного из них.

Diesel Draft
Mal Hack
Не ругайтесь. Всё хорошо  smile 

Автор: Diesel Draft 2.8.2007, 15:51
Mal Hack, У меня ощущение что в реальной жизни я тебе сделал что то плохого, но ни разу тебе не видел

Автор: Mal Hack 2.8.2007, 16:08
Diesel Draft, да нельзая объяснить ООП разными способами. НЕЛЬЗЯ...
То, как ты определял через модули - неверно, потому модуль это - объективное понятие, ооп - субъективное...

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

Ну вот честно, я не понимаю, что тут сложного для понимая.

Автор: Diesel Draft 2.8.2007, 16:17
Mal Hack, та вот не понимаешь что это пример. Тебе что никогда ничего не объясняли на других предметах. Это не означает что это оно, просто отдалено похожие. Почему ты вцепился в точность, и отбрасывает остальное

Автор: Mal Hack 2.8.2007, 16:28
Потому, что точности в твоем определении нет... Абстрагироваться-то можно, но у тебя это НЕ ПОЛУЧИЛОСЬ !!!

Автор: Diesel Draft 2.8.2007, 16:43
Mal Hack, Может только ты этого не понял  smile 

Автор: Mal Hack 2.8.2007, 16:50
Исходя из того, что я привел все 4 определения, и не услышал на них ничего против, то судя по всему я прекрасно все понимаю ;)

Автор: Diesel Draft 2.8.2007, 16:52
на мои кроме тебя тоже никто вроде не жаловался

Автор: Oflashp 2.8.2007, 22:13
Осилил 3 странице, если уже кто-то это написал, прошу прощения за повтор:
При ПОП программировании на PHP:
1)Имеется библиотека с функциями, которая подружается допустим index.php.
PHP откладывает функции и параметры в память и ждёт их вызова.
2)Таже самая библиотека, использует какие-то переменные, если обьявлены до функции они становятся доступными без обьявления в теле кода или конструкцией global
3)Если включен перехват переменных из запроса, они становятся глобальными для кода. И если вначале вы определили, что login="Вася", то можно переопределить запросом ...?login="Alex". Это я так к примеру. Для более понятного вот код:
Код

<?
function login()
{
 global $login;
 if($login == "")
 {
  $login="Вася";
 }
}
?>

4)Попробуйте в стандартном коде обьяснить, что вот эта переменная относится сюда, эта сюда...Заипетесь
При ООП:
1)Пока не вызовите класс, откладываться в памяти ничего не будет
2)Да хоть десять, пока в класс не пропишите, ему будет побоку
3)Читай 2.
4)Решение усложнения структуры класса решает и этот вопрос.

Это так на пальцах.
Если у вас приложение простое - а под простым приложением понимается не количество кода в строках(комментарии тоже бывают как целый FAQ), а:
1)У вас нет библиотек не написанных вами или библиотек динамических которые подружаются в зависимости от ситуации.
2)Количество библиотек не более 10
3)Количество переменных глобальных не большое
4)Если есть шаблоны, то вкладки и выкладки шаблонов при результате не превышает трех уровней
Используйте смело ПОП. Он там не нужен.
Для остального юзайте классы.
PS: Рекомендую использовать классы так же для построенние модельных и пост-модульных систем. Другим программистам будет проще писать дополнения.

Автор: WIPS 2.8.2007, 23:52
Цитата(Mal Hack @  2.8.2007,  15:08 Найти цитируемый пост)
ООП - теория, концепция создания ПО с использованием таких понятий как класс и объект, где последние два - лишь способ реализации концепции, пускай и другого пока не придумали.

Как это не придумали? А JavaScript? A Ada95+?

Цитата(Mal Hack @  2.8.2007,  15:08 Найти цитируемый пост)
Объект все равно производная класса

Не всегда. Понятие "класс" для ООП в принципе не является обязательным.

Автор: Daevaorn 3.8.2007, 00:42
Цитата(WIPS @  3.8.2007,  00:52 Найти цитируемый пост)

Цитата(Mal Hack @  2.8.2007,  15:08 Найти цитируемый пост)
Объект все равно производная класса

Не всегда. Понятие "класс" для ООП в принципе не является обязательным.

угу. а в некоторых ОО языках класс сам является объектом.

Автор: WIPS 3.8.2007, 01:34
Цитата(Daevaorn @  2.8.2007,  23:42 Найти цитируемый пост)
угу. а в некоторых ОО языках класс сам является объектом. 

 smile 

Автор: Daevaorn 3.8.2007, 02:10
Цитата(WIPS @ 3.8.2007,  02:34)
Цитата(Daevaorn @  2.8.2007,  23:42 Найти цитируемый пост)
угу. а в некоторых ОО языках класс сам является объектом. 

 smile

python например с потрясающим рефлекшином. благодаря тому, что все классы сами объекты, к атрибутам которых можно получить доступ и всячески менять.
в php увы пока такого нет

Автор: Fally 3.8.2007, 10:54
Цитата(WIPS @  2.8.2007,  23:52 Найти цитируемый пост)
Как это не придумали? А JavaScript? A Ada95+?

Это - Я-З-Ы-К-И П-Р-О-Г-Р-А-М-М-И-Р-О-В-А-Н-И-Я. Но никак не концепции программирования.
Цитата(Daevaorn @  3.8.2007,  00:42 Найти цитируемый пост)
а в некоторых ОО языках класс сам является объектом. 

Что за бред? Названия и определения терминов ООП учите. Вот специально для Вас (и не только):
1) Под классом подразумевается некая сущность, которая задает некоторое общее поведение для объектов. /http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%81_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29/
2) Под объектом подразумевается некоторая сущность, обладающая состоянием и поведением. Как правило при рассмотрении объектов выделяется, что объект принадлежат одному или нескольким классам, которые в свою очередь определяют поведение объекта. /http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29/

З.Ы. Механизм отражений (reflection) в РНР есть тоже.

Автор: SamDark 3.8.2007, 11:29
WIPSFally
В JavaScript нет ОО в привычном понимании. т.е. классов и объектов. Там совершенно другой принцип, основаный на прототипах. Вот там как раз с натяжкой можно сказать, что "класс сам является объектом", хотя сравнивать прототипное программирование с классическим ОО, а тем более приводить к нему, как многие делают, некорректно.

Автор: Mal Hack 3.8.2007, 11:43
Oflashp, мы тут с позиции теории разговариваем, а вы нам снова про практику..

Цитата(WIPS @  2.8.2007,  23:52 Найти цитируемый пост)
Не всегда. Понятие "класс" для ООП в принципе не является обязательным.

Бред. Яйца без курицы не бывает. Объект нельзя создать без его определения. Другое дело, когда система в программе заранее создает объект по своим прототипам.

Автор: Daevaorn 3.8.2007, 11:52
Цитата(Fally @  3.8.2007,  11:54 Найти цитируемый пост)
Что за бред? Названия и определения терминов ООП учите. Вот специально для Вас (и не только):

А Вам бы я посоветовал не писать о том о чем не знаете. А то в лужу сели.
Цитата(Fally @  3.8.2007,  11:54 Найти цитируемый пост)
1) Под классом подразумевается некая сущность, которая задает некоторое общее поведение для объектов. /Википедия
2) Под объектом подразумевается некоторая сущность, обладающая состоянием и поведением. Как правило при рассмотрении объектов выделяется, что объект принадлежат одному или нескольким классам, которые в свою очередь определяют поведение объекта. /Википедия/

Всё это справедливо для классов в языке python. О чем я и написал выше. Умейте слушать.
Цитата(Fally @  3.8.2007,  11:54 Найти цитируемый пост)
З.Ы. Механизм отражений (reflection) в РНР есть тоже.

Да, но не настолько гибкийи функциональный. На что я тоже уже посетовал. Если бы токой появился в php жить стало бы веселения. И в частности ORM было бы делать проще.

Автор: Oflashp 3.8.2007, 12:27
Цитата(Mal Hack @ 3.8.2007,  11:43)
Oflashp, мы тут с позиции теории разговариваем, а вы нам снова про практику..

Цитата(WIPS @  2.8.2007,  23:52 Найти цитируемый пост)
Не всегда. Понятие "класс" для ООП в принципе не является обязательным.

Бред. Яйца без курицы не бывает. Объект нельзя создать без его определения. Другое дело, когда система в программе заранее создает объект по своим прототипам.

Я же написал, что я прочитал первые 3-4 страницы топика, больше не выдержил.
Да и у меня сложен так ум, что проще понять примерами, чем теорией.
А вообще сложно назвать ваше обсуждение теорией. Уже обсуждение в стиле:
"Начали про то, как установить унитаз, заканчиваете о том, как сделать ремонт во всём туалете." 
P.S: Ничего личного.
P.S2: Остаюсь скромным наблюдателем
smile 

Автор: Mal Hack 3.8.2007, 12:52
Цитата(Oflashp @  3.8.2007,  12:27 Найти цитируемый пост)
Да и у меня сложен так ум, что проще понять примерами, чем теорией.

Я точно также, но есть некоторые теоретические аспекты, которые надо понять, как теорию..


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

Автор: Daevaorn 3.8.2007, 13:02
Цитата(Mal Hack @  3.8.2007,  13:52 Найти цитируемый пост)
В догонку. Не знаю как и что в Питоне реализовано, но надо отдавать себе отчет, что сегодня, фактически используются 2 модели ООП.

ну я бы не стал так разделять. В конце концов, что мешает мне реализовать событийную ситему в php. Ничего. Поэтому это  не модели, а лишь способ применения. И зависит от решаемой задачи.

Автор: Mal Hack 3.8.2007, 13:08
Да, разделение - условное. Нов от в PHP вы не можете использовать событийность, связанную с графисечким интерфейсом - раз. Два, любоую событийность, как взаимодействие между объектами, вы должны, в случае PHP, полностью отпрограммировать сами, а в том, первом случае, о чем я писал выше, механизм событий, реализовывается через системное API.

Автор: SamDark 3.8.2007, 13:17
Mal Hack
Можем мы использовать событийность, связанную с графическим интерфейсом. AJAX нам на что?
Если не хочется программировать событийную модель самостоятельно - можно всегда использовать фреймворк... благо они есть.

Автор: Daevaorn 3.8.2007, 13:18
Допустим событийная система реализована в биндингах GUI библиотек для в php, в частности в PHP-GTK. А именно системное API конечно есть, но не так уж и частно встречается, сразу на ум приходит Delphi. Так что я не совем соглашусь, что имеено это делит ООП на модели.

Автор: Oflashp 3.8.2007, 13:31
Цитата(SamDark @ 3.8.2007,  13:17)
Mal Hack
Можем мы использовать событийность, связанную с графическим интерфейсом. AJAX нам на что?
Если не хочется программировать событийную модель самостоятельно - можно всегда использовать фреймворк... благо они есть.

AJAX - JavaScript, который мы моем лишь связать с PHP. Точнее PHP использует не своё средство представления событийности

Автор: vasac 3.8.2007, 14:04
Присоединюсь к чату smile
Цитата

В JavaScript нет ОО в привычном понимании. т.е. классов и объектов.

В JavaScript есть ОО. Если под привычным пониманием понимается "классориентированная версия ООП, к которой привыкло большинство", то, да, такого нет.
Но объектно-ориентированное программирование, это программирование с ориентированием на объекты smile. На объекты и их взаимодействие. А классы тут не причем.

Цитата

python например с потрясающим рефлекшином. благодаря тому, что все классы сами объекты, к атрибутам которых можно получить доступ и всячески менять.
в php увы пока такого нет

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

Автор: Mal Hack 3.8.2007, 15:08
Цитата(SamDark @  3.8.2007,  13:17 Найти цитируемый пост)
Можем мы использовать событийность, связанную с графическим интерфейсом. AJAX нам на что?

Событийность имеется ввиду во время работы скрипта, а тот же Ajax просто вызывает скрипт PHP по какому-то действию, а вот внутри PHP событийности нет.

Цитата(Daevaorn @  3.8.2007,  13:18 Найти цитируемый пост)
Допустим событийная система реализована в биндингах GUI библиотек для в php, в частности в PHP-GTK. А именно системное API конечно есть, но не так уж и частно встречается, сразу на ум приходит Delphi. Так что я не совем соглашусь, что имеено это делит ООП на модели. 

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

Цитата(vasac @  3.8.2007,  14:04 Найти цитируемый пост)
На объекты и их взаимодействие. А классы тут не причем.

Без класса нет объекта!!!
JS либо должна в себе содержать внутри определения классов, либо она просто дает синтаксис, близкий к ООП...

Автор: vasac 3.8.2007, 15:12
Цитата

Без класса нет объекта!!!
JS либо должна в себе содержать внутри определения классов, либо она просто дает синтаксис, близкий к ООП... 

А вот и есть smile
Синтаксис она как раз дает далекий от "классического" ООП. Но в том чтобы следовать принципам ООП это ей не мешает.

Автор: WIPS 4.8.2007, 01:14
Цитата(Fally @  3.8.2007,  09:54 Найти цитируемый пост)
Это - Я-З-Ы-К-И П-Р-О-Г-Р-А-М-М-И-Р-О-В-А-Н-И-Я. Но никак не концепции программирования.

JavaScript я привел как пример концепции прототипного наследования, к тому же в этой концепции нет классов.
Ada95 - пример реализации концепции статической типизации (по умолчанию запрещено наследование).

Цитата(Fally @  3.8.2007,  09:54 Найти цитируемый пост)
2) Под объектом подразумевается некоторая сущность, обладающая состоянием и поведением. Как правило при рассмотрении объектов выделяется, что объект принадлежат одному или нескольким классам, которые в свою очередь определяют поведение объекта. /Википедия/

Потрудитесь почитать собственную ссылку 10 строками ниже и увидите: "...объекты являются экземплярами некоторого заранее описанного класса (однако например в таком языке как JavaScript понятие класс не используется вовсе)..."

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

Цитата(SamDark @  3.8.2007,  10:29 Найти цитируемый пост)
WIPS, Fally, 
В JavaScript нет ОО в привычном понимании. т.е. классов и объектов. Там совершенно другой принцип, основаный на прототипах. Вот там как раз с натяжкой можно сказать, что "класс сам является объектом", хотя сравнивать прототипное программирование с классическим ОО, а тем более приводить к нему, как многие делают, некорректно.

Во-первых, не надо приписывать мне слова "класс сам является объектом". Я такого не говорил и пока даже не видел (хотя не скрою, мне эта тема показалась интересной).
Во-вторых, я прекрасно осведомлен о тех принципах на которых базируется объектная модель в JavaScript (JS).
В-третьих, никто здесь не говорил, что надо приводить прототипную модель наследования к классической (как я понимаю вы имеете в виду сиобразную).
Вобщем, внимательнее читаем посты и не выдумываем того, чего нет.

Цитата(Mal Hack @  3.8.2007,  10:43 Найти цитируемый пост)
Цитата(WIPS @  2.8.2007,  23:52 Найти цитируемый пост)
Не всегда. Понятие "класс" для ООП в принципе не является обязательным.

Бред. Яйца без курицы не бывает. Объект нельзя создать без его определения. Другое дело, когда система в программе заранее создает объект по своим прототипам. 

Пожалуйста, не давите меня такими сильными аргументами как "бред" и "яйца без курицы не бывает". В JS объект может определяться во время создания. Причем его как вы выражаетесь "опеределение" может изменяться по ходу выполнения программы. Где здесь бред? Где "система в программе заранее создает объект по своим прототипам"? Давайте не будем опускать довольно мощный язык (и представляемую им концепцию) до уровна onclick="" и getElementById, только потому, что в основном он исп-ся в браузерах.

Цитата(Mal Hack @  3.8.2007,  11:52 Найти цитируемый пост)
Событийность имеется ввиду во время работы скрипта, а тот же Ajax просто вызывает скрипт PHP по какому-то действию, а вот внутри PHP событийности нет.

Событийность таки есть, взять хотя бы сокеты, можно их слушать, можно реагировать на изменение их состояния. 

Цитата(Mal Hack @  3.8.2007,  14:08 Найти цитируемый пост)
Без класса нет объекта!!!
JS либо должна в себе содержать внутри определения классов, либо она просто дает синтаксис, близкий к ООП... 

ООП - это три принципа (наслед-е, инкапсуляция, полиморфизм), надеюсь с этим никто спорить не станет. Все эти 3 принципа реализованы в JS, есть и объекты, но при этом нет классов. Что вы имеете в виду под словами "должна в себе содержать внутри определения классов"? Нет в JS классов ни внутри, ни снаружи, и не нужны они там. Либо у нас с вами разные определения слова "класс"...

Автор: Mal Hack 4.8.2007, 13:32
Цитата(WIPS @  4.8.2007,  01:14 Найти цитируемый пост)
Пожалуйста, не давите меня такими сильными аргументами как "бред" и "яйца без курицы не бывает". В JS объект может определяться во время создания. Причем его как вы выражаетесь "опеределение" может изменяться по ходу выполнения программы. Где здесь бред? Где "система в программе заранее создает объект по своим прототипам"? Давайте не будем опускать довольно мощный язык (и представляемую им концепцию) до уровна onclick="" и getElementById, только потому, что в основном он исп-ся в браузерах.

Определение этого класса, так или иначе, должно быть, оно зашито в движок JS.
В противном случае это структура с синтаксисом объектного доступа + изменяемость.

Цитата(WIPS @  4.8.2007,  01:14 Найти цитируемый пост)
Событийность таки есть, взять хотя бы сокеты, можно их слушать, можно реагировать на изменение их состояния. 

Эта событийность реализуется ручками, от и до...

Цитата(WIPS @  4.8.2007,  01:14 Найти цитируемый пост)
ООП - это три принципа (наслед-е, инкапсуляция, полиморфизм), надеюсь с этим никто спорить не станет. 

Я уже писал выше... Удосужтесь еще раз почитать... С точки зрения практической реализации ООП вы правы, но по большому счету - нет.

Цитата(WIPS @  4.8.2007,  01:14 Найти цитируемый пост)
Что вы имеете в виду под словами "должна в себе содержать внутри определения классов"?

Если вы работали в Делфи, то я имею ввиду TObject, определенный в самом языке, а не тот, который определяете вы.

Автор: Daevaorn 4.8.2007, 13:38
Цитата(Mal Hack @  4.8.2007,  14:32 Найти цитируемый пост)

Эта событийность реализуется ручками, от и до...

Приведи пример, где не ручками.

Автор: vasac 4.8.2007, 14:30
Все-таки, чисто имхо, в ОО-программировании важно взаимодействие объектов, а не их родословная. Объекты взаимодейтвуют друг с другом через представляемый интерфейс. А откуда взялся этот интерфейс, от статической иерархии классов или от цепочки прототипов, тому кто его использует должно быть безразлично. Поэтому, опять таки имхо, понятие "объект", важнее, понятия "класс".

"Класс", это наследие жесткой типизации, что есть ограничение компилирующих языков (хотя многие скажут, что это благо, а не ограничение). В C++ нужна эта иерархия, чтобы на этапе компиляции преобразовать вызовы функций в переходы на нужный участок памяти. А в PHP уже и не нужно, там наследование классов, просто позволяет более легко строить эти классы. А если нужно вызвать какой-то метод объекта, то важно только само наличие этого метода у объекта, а не принадлежность его какому-то классу.

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

Класс определяет набор однотипных объектов. Однако, уже в PHP это не совсем так. Т.к. как там в начала цепочки поиска ставится сам объект. С учетом того, что в него можно добавлять свойства, а так же устроить перехват несуществующих методов, то все становится не так четко. Объект, в который добавлены новые свойства, уже не совсем объект того класса, от которого наследован, он не до конца подобен другим объектам того же класса.

А в прототипном наследовании нет цепочки классов, там цепочка объектов. Главное отличие - это не абстрактные структуры, а именно объекты с которыми можно работать, как обычно. И в движок не зашито никаких определений классов, там есть предопределенные объекты для конкретных типов, которые можно спокойно изменять.

Преимущества такого подхода (во всяком случае для области применения подобных языков, это преимущества):

- Можно создавать набор похожих, но несколько различных по поведению объектов, не создавая при этом громоздкую иерархию классов и не таская её вместе с программой (очень важно для JS)
- Можно динамически изменять (дополнять) поведение объектов определенного "типа" путем изменения прототипа (для JS с обилием предопределенных объектов и различными реализациями в браузерах, очень полезно)
- Можно динамически изменять иерархию наследования (конкретно в JS нельзя)
- Утиная типизация значительно повышает гибкость. Это не совсем к прототипам, но тоже то, чего нет в "классическом" ООП.

Т.о. "классы", отнюдь не такая необходимая вещь.

Автор: Mal Hack 4.8.2007, 14:56
Цитата(Daevaorn @  4.8.2007,  13:38 Найти цитируемый пост)
Приведи пример, где не ручками. 

В PHP такого нет.
В Делфи, к примеру при нажатии на кнопку ты описываешь процедуру, но вот за механизм вызова этой процедуры отвечает система.


Автор: Daevaorn 4.8.2007, 15:01
Цитата(Mal Hack @  4.8.2007,  15:56 Найти цитируемый пост)
но вот за механизм вызова этой процедуры отвечает система.

а система это что? Библиотека VCL, которая тоже написана ручками, которая обработчик нажатия на кнопку и запускает. Другое дело что на самом низком уровне можно забиндить методы на события Windows, но напряму к интерфейсу это не относится. Так что пример половинчатый.

Автор: WIPS 5.8.2007, 12:09
Цитата(Mal Hack @  4.8.2007,  12:32 Найти цитируемый пост)
Определение этого класса, так или иначе, должно быть, оно зашито в движок JS.

Это аксиома? Почему вы так твердо убеждены, что без классов не может быть объектов? С тем, что написал vasac, http://forum.vingrad.ru/index.php?showtopic=131045&view=findpost&p=1216654 вы тоже не согласны?

Цитата(Mal Hack @  4.8.2007,  12:32 Найти цитируемый пост)
Эта событийность реализуется ручками, от и до...

Если бы эта событийность реализовывалась библиотекой от MS это бы считалось для вас "настоящей" событийностью?

Цитата(Mal Hack @  4.8.2007,  12:32 Найти цитируемый пост)
Если вы работали в Делфи, то я имею ввиду TObject, определенный в самом языке, а не тот, который определяете вы.

Если рассматривать класс чисто как тип данных, то можно сказать, что они есть в JS (это будут классы "number", "string", "boolean", "object", "function", "undefined"). Но следуя этой логике можно сказать, что классы есть в любом языке, в котором хотя бы различаються типы данных число и строка.

Цитата(Mal Hack @  4.8.2007,  12:32 Найти цитируемый пост)
Цитата(WIPS @  4.8.2007,  01:14 Найти цитируемый пост)
ООП - это три принципа (наслед-е, инкапсуляция, полиморфизм), надеюсь с этим никто спорить не станет. 

Я уже писал выше... Удосужтесь еще раз почитать... С точки зрения практической реализации ООП вы правы, но по большому счету - нет.


Пожалуйста в след. раз дайте ссылку на то, что я дожен почитать (перечитывать все страницы в поисках одного поста довольно утомительно), но тем не менее я почитал еще раз и вот что нашел:
Цитата(Mal Hack @  1.8.2007,  21:43 Найти цитируемый пост)
Diesel Draft, основы ооп, это принципы наследования, инкапсуляции и полиморфизма.. Объект - лишь способ реализации ;) 

Цитата(Mal Hack @  2.8.2007,  13:58 Найти цитируемый пост)
Основа - концепция программирования, включающая в себя такие концепции, как полиморфизм, наследование и инкапсляция. 


Вы говорите тоже, что и я... Почему я не прав по "большому счету"? Серьезно, без обид, объясните в чем моя ошибка.

А если вы имели в виду это:
Цитата(Mal Hack @  2.8.2007,  15:08 Найти цитируемый пост)
ООП - теория, концепция создания ПО с использованием таких понятий как класс и объект, где последние два - лишь способ реализации концепции, пускай и другого пока не придумали.
Модуль - программная единица, файл или группа файлов, объединяющий программный код по функциональному и смысловому назначению.
Класс - описание объекта.
Объект - некая программная единица, работа с которой ведется исходя из практический части теории ООП, а точнее, которая имеет такие свойства, как наследование, инкапсуляция и полиморфизм. В данном случае не надо придираться к словам, что наследование относится к классам.. Объект все равно производная класса, так что я говорил о следствии...

Ну вот честно, я не понимаю, что тут сложного для понимая. 

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

Автор: WolfON 5.8.2007, 13:14
имхо, ооп - система описания взаимодействия объектов на основе их реальных сущностей.
а классы, инкапсуляция и все остальное - это средства для их описания.


WIPS, +1

Автор: Zeroglif 5.8.2007, 13:47
OOP - общая парадигма, под крышей которой должны сосуществовать разные языки. Приверженцы CBLs (class-based languages) обожают обвешивать общую парадигму своими собственными фишками (только классы, без классов нет ООП вообще и т.п.), что автоматически отрицает существование других объектно-ориентированных языков, в которых просто нет классов, как таковых, тех же PBL (prototype-based languages). Это несеръёзно. PBLs, замечательным представителем которых является тот же javascript или SELF, строят свою концепцию именно на отстутствии какого-либо разграничения "класс-экземпляр", старательно выравнивая объекты.
Цитата

The most important idea of the prototype-based is that concrete objects are only mean to model applications. Prototypes are not meant to be abstractions like classes and are not linked in any other way to other objects that would describe them as in the class-based approach. SELF cannot distinguish those objects playing the role of classes from those playing the role of instances...


Автор: Mal Hack 5.8.2007, 14:21
Цитата(WIPS @  5.8.2007,  12:09 Найти цитируемый пост)
Почему вы так твердо убеждены, что без классов не может быть объектов?

Потому что ни одна переменная не может существовать без своего описания, быть не типизированной. 

Цитата(WIPS @  5.8.2007,  12:09 Найти цитируемый пост)
Если бы эта событийность реализовывалась библиотекой от MS это бы считалось для вас "настоящей" событийностью?

Дело не в MS. Я имею ввиду то, что механизм возникновения событий и передача управления обработчкику Вами как программистом уже не программируется, и что этот механизм уже отпрограммирован и находится в системе.

Цитата(WIPS @  5.8.2007,  12:09 Найти цитируемый пост)
Вы говорите тоже, что и я... Почему я не прав по "большому счету"? Серьезно, без обид, объясните в чем моя ошибка.

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

Цитата(WIPS @  5.8.2007,  12:09 Найти цитируемый пост)
Если рассматривать класс чисто как тип данных, то можно сказать, что они есть в JS (это будут классы "number", "string", "boolean", "object", "function", "undefined"). Но следуя этой логике можно сказать, что классы есть в любом языке, в котором хотя бы различаються типы данных число и строка.

А разве класс не тип данных? Да, и в Паскале и в Бэйсике, наверное, есть классы, и в ПХП. Но, позволяются ли классы в паскале, как и в ПХП, полностью использовать мощь ООП? Отюсда и то, небольшое разделение о котором я говорил. Делфи и Паскаль, к примеру. Классы есть и там и там, а вот в каком из них реализуется ООП концепия - как раз тот самый вопрос. ПыСы, мог перепутать наличие классов в Паскале с Сями(С++) в консоли... Очень давно с класическим паскалем не работал.

Цитата(WIPS @  5.8.2007,  12:09 Найти цитируемый пост)
то это ваше личное определение ОПП, которое вы почемуто считаете за аксиому.

Не то, чтобы за аксиому, просто на сегодняшний денья не вижу таких моментов, которые "убивали" бы какие-то мои высказывания.
Так уж получилось, что я расматриваю программирование не только с позиции практики, но и с позиции теории, проектирования, построения моделей, а посему, считаю не правильным отделение теоретических, пусть и небольших, основ от практического применения. Хоть программирование и сугубо практическая вещь, но малая доля теории все же есть. По крайней мере, я хорошо помню, как для меня отличался процесс проектирования программы в консоли (структурне программирование) от визуального (можно сказать объектного)..
Цитата(WIPS @  5.8.2007,  12:09 Найти цитируемый пост)
А о надобности классов в концепции ООП я с вами согласиться не могу, т.к. пока не увидел доказательтсва этого.


Цитата(WIPS @  5.8.2007,  12:09 Найти цитируемый пост)
А о надобности классов в концепции ООП я с вами согласиться не могу, т.к. пока не увидел доказательтсва этого.

В концепции ООП классы и не присутствуют. Классы, как я уже говорил выше - это описание системы, если хотите, объекта, уже в практической части, которые позволяют реализовать эту концепцию.

Автор: sTa1kEr 5.8.2007, 16:08
Цитата(Mal Hack @  5.8.2007,  14:21 Найти цитируемый пост)
Дело не в MS. Я имею ввиду то, что механизм возникновения событий и передача управления обработчкику Вами как программистом уже не программируется, и что этот механизм уже отпрограммирован и находится в системе.

События - это, по сути, всего-лишь коллекция делегатов, вызываемых поочередно. По этому это совершенно не принципиально.
Код

class someClass
{
   public $helloEvent = array();

   public function __construct()
   {
      $this->helloEvent[] = array($this, "someHandler");
   }

   public function hello()
   {
      echo "Hello!\n";
      foreach ($this->helloEvent as $func) call_user_func_array($func, array($this, array("test")));
   }

   public function someHandler($sender, array $args)
   {
      echo "Called someHandler of ".get_class($sender)." with parameters ".var_export($args, true)."\n";
   }
}

function anotherHandler($sender, array $args)
{
   echo "Called anotherHandler of ".get_class($sender)." with parameters ".var_export($args, true)."\n";
}

$a = new someClass();
$a->helloEvent[] = "anotherHandler";
$a->hello();

Автор: Mal Hack 5.8.2007, 18:01
Цитата(sTa1kEr @  5.8.2007,  16:08 Найти цитируемый пост)
События - это, по сути, всего-лишь коллекция делегатов, вызываемых поочередно. По этому это совершенно не принципиально.

Не согласен. События - вид взаимодействия объектов друг с другом или реакции на какие-то внешние воздействия, механизм которых не реализуется самим программистом.
Ты же просто вызвал метод и все.

Автор: sTa1kEr 5.8.2007, 19:12
Цитата(Mal Hack @  5.8.2007,  18:01 Найти цитируемый пост)
События - вид взаимодействия объектов друг с другом или реакции на какие-то внешние воздействия, механизм которых не реализуется самим программистом.

Подписка/отписка на событие заключается в добавлении/удалении делегата в/из коллекцию. Вызов события, соответственно, инициализирует вызов всех подписанных событий. Это и есть механизм событий. И не важно реакция это на внешнее воздействие или часть внутренней логики. Иначе хотелось бы услышать аргументированный ответ.

Цитата(Mal Hack @  5.8.2007,  18:01 Найти цитируемый пост)
Ты же просто вызвал метод и все. 

Код

foreach ($this->helloEvent as $func) call_user_func_array($func, array($this, array("test")));

Код

this.helloEvent(this, new EventArgs());

Это все отличие на примере C#. Да, в PHP это делается явно, а в C# об этом заботится компилятор, но суть от этого не меняется.

Автор: Mal Hack 5.8.2007, 19:28
Цитата(sTa1kEr @  5.8.2007,  19:12 Найти цитируемый пост)
 Да, в PHP это делается явно, а в C# об этом заботится компилятор

Вот я про это и говорю !!!
Событийность и там событийность, но в 

Автор: WIPS 5.8.2007, 23:25
Цитата(Mal Hack @  5.8.2007,  13:21 Найти цитируемый пост)
Потому что ни одна переменная не может существовать без своего описания, быть не типизированной.

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

Цитата(Mal Hack @  5.8.2007,  13:21 Найти цитируемый пост)
Потому, что вы видете сразу к практике, забывая о теоретичекой сущности самого ОО подхода. Эти три принципа - те вещи, которые делают ООП именно ООП, но с практической точки зрения. Но они являются лишь следствие объектно-ориентированной концепции, подхода, которая подразумевает под собой определенный вид взаимодействия объектов, определенные этапы разработки и их стадии. И эти три принципа позволяют эту теорию осуществить на практике.

То, что вы называете ООП подходом в проектировании, все таки отличается от ООП подхода в чисто программировании (читай кодинге, или то что вы называте "чисто практической точкой зрения"). Да, при проектировании приложения выделяются сущности (насколько я понял, именно их вы называете классами в этом случае), способы, варианты их взаимодействия и пр.. На основе их в коде появляются классы (если это CBL) или сразу объекты (если это PBL). От бизнес логики приложения никуда не деться, такие "классы" будут в любом приложении.

Цитата(Mal Hack @  5.8.2007,  13:21 Найти цитируемый пост)
ПыСы, мог перепутать наличие классов в Паскале с Сями(С++) в консоли... Очень давно с класическим паскалем не работал.

В паскале есть классы. Только по иронии судьбы для их описания используется ключевое слово "оbject" =)

Цитата(Mal Hack @  5.8.2007,  13:21 Найти цитируемый пост)
По крайней мере, я хорошо помню, как для меня отличался процесс проектирования программы в консоли (структурне программирование) от визуального (можно сказать объектного)..

Не вижу приципиальных отличий в проектировании визуального и консольного приложения... Взять, например виндовый notepad и тот-же vim, логика приложений в принципе одинаковая, в чем разница при проектировании? 

Цитата(Mal Hack @  5.8.2007,  13:21 Найти цитируемый пост)
В концепции ООП классы и не присутствуют. Классы, как я уже говорил выше - это описание системы, если хотите, объекта, уже в практической части, которые позволяют реализовать эту концепцию. 

В таком понимании класс больше походит на интерфейс, т.е. описания возможностей объекта и способов взаим-я с ним.

Цитата(sTa1kEr @  5.8.2007,  18:12 Найти цитируемый пост)
Это все отличие на примере C#. Да, в PHP это делается явно, а в C# об этом заботится компилятор, но суть от этого не меняется. 

sTa1kEr, +1.

Автор: SamDark 6.8.2007, 12:01
Mal Hack
Кстати, в PHP5 есть уже реализованная событийная модель:
http://www.php.net/~helly/php/ext/spl/interfaceSplObserver.html
http://www.php.net/~helly/php/ext/spl/interfaceSplSubject.html

Код

<?php
class MySubject implements SplSubject {
    private $elements;
    
    public function __construct() {
        $this->elements = array();
    }
    
    public function attach( SplObserver $observer ) {
        $this->elements[] = $observer;
    }
    
    public function detach( SplObserver $observer ) {
        // Not implemented here
    }
    
    public function notify() {
        foreach( $this->elements as $obj ) {
            $obj->update( $this );
        }
    }
}

class MyObserver implements SplObserver {
    public function update( SplSubject $subject ) {
        echo "The subject is updating me\n";
    }
}

$subject = new MySubject();
$observer = new MyObserver();
$subject->attach( $observer );
$subject->notify();
?>


Даст нам:
Код

nucleuz:~/Sites/localhost/projects/wiki nucleuz$ php subject.php 
The subject is updating me  

Автор: Diesel Draft 6.8.2007, 12:26
SamDark, +1

Код

  class Event{
  
      private $list = array();
      
      
      
      public function __construct($obj = null, $method = null){
        if(!empty($obj) and !empty($method)){
            $this->add($obj, $method);
        }
      
      }
  
      public function add($obj, $method){
        $this->list[] = array('obj'=>$obj, 'method'=>$method);
      }
      
      public function RemoveAll(){
        $this->list = array();
      }
        




Автор: Mal Hack 6.8.2007, 12:57
Цитата(WIPS @  5.8.2007,  23:25 Найти цитируемый пост)
То, что вы называете ООП подходом в проектировании, все таки отличается от ООП подхода в чисто программировании (читай кодинге, или то что вы называте "чисто практической точкой зрения")

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

Цитата(WIPS @  5.8.2007,  23:25 Найти цитируемый пост)
В паскале есть классы. Только по иронии судьбы для их описания используется ключевое слово "оbject" =)

Да, да, вроде так.

Цитата(WIPS @  5.8.2007,  23:25 Найти цитируемый пост)
Не вижу приципиальных отличий в проектировании визуального и консольного приложения... Взять, например виндовый notepad и тот-же vim, логика приложений в принципе одинаковая, в чем разница при проектировании? 

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

Цитата(WIPS @  5.8.2007,  23:25 Найти цитируемый пост)
В таком понимании класс больше походит на интерфейс, т.е. описания возможностей объекта и способов взаим-я с ним.

А разве это не так? Разве классы не дают именно этого?


Цитата(SamDark @  6.8.2007,  12:01 Найти цитируемый пост)
Mal Hack, 
Кстати, в PHP5 есть уже реализованная событийная модель:

Я не говорю, что в ПХП событийности нет. Я говорю, что ее полностью надо самому реализовывать.

PS: а хорошая дискуссия получается  ;)

Автор: vasac 6.8.2007, 13:47
Цитата(Mal Hack @  6.8.2007,  12:57 Найти цитируемый пост)
А разве это не так? Разве классы не дают именно этого?

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

Автор: SamDark 6.8.2007, 14:54
Mal Hack
Не нравится самому - используем фреймворки.
p.s. на object pascal тоже можно без vcl писать...

Автор: Mal Hack 6.8.2007, 15:30
Цитата(SamDark @  6.8.2007,  14:54 Найти цитируемый пост)
Не нравится самому - используем фреймворки.

При чем тут фрэймворки...
Цитата(SamDark @  6.8.2007,  14:54 Найти цитируемый пост)
p.s. на object pascal тоже можно без vcl писать... 

Можно, но опять при чем тут это?
Ты же использует TObject тот же, если надо что-то визуальное сделать.

Цитата(vasac @  6.8.2007,  13:47 Найти цитируемый пост)
Оттого, что класс что либо дает, не значит, что это не может быть получено без использования класса. 

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

Автор: Daevaorn 6.8.2007, 15:48
Цитата(Mal Hack @  6.8.2007,  16:30 Найти цитируемый пост)
Ты же использует TObject тот же, если надо что-то визуальное сделать.

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

Автор: Mal Hack 6.8.2007, 16:00
Цитата(Daevaorn @  6.8.2007,  15:48 Найти цитируемый пост)
Складывает впечатление, что для тебя программирование делится на визуальное и не визуальное. Однобоко однако. 

Далеко не только, тем не менее, такое структурирование - уместно ;)

Автор: egao 6.8.2007, 17:19
TObject - это не более чем корневой объект фреймворка VCL, который существует не только для дельфей, но и для сей и для пхп.
искать по словам delphy for php - там и события и визуальный редактор и тп плюшки.
на уровне языка никаких событий нет. насколько мне известно на уровне языка события есть только в аспектно-ориентированных языках.

и не надо отделять Объектно Ориентированное Программирование от собственно программирования и оттаскивать его в сторону проектирования. для проектирования существует uml и иже с ним. для программирования важны объекты и их взаимосвязи. классы не в тему совершенно. классы позволяют дополнительно типизировать объекты. а нафига? концепция объектов - это концепция умных данных. то есть в идеале внешнему коду должно бы глубоко пох какой там у объекта тип - главное, чтобы он поддерживал необходимый интерфейс. отсюда вывод: классы - откровенно вредная сущность с которой нужно бороться.

и ещё, в пыхе класс фактически является объектом-синглетоном. банально потому, что он умеет хранить в себе данные, то есть ведёт себя как объект.


Автор: WIPS 6.8.2007, 23:12
Цитата(Mal Hack @  6.8.2007,  11:57 Найти цитируемый пост)
Не могу согласиться с тобой. Практика реализует теорию, и иначе быть не может. Да, при проектировании ты смотришь на предметную область, при реализаци уже на программные единицы - объекты, которыми оперируешь, но без первого второго не будет. В это и смылс, имхо, ООП как концепции, которая очень удачно совмещает теорию с практикой в результате чего получаем на практике те возможности, которые имеем.

Да, одно зависит от другого, но не всегда теория прямо проецируется в код. Просто в CBL отличия между моделью, описывающей логику и программной моделью невелики, а PBL они больше, вот и все.

Цитата(Mal Hack @  6.8.2007,  11:57 Найти цитируемый пост)
В консоли, фактически, ты используешь четко структурное программирование, в визуальном, где есть полная событийность, ты уже мыслишь по другому, в том плане, что при структурном ты НЕ можешь куда-либо перескочить, т.е. последовательность действий, отчасти - ограничена, а в визуальном, используя событийность ты в принципе не ограничен в выполнени действий. Т.е. ты видишь работу программы, как общую схему взаимодействия, а не как четкую последовательность действий.

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

Цитата(Mal Hack @  6.8.2007,  11:57 Найти цитируемый пост)
А разве это не так? Разве классы не дают именно этого?

Дают. Но, что если интерфейс объекта может меняться во время исполнения программы? Тут классы совершенно не годятся.

Цитата(egao @  6.8.2007,  16:19 Найти цитируемый пост)
и не надо отделять Объектно Ориентированное Программирование от собственно программирования и оттаскивать его в сторону проектирования. для проектирования существует uml и иже с ним. для программирования важны объекты и их взаимосвязи.

Согласен.

Цитата(egao @  6.8.2007,  16:19 Найти цитируемый пост)
отсюда вывод: классы - откровенно вредная сущность с которой нужно бороться.

Не согласен. Всякая вещь полезна если ею правильно пользоваться. И классы не исключение. Но и не панацея от всего.

Цитата(egao @  6.8.2007,  16:19 Найти цитируемый пост)
и ещё, в пыхе класс фактически является объектом-синглетоном. банально потому, что он умеет хранить в себе данные, то есть ведёт себя как объект.

Если ты про статические члены класса, то ты прав. Однако в данном случае это идет только на пользу. Кстати, как-то пытался использовать такую возможность в ObjectPascal и не нашел... мож ее там и нет?

Автор: SamDark 7.8.2007, 11:03
Mal Hack
TObject, как уже было сказано, не более чем корневой объект фреймворка VCL. Это не базовый объект языка.

Автор: WolfON 7.8.2007, 12:36
SamDark
Не VCL единым.
Цитата

TObject — класс предок обсалютно всех классов в языке Delphi.


http://ru.wikipedia.org/wiki/TObject

http://www.delphisources.ru/pages/faq/faq_delphi_basics/TObject.php.html


В большинстве языков с элементами ООП применен принцип базового класса - все остальне которые являются его наследником.
А в похапэ такого нет - да это особо и не нужно.

Автор: Mal Hack 7.8.2007, 13:56
Цитата(WIPS @  6.8.2007,  23:12 Найти цитируемый пост)
Да, одно зависит от другого, но не всегда теория прямо проецируется в код.

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

Цитата(WIPS @  6.8.2007,  23:12 Найти цитируемый пост)
Нет никаких отличий в событийности консольного приложения и визуального. Какая разница, вызывается обрабочик событий по клику мышкой или при нажатии комбинации клавиш?! Да и вобще события не обязательно порождаются пользователем, опять же сокеты, программные и аппаратные прерывания и пр. Извини, но твои аргументы в пользу разделения программ на визуальные и консольные меня совершенно не убедили.

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

Цитата(WIPS @  6.8.2007,  23:12 Найти цитируемый пост)
Дают. Но, что если интерфейс объекта может меняться во время исполнения программы? Тут классы совершенно не годятся.

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

Цитата(SamDark @  7.8.2007,  11:03 Найти цитируемый пост)
TObject, как уже было сказано, не более чем корневой объект фреймворка VCL. Это не базовый объект языка. 

Это базовый класс для описания визуальных объектов в среде OP...

Автор: Daevaorn 7.8.2007, 14:09
Цитата(Mal Hack @  7.8.2007,  14:56 Найти цитируемый пост)
Да, так, но если честно, не совсем могу себе представить задачу, где бы это было бы необходимо.

ORM?
Цитата(Mal Hack @  7.8.2007,  14:56 Найти цитируемый пост)
Это базовый класс для описания визуальных объектов в среде OP... 

это базовый класс по умолчанию для любого user-defined класса.

Автор: Mal Hack 7.8.2007, 14:16
Цитата(Daevaorn @  7.8.2007,  14:09 Найти цитируемый пост)
ORM?

я имел ввиду изменение интерфейса объекта во время работы.

Цитата(Daevaorn @  7.8.2007,  14:09 Найти цитируемый пост)
это базовый класс по умолчанию для любого user-defined класса. 

Все поняли что это smile

Автор: Daevaorn 7.8.2007, 14:20
Цитата(Mal Hack @  7.8.2007,  15:16 Найти цитируемый пост)
я имел ввиду изменение интерфейса объекта во время работы.

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

Автор: SamDark 7.8.2007, 14:30
Daevaorn
Кстати, гадость ещё та т.к. тормознутая из-за дополнительных запросов...

Автор: Daevaorn 7.8.2007, 14:32
Цитата(SamDark @  7.8.2007,  15:30 Найти цитируемый пост)
Кстати, гадость ещё та т.к. тормознутая из-за дополнительных запросов... 

да есть такое. но вопрос решаемый, т.е. найти оптимальный вариант можно. а положительные стороны перевешивают эти недостатки.

Автор: Mal Hack 7.8.2007, 15:17
Цитата(Daevaorn @  7.8.2007,  14:20 Найти цитируемый пост)
ну так, интерфйес подстраивается под конкретную модель данных. причем имено во время выполнения, поскольку процесс "подстройки" автоматизирован, а не лежит на плечах программиста 

А на практике где применимо? Мне чисто из любопытсва интересно.

Автор: SamDark 7.8.2007, 15:25
Mal Hack
На практике применяется обычно несколько другой вид ORM.

См. http://propel.phpdb.org/trac/.

Автор: Daevaorn 7.8.2007, 15:27
Цитата(Mal Hack @  7.8.2007,  16:17 Найти цитируемый пост)
А на практике где применимо? Мне чисто из любопытсва интересно. 

Ну как же, во всех RAD MVC фреймворках: клонах и не клонах RoR.

Автор: Mal Hack 7.8.2007, 15:35
С фреймворками не работал, к сожалению, либо очень мало и не на PHP...

Автор: Fally 7.8.2007, 15:38
Daevaorn, кстати, меня всё интересует... все хвалят ORM... как я понял, то с его помощью можно и загружать данные из базы в объект. Если я правильно понял, то вопрос: Откуда гарантия что запрос к БД будет оптимальным с точки зрения производительности?

Автор: Daevaorn 7.8.2007, 15:49
Цитата(Fally @  7.8.2007,  16:38 Найти цитируемый пост)
Откуда гарантия что запрос к БД будет оптимальным с точки зрения производительности? 

такой гарантии нет. все зависит от авторов ORM библиотеки. благо их щас развелось достаточно много и есть из чего выбрать. но всё равно в нетривиальной ситуации оптимальный запрос напишет только сам человек. поэтому иногда приходится ручками до SQL снисходить. обычно для этого тоже предусмотрены специальные инструменты, которые позволяют даже на основе "ручных" запросов создавать в итоге объекты. Зато ORM очень выручает, когда сложных запросов не много и нужно просто получить список неких объектов без сложных условий. ну и бесплатно получается некая структурность кода

Автор: WIPS 8.8.2007, 00:38
Цитата(Mal Hack @  7.8.2007,  12:56 Найти цитируемый пост)
Согласен, но согласись, в любом случае, практическая реализация в той или иной степени все равно основывается на теоретических понятиях. На них можно и забить, но вот работоспособность, точнее безопасность и оптимальность кода будут большим вопросом стоять.

Согласен, забивать ни на что нельзя. Все потом боками вылезает.

Цитата(Mal Hack @  7.8.2007,  12:56 Найти цитируемый пост)
Ты не совсем меня понимаешь. Я имею ввиду не вызов события, так сказать, как сам факт его появления - клик мышкой по кнопке, а механизм передачи управления, в зависимости от события, определенному программному коду (методу, функции и т.д.).

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


Автор: SamDark 8.8.2007, 10:57
Mal Hack
Я выше дал ссылку на propel. Наверное зря... штука пугающая. Лучше ORM посмотреть на http://www.ezpdo.net/. Там всё проще и без заморочек...

Автор: Mal Hack 8.8.2007, 12:50
Цитата(WIPS @  8.8.2007,  00:38 Найти цитируемый пост)
В одном случае этот механизм реализуется ручками, в другом автоматически

Вот я про это отличие и говорю.

SamDark, посмотрю на досуге.

Автор: SamDark 8.8.2007, 13:32
Цитата
В одном случае этот механизм реализуется ручками, в другом автоматически

Автомат тоже кто-то делал ручками. Что нам мешает один раз сделать и наслаждаться?

Автор: WIPS 8.8.2007, 18:33
Цитата(SamDark @  8.8.2007,  12:32 Найти цитируемый пост)
Автомат тоже кто-то делал ручками. Что нам мешает один раз сделать и наслаждаться?

Ничего не мешает. Я с этим и не спорю, а наоборот придерживаюсь этого мнения.

Автор: chief39 31.8.2007, 17:56
Цитата(Mal Hack @  1.8.2007,  11:41 Найти цитируемый пост)
Модуль - это программная единица, куда вынесены куски программного кода, разделенные по смысловой и модульной нагрузке. 

"Чтобы понять рекурсию, надо понять рекурсию" smile))

Автор: Diesel Draft 1.9.2007, 00:34
chief39
+1

Автор: CyClon 28.11.2007, 09:30
Если писать CMS или что-то, что в дальнейшем будет очень часто модифицироваться, то естественно ООП. Если же нам нужно получить небольшой скрипт, который будет работать на большинстве платформ, причем быстро - тогда процедурное.

Автор: cccr85 13.7.2010, 09:56
Прочитал данную тему пока только до середины, и внесу свои 5 копеек.

Я программирую на php. Нигде не учился, все сам. И так, что мы имеем.

Что такое класс? Нет это не class myClass {} а это КЛАСС каких либо повторяющихся вещей, предметов и т.д. 
Теперь что такое объект этого класса? Нет это не $Object = new myClass; А это один экземпляр класса. 

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

Теперь для того чтобы создать сколько угодно кнопок, достаточно создать объект кнопки примерно так:

$button = new myButton;          // class myButton extends basicButton {
$button->name = 'Моя кнопка';  // Текст на кнопке

$window = new myWindow;
$window->setButton($button);

Все, кнопка отобразилась на окне, красота? Я думаю да. Понятно все? Да. ООП мне нравиться? Да.


Ок. Разберем еще один пример, играем мы в стратегию, и там есть юниты, все они похожи, но кое в чем разнятся, ёмаё, да это еще один класс и его расширение.

И таких примеров много!!! Но теперь вернемся к нашему php, я пока для себя нашел только один похожий на примеры выше код.

Чуть предисловия:
Класс базы данных. Раньше я делал так, создавал объект базы данных, в котором были методы конекта, отправки запроса, проверки данных, получения результата и т.д. На одном из форумов, или у кого то в библиотеки я подсмотрел идею что класс mysql должен только конектится, и делать запросы, а вот результат отдается в виде объекта, с которым я могу работать. Более того, при работе с результатом есть много общих действий для всего класса ответов на запросы, например освобождение памяти, получение размера, и т.д. Здесь ооп мне понравилось. Я понял его суть. 

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

К сожалению других применений ООП в php я пока не вижу. 

В общем вот что я думаю.

Добавлено через 4 минуты и 20 секунд
Цитата(SamDark @ 3.8.2007,  11:29)
WIPSFally
В JavaScript нет ОО в привычном понимании. т.е. классов и объектов. Там совершенно другой принцип, основаный на прототипах. Вот там как раз с натяжкой можно сказать, что "класс сам является объектом", хотя сравнивать прототипное программирование с классическим ОО, а тем более приводить к нему, как многие делают, некорректно.

Позволю себе не согласиться, например все та же злосчастная кнопка является объектом!!! С ней удобно работать как с объектом. 

Автор: youri 13.7.2010, 15:09
отличить ООП-код от не-ООП на самом деле очень просто:
1. Берем исходники
2. Ищем полиморфизм
...
PROFIT
т.е. фактически сама задача определяет, будет ли использовано ООП. Нету юнитов - нету меда ;)

по поводу событийности/визуальности... разделение, естественно, имеет место быть. Хорошо, а что важнее событийность или визуальность? Возьмем, например, java/c# в контексте веба. В php событийность - это запросы от сервера, только все объекты умирают от запроса к запросу. В java/c# это не так (насколько я знаю). Т.е. вроде как событийность есть, но нету визуальности...

но в любом случае я не понимаю, почему это приводит к разделению на тру-ООП и нетру-ООП. Да, написание web- и десктопных приложений отличается. Но я бы сказал, что ООП - это в первую очередь подход к решению поставленной задачи. Да, это умирание объектов от запроса к запросу не вызывает к ним уважения. Но тем не менее, если ООП было удобно применить к некоторой задаче, значит она была решена с использование ООП

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

Автор: SneG0K 20.7.2010, 11:59
ООП - это гламурно smile

Автор: cccr85 20.7.2010, 15:09
А вообще тем кто хочет понять ооп, и тем кто хочет прокачать свой скил в программировании, советую посмотреть в сторону фреймворка. Начать лучше всего с http://code-igniter.ru/ изучить его, по ссылке очень хорошая документация, когда читал про него, мне все нравилось, но в последствии многие вещи, я посчитал лишними, и не нужными. После того как изучен кодеигнитер, самое время посмотреть что нибудь повеселее, http://kohanaframework.org/guide/api полностью ООП, HMVC паттерн, и еще много вкусностей. Сейчас сделаю один проект на ней, и пойду изучать yii

Автор: NLspieler 22.7.2010, 22:03
Цитата(youri @  13.7.2010,  15:09 Найти цитируемый пост)
только все объекты умирают от запроса к запросу

Совсем не обязательно все объекты должны умирать.
Объекты-«долгожители»  можно спокойно хранить в массиве $_SESSION
и тогда им уже ничего больше грозить не будет

Отсутствие событийности очень легко обходится при помощи javascript + ajax + php скрипт(ы), которые при разных запросах,
будут производить разные действия, 
например, применять методы к объектам, которые хранятся в $_SESSION

Впрочем, некая событийность есть даже при отсутствии javascript. 
Отправка формы или нажатие на get-ссылку: чем не событие?


Автор: youri 22.7.2010, 22:49
такое впечатление, что ты, чтобы доказать что в php объекты не умирают, будешь всех их сериализовать/десериализовать в БД. Перечитай тему еще раз. java - это постоянно работающее приложение, которое отвечает на запросы, php - это набор скриптов, которые запускаются в результате запроса. Отсутствие событийности не надо обходить

Автор: Muerto 10.9.2010, 17:53
На самом деле нету Объектное вс процедурное...
это скорее объектное + процедурное вс только объектное...

И здесь выигрывает однозначно объектное + процедурное...

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

Автор: bars80080 10.9.2010, 19:21
Цитата(Muerto @  10.9.2010,  17:53 Найти цитируемый пост)
это скорее объектное + процедурное вс только объектное...

да ладно. я первый год классами вообще не пользовался

Автор: NFL 20.7.2011, 00:07
Цитата(bars80080 @  10.9.2010,  19:21 Найти цитируемый пост)
да ладно. я первый год классами вообще не пользовался


Пока мне не довелось столкнуться с MVC (в ZF), я тоже ООП пнименял по минимуму. Теперь уже не представляю, как можно писать без применения ОО-подхода что-то сложнее визитки) smile 

Автор: Genn 8.8.2012, 20:26
> объектное vs процедурное

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

Автор: Gold Dragon 15.1.2013, 07:44
Тема древняя и бестолковая  smile Всё хорошо, и то и другое...

Лично я уже всегда использую объектное, процедурное только как "короткие формы" исключительно чтобы сократить код и для наглядности, например чтобы не писать это
Код

LText::_('_KAKOYTO_TEXT');
LConfig::getParam('root');

достаточно сделать пару функций
Код

function _($str){
     LText::_($str);
}
function getParam($str){
     LConfig::getParam($str);
}

Автор: xoptov 25.1.2013, 11:02
+1
Я не за "объектное vs процедурное", я за "объектное & процедурное".

Автор: Deja_Vu 1.4.2013, 10:26
Бред какой то. Тут большая часть вообще не понимает что такое ООП и с чем его едят.

Вот список вопросов для того, что бы оценить свои силы, в понимании ООП:
  •  Как связаны abstract методы класса и protected?
  •  Должен ли один public метод класса вызывать public метода этого же класса?
  •  В каких случаях можно использовать static методы? Нужны ли они вообще?
  •  Когда нужно использовать TypeHint и передавать объект, а когда нужно передавать сырые извлеченные данные из объекта в параметрах метода?

Автор: Gold Dragon 1.4.2013, 10:43
Цитата(Deja_Vu @  1.4.2013,  11:26 Найти цитируемый пост)
Как связаны abstract методы класса и protected?
 Должен ли один public метод класса вызывать public метода этого же класса?
 В каких случаях можно использовать static методы? Нужны ли они вообще?
 Когда нужно использовать TypeHint и передавать объект, а когда нужно передавать сырые извлеченные данные из объекта в параметрах метода?
вопросы из контрольной?  smile Вот только интересно как по ним оценить знания smile

Автор: baldina 1.4.2013, 12:01
Цитата(Deja_Vu @  1.4.2013,  10:26 Найти цитируемый пост)
Тут большая часть вообще не понимает что такое ООП и с чем его едят

большая часть вообще склонна к непониманию. я только один ценный пост вижу:
Цитата(SneG0K @  20.7.2010,  11:59 Найти цитируемый пост)
ООП - это гламурно

кстати, с чем положено есть гламур?

Автор: Deja_Vu 1.4.2013, 14:25
Цитата(Gold Dragon @  1.4.2013,  10:43 Найти цитируемый пост)
вопросы из контрольной?   Вот только интересно как по ним оценить знания  

Это вопросы с которыми я столкнулся в процессе работы с людьми над большими проектами.
Если человек не знает ответов на эти вопросы, значит и код его будет доставлять неприятности всей остальной команде.
Вся процедурщина анархия вообще вытекает лишь тогда, когда человек не понимает для чего нужно ООП. В чём его предназначение.
Если же человек понимает, тогда "объектное vs процедурное" вообще не стоит, ибо первое создано что бы снизить сложность понимания исходного кода продукта.
Второй же подход не имеет инструментов что бы добиться снижения этой сложности, а потому в принципе не может больше подходить к разработке программных продуктов.

Автор: Gold Dragon 1.4.2013, 14:29
Цитата(Deja_Vu @  1.4.2013,  15:25 Найти цитируемый пост)
Если человек не знает ответов на эти вопросы, значит и код его будет доставлять неприятности всей остальной команде.
Из школьной программы я ещё помню как устроена и принципы работы ядреной бомбы.. вот только не умею её делать  smile 

Автор: Deja_Vu 1.4.2013, 14:34
Цитата(Gold Dragon @ 1.4.2013,  14:29)
Цитата(Deja_Vu @  1.4.2013,  15:25 Найти цитируемый пост)
Если человек не знает ответов на эти вопросы, значит и код его будет доставлять неприятности всей остальной команде.
Из школьной программы я ещё помню как устроена и принципы работы ядреной бомбы.. вот только не умею её делать  smile

Не совсем понял иронии.

В принципе у программиста с большим опытом есть уже "чувство" когда и как лучше писать.
Только вот понимать что ты делаешь надо. Иначе мне такие программисты напоминают алхимиков, которые пробовали ингредиенты на вкус для определения, чем они являются.

Автор: baldina 1.4.2013, 14:35
а можно узнать
Цитата(Deja_Vu @  1.4.2013,  10:26 Найти цитируемый пост)
Как связаны abstract методы класса и protected?

и как это проявляется
Цитата(Deja_Vu @  1.4.2013,  14:25 Найти цитируемый пост)
в процессе работы с людьми над большими проектами

?

и еще. если Вам удалось раз и навсегда решить
Цитата(Deja_Vu @  1.4.2013,  10:26 Найти цитируемый пост)
Должен ли один public метод класса вызывать public метода этого же класса?

с удовольствием послушаю решение

Автор: Gold Dragon 1.4.2013, 14:46
Цитата(Deja_Vu @  1.4.2013,  15:34 Найти цитируемый пост)
Не совсем понял иронии.

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

Цитата(baldina @  1.4.2013,  15:35 Найти цитируемый пост)
с удовольствием послушаю решение 

а мне больше всего хочется послушать вот по этому, особенно по второй части
Цитата(Deja_Vu @  1.4.2013,  11:26 Найти цитируемый пост)
В каких случаях можно использовать static методы? Нужны ли они вообще?


Автор: Fortop 1.4.2013, 16:15
Цитата(Deja_Vu @  1.4.2013,  10:26 Найти цитируемый пост)
 Как связаны abstract методы класса и protected?

Ну и как они связаны?  smile

Добавлено через 49 секунд
Цитата(Deja_Vu @  1.4.2013,  10:26 Найти цитируемый пост)
 В каких случаях можно использовать static методы? Нужны ли они вообще?

Почему по-умолчанию считается, что их использовать нельзя?  smile 

Автор: krundetz 2.4.2013, 15:50
Цитата(Deja_Vu @  1.4.2013,  14:25 Найти цитируемый пост)
Если же человек понимает, тогда "объектное vs процедурное" вообще не стоит, ибо первое создано что бы снизить сложность понимания исходного кода продукта.

а как вообще можно сравнивать эти этапы эволюции программирования? Процедурный подход, предшествовал структурному, а он в свою очередь предшествовал ООП. И все эволюционные этапы направлены именно на облегчение понимание большого объема исходного кода, а следовательно на облегчение его поддержки.
Цитата(Deja_Vu @  1.4.2013,  10:26 Найти цитируемый пост)
Должен ли один public метод класса вызывать public метода этого же класса?

может использовать вместо должен слово может? если вопрос верен, и именно в этом слове подвох то, не должен.
Цитата(Deja_Vu @  1.4.2013,  14:34 Найти цитируемый пост)
Иначе мне такие программисты напоминают алхимиков, которые пробовали ингредиенты на вкус для определения, чем они являются. 

все гораздо хуже, так как у алхимиков были не совершенные методы исследования. Но они были, а у этих и методов исследования нет никаких. Сегодня один такой деятель, пытался решить проблему ограничения времени выполнения скрипта на хостинге в 30 секунд при помощи введения вызова функции sleep(30). Я бы назвал таких людей не желающими смотреть куда тыкают своим пальцем, пусть это будет фекалии или высоковольтные провода.
Цитата(Fortop @  1.4.2013,  16:15 Найти цитируемый пост)
Почему по-умолчанию считается, что их использовать нельзя?

а почему можно?

Автор: baldina 2.4.2013, 16:34
Цитата(krundetz @  2.4.2013,  15:50 Найти цитируемый пост)
Цитата(Fortop @  1.4.2013,  16:15 )
Почему по-умолчанию считается, что их использовать нельзя?

а почему можно?

опрос затеять штоли))))

Автор: Fortop 2.4.2013, 22:03
Цитата(krundetz @  2.4.2013,  15:50 Найти цитируемый пост)
а почему можно?

Можно - потому что есть возможность smile

Автор: krundetz 3.4.2013, 11:40
Цитата(Fortop @  2.4.2013,  22:03 Найти цитируемый пост)
Можно - потому что есть возможность

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

вообще на мой взгляд вопросы не совсем корректны в формулировках?

Цитата(baldina @  2.4.2013,  16:34 Найти цитируемый пост)
опрос затеять штоли)))) 

зачем?

Автор: baldina 3.4.2013, 11:47
Цитата(krundetz @  3.4.2013,  11:40 Найти цитируемый пост)
зачем? 

что бы устроить холивар остроконечников и тупоконечников

Автор: Fortop 3.4.2013, 13:06
Цитата(krundetz @  3.4.2013,  11:40 Найти цитируемый пост)
можно много чего, например из ружья выстрелить себе в ногу, но ведь никто в здравом уме так не делает

Перечитай свой вопрос. Ты спрашивал "а почему можно"

А нужно ли - это совсем другой вопрос  smile 

Автор: krundetz 4.4.2013, 09:54
Цитата(Fortop @  3.4.2013,  13:06 Найти цитируемый пост)
Ты спрашивал "а почему можно"

спалил
Цитата(Fortop @  3.4.2013,  13:06 Найти цитируемый пост)
А нужно ли - это совсем другой вопрос

Ну вот я и говорю, что вопросы не совсем корректны
Цитата(baldina @  3.4.2013,  11:47 Найти цитируемый пост)
что бы устроить холивар остроконечников и тупоконечников 

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

Автор: Deja_Vu 9.4.2013, 16:42
Такс, извиняюсь, что пропал. Времени не было.

Цитата(baldina @  1.4.2013,  14:35 Найти цитируемый пост)
Цитата(Deja_Vu @  1.4.2013,  10:26 )Как связаны abstract методы класса и protected?

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

Protected методы уровня абстракции класса подразумеваются, что используются в absctract методах. 
Например, если у вас в уровне абстракции есть public метод и в нём используется protected метода, а так же есть abstract метод - то это ошибка проектирования. Это следует из принципа единой ответственности. Класс, который показывает, каким способом расширяется приложение, должен быть ответственен за один из способов расширения.

Цитата(baldina @  1.4.2013,  14:35 Найти цитируемый пост)
Цитата(Deja_Vu @  1.4.2013,  10:26 )Должен ли один public метод класса вызывать public метода этого же класса?

с удовольствием послушаю решение

Нет, не должен. Опять же следует из принципа единой ответственности. 
Чаще всего этот вопрос возникает, когда нужно использовать в методах класса getter/setter. Если ваш класс ответственнен за предоставление данных, то он не должен их же использовать. 
Если нужно выполнять какую то не тривиальную операцию в классе, нужно либо выделить дочернюю абстракцию с решением данной задачи, либо создать отдельный класс, для её решения.

Цитата(krundetz @  2.4.2013,  15:50 Найти цитируемый пост)
может использовать вместо должен слово может? если вопрос верен, и именно в этом слове подвох то, не должен.

Да, вы правы, я не верно задал вопрос.

Цитата(krundetz @  2.4.2013,  15:50 Найти цитируемый пост)
а как вообще можно сравнивать эти этапы эволюции программирования

Вы более элегантно изложили то что у меня вертелось в голове, спасибо.

Добавлено @ 16:52
Цитата(Gold Dragon @  1.4.2013,  14:46 Найти цитируемый пост)
а мне больше всего хочется послушать вот по этому, особенно по второй части

Цитата(Deja_Vu @  1.4.2013,  11:26 )В каких случаях можно использовать static методы? Нужны ли они вообще?

Это самый замечательный функционал, который ввели не до конца продумав.
На мой взгляд static методы нужны и оправданы лишь для порождения экземпляра текущего класса (или дочерних) и получение информации о не расширяемых свойствах класса. 


Автор: baldina 9.4.2013, 16:58
Цитата(Deja_Vu @  9.4.2013,  16:42 Найти цитируемый пост)
Protected методы уровня абстракции класса подразумеваются, что используются в absctract методах. Например, если у вас в уровне абстракции есть public метод и в нём используется protected метода, а так же есть abstract метод - то это ошибка 

имхо чушь
например, что тут не так?
Код

class Shape {
  protected:
     virtual void draw_impl () = 0;
  public:
     void draw () {
         prepare ();
         draw_impl ();
     }
};



Цитата(Deja_Vu @  9.4.2013,  16:42 Найти цитируемый пост)
Если ваш класс ответственнен за предоставление данных, то он не должен их же использовать. 

с чего бы это?
Код

class Detail {
  public:
    virtual double get_volume () = 0;
    double get_mass () {
       return get_volume() * get_density ();
    }
};

или я должен отдельный класс создать для вычисления массы?

 smile 
Цитата(krundetz @  4.4.2013,  09:54 Найти цитируемый пост)
выборка будет не презентована. 

 smile  нерепрезентативна

Добавлено @ 16:58
гы. на С++ написал. ну, думаю меня поймут

Автор: Fortop 9.4.2013, 20:11
Цитата(Deja_Vu @  9.4.2013,  16:42 Найти цитируемый пост)
Protected методы уровня абстракции класса подразумеваются, что используются в absctract методах. 

Чего?
Кем подразумеваются?

Цитата(Deja_Vu @  9.4.2013,  16:42 Найти цитируемый пост)
. Если ваш класс ответственнен за предоставление данных, то он не должен их же использовать. 
Если нужно выполнять какую то не тривиальную операцию в классе, нужно либо выделить дочернюю абстракцию с решением данной задачи, либо создать отдельный класс, для её решения.

Не понял.

Т.е. если у меня в сеттере происходит фильтрация каких-то raw значений.
То, если я буду устанавливать свойства скопом (например, инициализации массивом при создании объекта класса), я должен буду этот же функционал фильтрации реализовывать еще раз?
Или создавать специально для этого случая приватные/протектед методы для каждого из свойств и вызывать их в сеттерах и конструкторе соответственно?

А нафига?

Автор: baldina 9.4.2013, 23:23
Цитата(Deja_Vu @  9.4.2013,  16:42 Найти цитируемый пост)
Чаще всего этот вопрос возникает, когда нужно использовать в методах класса getter/setter

Цитата(Deja_Vu @  9.4.2013,  16:42 Найти цитируемый пост)
Если нужно выполнять какую то не тривиальную операцию в классе, нужно либо выделить дочернюю абстракцию с решением данной задачи

для чего по вашему нужны getter/setter? особенно, если операция тривиальная.
что бы при изменении операции (не наследовании, а именно изменении в процессе разработки) не нужно было переписывать доступ к элементам класса.
других резонов нет.
если другие функции этого класса (неважно с каким модификатором доступа) должны получать доступ к этому элементу, логично этот доступ реализовать через getter/setter именно для упрощения обеспечения целостности класса в при его изменениях.

а плодить абстракции вообще надо http://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B8%D1%82%D0%B2%D0%B0_%D0%9E%D0%BA%D0%BA%D0%B0%D0%BC%D0%B0

Автор: Deja_Vu 10.4.2013, 08:16
Цитата
 гы. на С++ написал. ну, думаю меня поймут 

не поймут.

Цитата(baldina @  9.4.2013,  16:58 Найти цитируемый пост)
например, что тут не так?

То что это вообще не подходит под тот случай, который я описыва. Где здесь абстрактный метод?

Цитата
с чего бы это?

Если я правильно понял это C++ творчество, то тут вычисление массы является getter-ом некого виртуального свойства.
Код

class Detail 
{
  private $volume = 0;
  private $density = 0;

  public function getVolume()
  {
     return $this->volume;
  }
  public getMass() 
  {
      return $this->volume * $this->density;
   }
}

Расхождения со своими словами я тут не вижу

Добавлено через 11 минут и 36 секунд
Цитата(Fortop @  9.4.2013,  20:11 Найти цитируемый пост)
Чего?Кем подразумеваются?

Я же написал, что это следствие из SOLID. 
Если вы считаете его не верным, то и следствие для вас будет не верно.

Цитата(Fortop @  9.4.2013,  20:11 Найти цитируемый пост)
Т.е. если у меня в сеттере происходит фильтрация каких-то raw значений.То, если я буду устанавливать свойства скопом (например, инициализации массивом при создании объекта класса), я должен буду этот же функционал фильтрации реализовывать еще раз?Или создавать специально для этого случая приватные/протектед методы для каждого из свойств и вызывать их в сеттерах и конструкторе соответственно?А нафига?

Изходя из SOLID конструктор не попадает под это правило. Извиняюсь, что этого не указал ранее, из головы вылетело.

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

Автор: Deja_Vu 10.4.2013, 08:31
Цитата(baldina @  9.4.2013,  23:23 Найти цитируемый пост)
а плодить абстракции вообще надо с осторожностью

Уже давно известно, что Бритва Оккама не работает для больших систем.
Кстати, как раз об этом говорили на конференции «Свободное программное обеспечение в высшей школе», проходившей в январе этого года.

Цитата(baldina @  9.4.2013,  23:23 Найти цитируемый пост)
для чего по вашему нужны getter/setter? особенно, если операция тривиальная.что бы при изменении операции (не наследовании, а именно изменении в процессе разработки) не нужно было переписывать доступ к элементам класса.

Честно говоря, я сам долго противился этому. Но задайте себе вопрос, зачем вам делать getter и/или setter public, если у вас все вычисления с ними происходят в самом классе? 
Если это так, значит вы не верно указали их область видимости. Если же не так, то каким образом вы разделяете, какая логика должна оставаться в классе, а какая выноситься?

Автор: baldina 10.4.2013, 09:41
Цитата(Deja_Vu @  10.4.2013,  08:31 Найти цитируемый пост)
Но задайте себе вопрос, зачем вам делать getter и/или setter public, если у вас все вычисления с ними происходят в самом классе? 

если все, то конечно нет необходимости. но если не все? именно такой пример я и привел

кстати, вот те же примеры на пхп
Код

abstract class Shape {
  protected abstract function draw_impl ();
  public function draw () {
         $this->prepare ();
         $this->draw_impl ();
     }
}


Код

abstract class Detail {
  public abstract function get_volume ();
  public          function get_mass () {
       return $this->get_volume() * $this->get_density ();
    }
}


Добавлено через 2 минуты и 22 секунды
Цитата(Deja_Vu @  10.4.2013,  08:31 Найти цитируемый пост)
зачем вам делать getter и/или setter public

вопрос-то был не в квалификаторе, а применении изнутри класса
Цитата(Deja_Vu @  10.4.2013,  08:31 Найти цитируемый пост)

Должен ли один public метод класса вызывать public метода этого же класса?
...
Чаще всего этот вопрос возникает, когда нужно использовать в методах класса getter/setter. Если ваш класс ответственнен за предоставление данных, то он не должен их же использовать. 


Добавлено через 14 минут и 51 секунду
Цитата(Deja_Vu @  10.4.2013,  08:31 Найти цитируемый пост)
Уже давно известно, что Бритва Оккама не работает для больших систем.

1. получение массы детали - пример большой системы?  smile 
2. он же методология, так что он не работает, а может применяться и быть или не быть полезным. впрочем, осветите нам свою точку зрения поподробнее. имхо появление любого уровня абстракции должно быть обосновано. если обосновано - Бритва Оккама не нарушается. если не обосновано, то это глупость, и размер системы тут непричем. инженерия это не философия и даже не физика.

Автор: baldina 10.4.2013, 10:07
Цитата(Deja_Vu @  10.4.2013,  08:31 Найти цитируемый пост)
каким образом вы разделяете, какая логика должна оставаться в классе, а какая выноситься?

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

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

Автор: Deja_Vu 10.4.2013, 10:37
Цитата(baldina @  10.4.2013,  09:41 Найти цитируемый пост)
если все, то конечно нет необходимости. но если не все? именно такой пример я и привел

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


Код

abstract class Shape {
  protected abstract function draw_impl ();
  public function draw () {
         $this->prepare ();
         $this->draw_impl ();
     }
}

Хм, так и что тут не так? 
Если один и тот же метод abstract и protected - он по прежнему является abstract методом.
Может я не полностью выражаю свою мысль, поэтому у нас с вами проблема во взаимопонимании
Код

abstract class Shape {
  protected abstract function draw_impl ();
  protected function prepare() { /*...*/ }
  public function draw () {
         $this->prepare ();
         $this->draw_impl ();
     }
}

Вот тут явно нарушение в принципе единой ответственности. Такой код, кстати встречается очень часто во многих проектах.

Цитата
вопрос-то был не в квалификаторе, а применении изнутри класса

Смотрите, если ваш класс предоставляет public getter к свойству и ещё его же использует где то в своих методах - то тут явная проблема с принципом единой ответственности. Т.е. как только у вас появляется метод, который находится внутри класса, который начинает использовать этот public getter возникает вопрос, а почему он там находится, если он с полями работает через внешний интерфейс?

Цитата(baldina @  10.4.2013,  09:41 Найти цитируемый пост)
 имхо появление любого уровня абстракции должно быть обосновано. если обосновано

Уровень абстракции появляется тогда, когда текущий уровень абстракции нарушает SOLID

Добавлено @ 10:44
Цитата(baldina @  10.4.2013,  10:07 Найти цитируемый пост)
очень просто: в классе остается логика класса, все остальное выносится. логика класса - логика той единственной задачи, которую решает класс.

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

Автор: baldina 10.4.2013, 11:20
Цитата(Deja_Vu @  10.4.2013,  10:37 Найти цитируемый пост)
Нет возможности рассматривать данную проблему именно в таком контексте

чем плох этот контекст? задача простая и типовая. как еще её решить. не нарушая ваших принципов?

Цитата(Deja_Vu @  10.4.2013,  10:37 Найти цитируемый пост)
Вот тут явно нарушение в принципе единой ответственности

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

abstract class Processor {
  public function process () {\
    $this->pre();
    $this->run();
    $this->post();
  }
  protected  function pre() {}
  protected  function post() {}
  abstract protected  function run();
}

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

Цитата(Deja_Vu @  10.4.2013,  10:37 Найти цитируемый пост)
если ваш класс предоставляет public getter к свойству и ещё его же использует где то в своих методах - то тут явная проблема с принципом единой ответственности. Т.е. как только у вас появляется метод, который находится внутри класса, который начинает использовать этот public getter возникает вопрос, а почему он там находится, если он с полями работает через внешний интерфейс?

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

Цитата(Deja_Vu @  10.4.2013,  10:37 Найти цитируемый пост)
Уровень абстракции появляется тогда, когда текущий уровень абстракции нарушает SOLID

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

Цитата(Deja_Vu @  10.4.2013,  10:37 Найти цитируемый пост)
Как то вообще не ясно, что вы понимаете под логикой класса.

думаю мы это одинаково понимаем. витиеватой фразой я лишь хотел намекнуть на SRP

Цитата(Deja_Vu @  10.4.2013,  10:37 Найти цитируемый пост)
Выделение классов - вообще задача не тривиальная. 

Цитата(Deja_Vu @  10.4.2013,  10:37 Найти цитируемый пост)
Пока что более формализованного принципа по написанию системы я не нашел.

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

Добавлено через 8 минут и 29 секунд
кстати, не приходило вам в голову, что внутреннее использование геттеров - это как раз поддержание OCP?

Автор: Fortop 10.4.2013, 13:30
Цитата(Deja_Vu @  10.4.2013,  08:16 Найти цитируемый пост)
Как только нарушается одно из правил, создается новый уровень абстракции или выделяется класс для реализации функционала.

бэктрейсы java видели?

user posted image


Цитата(Deja_Vu @  10.4.2013,  08:16 Найти цитируемый пост)
Такой код на много(на порядок) проще поддерживать

Скрин выше, его точно на порядок проще поддерживать?  smile 

Автор: Deja_Vu 10.4.2013, 13:54
Браузер упал, все что писал - пропало. Пипец желания нет повторяться. Но осилю спустя время.

Цитата
бэктрейсы java видели?

И? Могу вам привести класс на 4000 строк, могу заявить, что backtrace там будет не меньше.

Цитата
Скрин выше, его точно на порядок проще поддерживать? 

При верном выделении абстракций - проще. И даже длинный backtrace вам покажет по какому пути пошлоа логика, что бы сломаться.

Добавлено через 4 минуты и 7 секунд
Цитата
кстати, не приходило вам в голову, что внутреннее использование геттеров - это как раз поддержание OCP?

Перечитаю Мэйера. Но я более чем уверен, что в public нельзя использовать public методы - верен.
К тому же, я поддерживаю использование getter/setter т.к. они очень полезны при рефакторинге. А вот уже нужда в рефакторинге возникает, когда вам нужно сложную функцию вставить в getter/setter. 
А если оставлять как есть, то это приводит к ужаснейшому ###коду - проверено.

Добавлено через 8 минут и 7 секунд
Код

abstract class Processor {
  public function process () {\
    $this->pre();
    $this->run();
    $this->post();
  }
  protected  function pre() {}
  protected  function post() {}
  abstract protected  function run();
}

Плохо, потому что мне нужно полностью просмотреть код класса, что бы понять, как связаны pre, post и run. И как же заставить Processor работать правильно.

Код

abstract class Processor {
  public function process () {
    $this->run();
 }

  abstract protected  function run();
}

abstract class Processor extends Processor {
  public function process () {
    $this->pre();
    parent::process();
    $this->post();
  }
  protected  function pre() {}
  protected  function post() {}
}

Классы меньше. Понять логику работы проще.
Легче покрыть тестами.
Backtrace покажет в каком уровне абстракции возникает ошибка и исправлять нужно будет только там.

Добавлено через 9 минут и 3 секунды
Цитата
чем плох этот контекст? задача простая и типовая. как еще её решить. не нарушая ваших принципов?

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

Добавлено через 10 минут и 51 секунду
Цитата
слишком общее и потому совершенно пустое утверждение (имхо и неверное - OCP не относится к выделению абстракций). что именно и как именно в SOLID нарушает мой пример с получением массы?

Всё нужно решать в общем виде. Частности лгут и не приводят к хорошему результату.
А вообще в SOLID я жирным выделил те компоненты, о которых я говорю, а не обо всем принципе smile Наверное получилось не понятно.

Цитата
как нарушение SOLID может удовлетворять Бритве Оккама и наоборот, удовлетворение SOLID нарушать его? (приведите пример)

Меня ввел в ступор данный вывод. Наверное мы друг друга не поняли.

Автор: Deja_Vu 10.4.2013, 14:11
Цитата
именно. есть методология, методики нет. два разных решения могут быть одинаково хороши, выбор в таком случае - дело вкуса.

Я бы сказал так, есть множество методов N не удовлетворяет методологии SOLID -))
Я нашел для себя один метод который не входит в множество N и ещё ни разу ни кем не видел предложенного другого метода.

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

Автор: baldina 10.4.2013, 14:28
Цитата(Deja_Vu @  10.4.2013,  13:54 Найти цитируемый пост)
Но я более чем уверен, что в public нельзя использовать public методы

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

Цитата(Deja_Vu @  10.4.2013,  13:54 Найти цитируемый пост)
К тому же, я поддерживаю использование getter/setter т.к. они очень полезны при рефакторинге. А вот уже нужда в рефакторинге возникает, когда вам нужно сложную функцию вставить в getter/setter. 

вы удивитесь, но если есть getter и вы его используете повсюду, то весь рефакторинг будет заключаться в написании нового тела getter'a
кстати, я не настаиваю, но есть мнение, что рефакторинг - это устранение бардака. так может его не создавать?

Цитата(Deja_Vu @  10.4.2013,  13:54 Найти цитируемый пост)
При верном выделении абстракций - проще. И даже длинный backtrace вам покажет по какому пути пошлоа логика, что бы сломаться.

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

но и Fortop поддерживаю: мельчить не надо. и вообще не надо фанатизма  smile 

 smile 
Цитата(Deja_Vu @  10.4.2013,  13:54 Найти цитируемый пост)
Браузер упал, все что писал - пропало

ну вы там поаккуратней, так и важное потерять можно. возьмите хороший браузер, не падающий: ie, mozilla, chrome.

Автор: krundetz 10.4.2013, 17:03
Цитата(baldina @  10.4.2013,  14:28 Найти цитируемый пост)
так может его не создавать?

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

Для себя я выделяю несколько этапов рефакторинга:
1. на этапе проектирования
2. после первой реализации
3. после длительного практического использования

Причем только 2 пункт обязательный при любом уровне задачи.

Автор: baldina 10.4.2013, 18:12
Цитата(Deja_Vu @  10.4.2013,  13:54 Найти цитируемый пост)
Плохо, потому что мне нужно полностью просмотреть код класса, что бы понять, как связаны pre, post и run

в вашем случае код класса смотреть не надо? что-то я не вижу в этом смысле отличий. кстати, что бы понять логику работы класса, изучают документацию и интерфейс. в документации, естественно, будет описана схема pre->run->post.
то, что вы говорите, конечно, имеет место - и понятность, и тесты, и отладка. но выбор правильной степени детализации зависит от задачи, требует вкуса и меры. 
для данного класса из 5 строк деление это чересчур, не находите?

Цитата(Deja_Vu @  10.4.2013,  13:54 Найти цитируемый пост)
Классы меньше. Понять логику работы проще.

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

если у вас в уровне абстракции есть public метод и в нём используется protected метода, а так же есть abstract метод - то это ошибка 

получается, вы мне навязываете некие формальные правила нормализации. в результате мой код становится более пухлым, реальной декомпозиции не происходит, реальных дивидендов от этого я не получу. (сравните с нормализацией БД: НФБК, 5НФ, 6НФ, умышленная денормализация).
итого: то что вы проповедуете - форма, прием, но не закон.

Цитата(krundetz @  10.4.2013,  17:03 Найти цитируемый пост)
не получиться, если система разрабатывается долгое время и в количестве людей больше чем 1

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

Deja_Vu, я не против всех этих принципов, я против ортодоксального их использования, я за понимание причин и следствий вместо слепого следования авторитетам.

Автор: krundetz 11.4.2013, 16:48
Цитата(baldina @  10.4.2013,  18:12 Найти цитируемый пост)
и все же, переделывание тела одной функции, это не рефакторинг.

 smile , про функцию вы говорите, я говорю про систему(программный продукт) в целом
Цитата(baldina @  10.4.2013,  18:12 Найти цитируемый пост)
а если система заранее проектируется с расчетом на рефакторинг в практически неизбежном случае её изменения, то я не знаю... это уже ООП головного мозга.

Дело в том что на проектирование тоже выделяется конечный срок и кроме этого его качество будет зависеть еще от:
1. Полноты полученных данных по решаемой проблематике.
2. Качества проработки ТЗ.
3. Опытности проектировщика.
Отсюда вытекает, что проект не может быть идеальным, а следовательно необходимо получить как можно раньше полноценный прототип, чтобы иметь обратную связь. И уже его можно рефакторить, в соответствие с этой обратной связью.

Автор: baldina 11.4.2013, 20:21
видимо мы по-разному понимаем рефакторинг. если ТЗ уточняется, то учет новых требований я считаю процессом внесения изменений с целью изменения поведения и внешнего вида
Цитата

Рефа́кторинг (англ. refactoring) или реорганизация кода  — процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы

чувствуете разницу?
к тому же я сильно сомневаюсь, что неопытный проектировщик сможет после первой итерации значительно улучшить свой проект

Автор: Fortop 12.4.2013, 03:38
Цитата(baldina @  11.4.2013,  20:21 Найти цитируемый пост)
видимо мы по-разному понимаем рефакторинг. если ТЗ уточняется, то учет новых требований я считаю процессом внесения изменений с целью изменения поведения и внешнего вида

Обычно как раз уточнения ТЗ и попытки реализовать их в коде вызывают рефакторинг.
Т.е. вобщем-то это разные вещи, но рефакторить без необходимости исключительно ради любви к искусству.... я бы не стал.

Автор: krundetz 12.4.2013, 11:01
Цитата(baldina @  11.4.2013,  20:21 Найти цитируемый пост)
к тому же я сильно сомневаюсь, что неопытный проектировщик сможет после первой итерации значительно улучшить свой проект 

для этого существует куратор с большим опытом.

Цитата(baldina @  11.4.2013,  20:21 Найти цитируемый пост)
видимо мы по-разному понимаем рефакторинг. если ТЗ уточняется, то учет новых требований я считаю процессом внесения изменений с целью изменения поведения и внешнего вида

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


Автор: baldina 12.4.2013, 11:46
Цитата(krundetz @  12.4.2013,  11:01 Найти цитируемый пост)
все переплетено

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)