[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Покритикуйте мою гостевую книгу на MVC
WhiteKnight
В предыдущей теме я спрашивал какой метод лучше выбрать для изучения PHP.
В общем решил прислушаться и объеденить два метода.
Практика и Матчасть. smile.gif

Моя попытка реализовать Model Controller View
Сделал гостевую книгу на основе этой модели. smile.gif
Прошу по критиковать.

Рабочий вариант тут: GB mvc



view.php
HTML
<html>
<head>
<title>GB MVC</title>
<meta http-equiv='content-type' content='text/html; charset=utf-8'/>
<meta name='description' content='#'/>
<meta name='keyword' content="#"/>
<link rel='stylesheet' href='style.css' type='text/css' media='screen'/>
</head>
<body>
<!-- show -->

<!-- BEGIN book_element -->
<?php echo $book; ?>
<!-- END book_element -->
<hr>
<!-- action form -->
<form action = "controller.php" method = "POST">
<strong>Имя</strong>: <input type = "text" name = "name" class="sub-input" /><br/>
<strong>Сообщение</strong>:<br/>
<textarea name = "msg" cols = "30" rows = "10" class="sub-input" >

</textarea><br/>
<input type = "submit" value="Отправить" name = "ok" class="sub-input" /><br/>
</form>
</body>
</html>

controller.php
PHP
<?php
    
    
/**
     * Controller.php 
     * Отвечает за бизнес логику. Является посредником между Моделью и Шаблоном
     *  
     * @author Sergey
     *
     */
    
    
// загружаю молель
    require_once "model.php";
    
    
    $errors 
= array();
    
    
// Бизнес логика гоствой книги - генератор гостевой книги
    if (isset($_POST['ok'])) {
        validate_data();
        
        if 
(count($errors)>0) {
            $show = true;
        } else {
            add_data('data.txt');
            $show = true;
        }
     } else {
        $show = true;
     }
    
    
// Вывести все на екран - шаблон
    if ($show == true) {
        display_data();
        display_errors();
    }

model.php
PHP
<?php
    
    
/**
     * model.php 
     * Этот модуль представляет библеотеку функций 
     *   
     * @author Sergey
     *
     */
    
    
/**
     * load_data
     * Загружает файл с данными 
     */
    function load_data($file_name) {
        $handle =  file_get_contents($file_name);        
        return     $handle
;
    }
    
    
/**
     * add_data
     * Формирует вид сообщения и сохраняет его
     */
    function add_data($file_name) {
    
        $name 
= $_POST['name'];
        $msg = $_POST['msg'];
    
        $d 
= date("H:i:s").' / '.date("m.d.y");
        $current = "::{$name}::{$d}<br/>{$msg}<br/>";
        
        $handle 
= fopen($file_name,"a+");
        fputs($handle,$current);
        fclose($handle);
        
        header
('location: '. $_SERVER['PHP_SELF'] .'?rnd='. time());
    }
    
    
/**
     * validate_data
     * Проверяет на правильность введенных данных
     */
    function validate_data() {
        global $errors;
        
        if 
(trim($_POST['name']) == '') $errors[] = 'Вы не заполнили поле имя';
        if ($_POST['msg'] == '')$errors[] = 'Вы не заполнили поле сообщение';
    }
    
    
/**
     * display_errors
     * Отображает список ошибок
     */
    function display_errors() {
        global $errors;
        
        foreach 
($errors as $error) {
            echo '<b>-</b> <font color="red">'.$error.'</font><br>';
        }
    }
    
    
/**
     * display_data
     * Отображает сам шаблон
     */
    function display_data() {
        $book = load_data('data.txt');
        include "view.php";
    }


p.s.
Как делать свернутый текст ?



Спустя 21 минута, 29 секунд (13.10.2009 - 00:11) twin написал(а):
1. Вот так не делай, курсор на начало не ставится
HTML
<textarea name = "msg" cols = "30" rows = "10" class="sub-input" >

</textarea>

2. Файл блокировать надо, мало ли что, да и привычка хорошая.
3. Вот это не есть гут, тысячу раз писано про инициализацию
PHP
if (trim($_POST['name']) == '')

4. Не совсем ясно, зачем имя в двоеточиях...

Но вообще эта пять. Если ты только начал, то начало более чем хорошее получилось.
Успехов. smile.gif

Спустя 6 минут, 8 секунд (13.10.2009 - 00:17) WhiteKnight написал(а):
twin
По поводу блокировки, спасибо что сказали, а то мало ли два одновременно нажмут отправить и походу все сотрется.

Цитата
3. Вот это не есть гут, тысячу раз писано про инициализацию
PHP
if (trim($_POST['name']) == '')

ок. Пересмотрю smile.gif

Цитата
Вот так не делай, курсор на начало не ставится
HTML
<textarea name = "msg" cols = "30" rows = "10" class="sub-input" >

</textarea>


cols = "30" rows = "10" Это же задает размер тестового поля. По другому то я не задам его.
Или вы что то другое имели ввиду ?

Спустя 10 минут, 13 секунд (13.10.2009 - 00:27) twin написал(а):
Цитата
Или вы что то другое имели ввиду ?

Перенос строки. Вот так только можно:
HTML
<textarea name = "msg" cols = "30" rows = "10" class="sub-input" ></textarea>

Спустя 51 секунда (13.10.2009 - 00:28) glock18 написал(а):
Первый раз вижу mvc сделанный на процедурах smile.gif
Итак:
1. view ты смог выделить хорошо. уже что-то smile.gif
2. вывод ошибок делается в модели (не гуд, но простительно).
3. глобальная переменная - плохо.
4. процедурный подход меня удручает smile.gif mvc и процедуры не совместимы. твой пример в общем и целом соответствует mvc, но я боюсь представить на какие ухищрения придется идти, если нужно будет использовать 2, 5 или больше моделей со схожим функционалом.

5. вызов view должен производиться из контроллера, а не модели.

mvc подразумевает примерно следующее:
1. контроллер получает управление.
2. обращается к моделям за данными.
3. полученные данные отдает вьюхе, если нужно.

вообще, все неплохо, но я бы с большим интересом посмотрел на это, реализованное в классах smile.gif

Спустя 3 минуты, 25 секунд (13.10.2009 - 00:31) WhiteKnight написал(а):
twin
Цитата
3. Вот это не есть гут, тысячу раз писано про инициализацию


Это надо сделать вот так? Или я протупил и надо сделать совсем иначе ?
PHP
$name '';
$name =  trim($_POST['name']);
if (
$name == ''$errors[] = 'Вы не заполнили поле имя';

Спустя 5 секунд (13.10.2009 - 00:31) glock18 написал(а):
Цитата
cols = "30" rows = "10" Это же задает размер тестового поля. По другому то я не задам его.


спасибо css, задать размер можно. эти два атрибута остаются обязательными, но ты можешь задать размеры использовав width и height. собственно ими и нужно задавать, потому что размер одного символа в разных браузерах может достаточно заметно отличаться. лично я обычно пишу эти атрибуты только ради стандарта - надо, так надо smile.gif а размер - ширина и высота всегда.

Спустя 7 минут, 49 секунд (13.10.2009 - 00:39) twin написал(а):
Цитата
mvc и процедуры не совместимы.

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

Меня давно подмывает сравнительный анализ устроить. Что же всетаки эффективнее ООП или процедурка. Со всех сторон. С точки зрения разработки, скорости, ресурсоемкости, прозрачности и так далее.
Именно для повседневных задач, без выкрутасов. Буду посвободнее, устроим.

И еще
Цитата
3. глобальная переменная - плохо.

Эт от чего? Глобальная переменная хорошо и очень удобно. Другой вопрос, что она может повредить безолаберности, так она в этом совсем не виновата. biggrin.gif

Цитата
Это надо сделать вот так?

Нет. Не так. Вот так.
PHP
$name =  !empty($_POST['name'])?trim($_POST['name']):NULL;

Спустя 2 минуты, 35 секунд (13.10.2009 - 00:42) WhiteKnight написал(а):
glock18
Цитата
вызов view должен производиться из контроллера, а не модели.

Было так изначально, но выяснилось что оно так не работает сделал как процедуру, заработало.. О! вот сейчас обратно вернул и работает smile.gif

// Вывести все на экран - шаблон
if ($show == true) {
$book = load_data('data.txt');
include "view.php";
display_errors();
}

Цитата
вообще, все неплохо, но я бы с большим интересом посмотрел на это, реализованное в классах


До ООП в PHP я пока не дошел, так в вкратце представляю.
Просто я сейчас взял тему читать: шаблонизаторы
там на первом месте MVC потом еще пассивный шаблонизатор HTML_Template_IT из бибилиотеки PEAR Потом хотелось бы еще и XTemplate поюзать а в итоге перейти на Smarty.

Пока незнаю применяется ли MVC в остальных шаблонизаторах, как в пасивных так и в активных.

Спустя 9 часов, 9 минут, 35 секунд (13.10.2009 - 09:51) glock18 написал(а):
mvc точно не применяется в smarty. и я почти уверен, что не применяется ни в одном шаблонном движке. шаблонный движок может воплощать view mvc, не более.

Цитата
Глобальная переменная хорошо и очень удобно

twin, чему учишь? Глобальные переменные это ошибка/привычка, от которой нужно избавляться в самом начале.

не будем сейчас устраивать очередной холивар по поводу ооп-неооп.

WhiteKnight
mvc - это шаблон (или паттерн) проектирования. рядом с шаблонизаторами рядом не стоит по идее. что за книгу читаешь? smile.gif

Спустя 3 минуты, 19 секунд (13.10.2009 - 09:55) Mozzi написал(а):
Цитата (twin @ 12.10.2009 - 21:39)
Цитата
mvc и процедуры не совместимы.

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

huh.gif twin,
Позвольте мне с вами не согласится.
Простые вещи надо делать просто. Вы можете мне тут возразить, что даже в простых вещах надо закладываться на усложнение. Но тогда какой смысл закладываться на усложнение, заведомо проигрышным вариантом? А я считаю, что MVC, показывает свою мощь именно в ОО реализации.
Почему я так считаю, потому что я как и все кто используют ООП прибегаю к:
наследованию - нигде не дублирую то что общно (ну и куча деталей ещё);
инкапсуляции - специфика работы той или иной разновидности определённого блока, сокрыта и не влияет на способ использования;
полиморфизм - тонкий тюнинг, эдакое undo предоставленного наследованием функционала.

А теперь что у нас есть в MVC.

Нам необходимо, 100% иметь несколько видов отображений (native templates, smarty, xslt и т.д.) и иногда замену одного на другое во время выполнения (например когда в smarty шаблон, дополняется данными сформированными XSLT шаблоном из какого-нибудь мудрёного SOAP запроса).

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

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

Я выразил всего лишь свою точку зрения, как бы обозрев со своей колокольни - зачем я использую MVC, и почему только с ООП cool.gif

Спустя 2 часа, 48 минут, 50 секунд (13.10.2009 - 12:44) twin написал(а):
Цитата
Простые вещи надо делать просто. Вы можете мне тут возразить, что даже в простых вещах надо закладываться на усложнение.

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

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

Если чесно, лично мне вообще не приходилось видеть такой проект, который не может работать не по схеме MVC + ООП. Хотя работает куча моих сайтов, у которых около 1000000 посещений в сутки и которые состоят из 20-30 разделов с кучей своих страниц в каждом.
Я видел аналоги на ООП, так они ни на сколько не проще, я бы сказал что на много сложнее.

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

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

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

Цитата
twin, чему учишь? Глобальные переменные это ошибка/привычка, от которой нужно избавляться в самом начале.

да чем же они тебя так обидели то? Какая же это ошибка? Так можно от половины возможностей ООП отказаться, посчитав дурным тоном... Допустим то этой конструкции : $$var, потому что кто то где то сказал, что это плохо. Или от применения eval(), проникшись параноидальным настроением...
Все хорошо на своих местах.

Спустя 21 минута, 10 секунд (13.10.2009 - 13:05) glock18 написал(а):
twin
Думаю, нам с тобой не избежать батла на почве ооп и процедурки smile.gif про глобальные переменные не буду говорить больше. вообще предполагается использование параметров вместо глобальных переменных. уж поверьте мне "испорченному" программированием на C/C++. есть, я не сомневаюсь, кучи ресурсов, где все это расписано. для меня же это уже давно кажется очевидным, что я как-то полагал это общепринятой истиной.

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

Спустя 4 минуты, 31 секунда (13.10.2009 - 13:09) WhiteKnight написал(а):
glock18
Цитата
что за книгу читаешь?

Котеров PHP 5 В подлиннике
Котеров PHP 5 второе издание

Во втором издании тоже есть такая тема.
Не понимаю зачем продают две одинаковых книги, только названия разные wink.gif


Спустя 8 минут, 48 секунд (13.10.2009 - 13:18) glock18 написал(а):
WhiteKnight
это я спросил к тому, что говорить о шаблонах проектирования и шаблонизаторах в одном контексте может быть неверно. зависит от контекста, конечно, но в 95% случаев между ними ничего общего smile.gif

Спустя 4 минуты, 56 секунд (13.10.2009 - 13:23) twin написал(а):
Цитата
вообще предполагается использование параметров вместо глобальных переменных.

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

Спустя 3 минуты, 38 секунд (13.10.2009 - 13:27) WhiteKnight написал(а):
MVC - это модель представления данных (разделяет логику,отображение,API) ?

Шаблон типа SMARTY - это шаблон со встроено логикой {for} ....

Я могу ошибаться, я до Smarty еще не дошел.

Поправьте меня если я что то сказал не правильно.

Спустя 11 минут, 6 секунд (13.10.2009 - 13:38) glock18 написал(а):
WhiteKnight
нуу, трудно по двум словам понять, правильно или нет. формально вроде как правильно.


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

Спустя 14 минут, 20 секунд (13.10.2009 - 13:52) Joker написал(а):
уже не работает))) вернее не пашет у кого включон js)

Спустя 7 минут, 28 секунд (13.10.2009 - 13:59) WhiteKnight написал(а):
Joker
залил новый пустой data.txt работает wink.gif

Спустя 2 минуты, 19 секунд (13.10.2009 - 14:02) Joker написал(а):
Ты ошибку исправь... а не новый заливай... опять не пашет....

перед выводом обрабатывай всё функцией
PHP
htmlspecialchars("вывод");

Спустя 11 минут, 31 секунда (13.10.2009 - 14:13) WhiteKnight написал(а):
не получается заблокировать html теги.
может это htmlspecialchars не делается а надо по другому делать. ?

новый model.php
PHP
<?php
    
    
/**
     * model.php 
     * Этот модуль представляет библеотеку функций 
     *   
     * @author Sergey
     *
     */
    
    /**
     * load_data
     * Загружает файл с данными 
     */
    
function load_data($file_name) {
        
$handle =  file_get_contents($file_name);
        
htmlspecialchars($handle);
        return     
$handle;
    }
    
    
/**
     * add_data
     * Формирует вид сообщения и сохраняет его
     */
    
function add_data($file_name) {
    
        
$name $_POST['name'];
        
$msg $_POST['msg'];
    
        
$d date("H:i:s").' / '.date("m.d.y");
        
$current "::{$name}::{$d}<br/>{$msg}<br/><br/>";
        
htmlspecialchars($current);
        
$handle fopen($file_name,"a+");
        
flock($handle,LOCK_EX);
        
fputs($handle,$current);
        
flock($handleLOCK_UN);
        
fclose($handle);
        
        @
header('location: '$_SERVER['PHP_SELF'] .'?rnd='time());
    }
    
    
/**
     * validate_data
     * Проверяет на правильность введенных данных
     */
    
function validate_data() {
        global 
$errors;
        
$name =  !empty($_POST['name'])?trim($_POST['name']):NULL;
        if (
$name == ''$errors[] = 'Вы не заполнили поле имя';
        if (
$_POST['msg'] == '')$errors[] = 'Вы не заполнили поле сообщение';
    }
    
    
/**
     * display_errors
     * Отображает список ошибок
     */
    
function display_errors() {
        global 
$errors;
        
        foreach (
$errors as $error) {
            echo 
'<b>-</b> <font color="red">'.$error.'</font><br>';
        }
    }
    
    
/**
     * display_data
     * Отображает сам шаблон
     */
    
function display_data() {
        
$book load_data('data.txt');
        include 
"view.php";
    }
    

Спустя 42 секунды (13.10.2009 - 14:14) Joker написал(а):
PHP
function load_data($file_name) {
        
$handle =  file_get_contents($file_name);
        
$handle htmlspecialchars($handle);
        return     
$handle;
    }

Спустя 6 минут, 16 секунд (13.10.2009 - 14:20) WhiteKnight написал(а):
все что делает htmlspecialchars так это применить теги

$test = "<b>hello</b>";
echo htmlspecialchars($test);

hello

$test = "<b>hello</b>";
echo $test;

<b>hello</b>

Спустя 3 минуты, 1 секунда (13.10.2009 - 14:23) WhiteKnight написал(а):
Все исправил.
Теперь теги не действуют
Правда теперь все biggrin.gif

PHP
function load_data($file_name) {
        $handle =  file_get_contents($file_name);        
        return     htmlspecialchars
($handle);
    }


вообщем на компе вот такое теперь


Код
 ::55555::07:04:21 / 10.13.09<br/> <br/><br/>::<script>alert(\'alarm\');</script>::07:04:55 / 10.13.09<br/> <br/><br/>:: JetBrains WebIDE — публичная сборка #500::07:05:10 / 10.13.09<br/>Квест «идеальное IDE для PHP» продолжается :) За прошедшую с предыдущей сборки неделю стали доступны две наиболее востребованые фичи — PHPUnit и FTP, ну и конечно мы постарались исправить как можно больше ошибок. IDE — начальная версия поддержки удаленных хостов — пока что только FTP upload. (Планируется: открытие удаленного проекта, автосинхронизация, SFTP/SSL/всякие cloud storage). Находится в меню Settings — Deploy&Run. — Новые удобные закладки (F11) PHP — начальная версия поддержки PHPUnit (пока только локальный запуск) — добавлено выведение типов для переменной в «foreach(...)», элемента массива «array[...]» и тернарного оператора \"?:\" — добавлены поиск использований (Ctrl-Alt-F7) и переименование (Shift-F6) для глобальных переменных — исправлены поиск использований и переименование для статических членов класса — исправлены различные ошибки форматирования кода и комментариев<br/><br/>::I am::07:05:33 / 10.13.09<br/>Its work :)<br/><br/>::<form> <input type=\"button\" onclick= \"alert(\'Are you sure you want to give us the deed to your house?\')\" value=\"Confirmation Alert\"> </form>::07:05:57 / 10.13.09<br/> <br/><br/>::Ы::07:07:42 / 10.13.09<br/><inpur type=\'text\' value=\'ку-ку\'/> <br/><br/>::S::07:08:45 / 10.13.09<br/><inpur type=text value=ok /> <br/><br/>::<h1>Joker<h1>::07:12:01 / 10.13.09<br/><h1>Joker The Best</h1><br/><br/>::I::07:12:33 / 10.13.09<br/>hello <br/><br/>::hello::07:22:28 / 10.13.09<br/><h1>Hello</h1><br/><br/>::hello::14:27:57 / 10.13.09<br/><form> <input> </form><br/><br/>


но на хостинге почему то все по прежнему dry.gif
----------
теперь на хостинге обновилось.


Спустя 6 минут, 20 секунд (13.10.2009 - 14:30) Joker написал(а):
Замени эту функцию и очисти файл data.txt будет норм работать.
PHP
function add_data($file_name) {
    
        $name 
= htmlspecialchars($_POST['name']);
        $msg = htmlspecialchars($_POST['msg']);
    
        $d 
= date("H:i:s").' / '.date("m.d.y");
        $current = "::{$name}::{$d}<br/>{$msg}<br/><br/>";
        htmlspecialchars($current);
        $handle = fopen($file_name,"a+");
        flock($handle,LOCK_EX);
        fputs($handle,$current);
        flock($handle, LOCK_UN);
        fclose($handle);
        
        
@header('location: '. $_SERVER['PHP_SELF'] .'?rnd='. time());
    }


а из этой функции убери обработку тобишь

PHP
function load_data($file_name)
{
        return file_get_contents($file_name);
}

Спустя 6 минут, 54 секунды (13.10.2009 - 14:37) WhiteKnight написал(а):
Joker
Уже лучше smile.gif

Спустя 2 минуты, 21 секунда (13.10.2009 - 14:39) Joker написал(а):
скажи зачем в гете переменная rnd ???

Спустя 7 минут, 23 секунды (13.10.2009 - 14:46) WhiteKnight написал(а):
Цитата (Joker @ 13.10.2009 - 11:39)
скажи зачем в гете переменная rnd ???

Спустя 2 минуты, 49 секунд (13.10.2009 - 14:49) twin написал(а):
Цитата
не могу представить ни одного пока примера. может кинешь один для обмозгования? ну вот с рекурсией, и когда с ней нельзя глобальную переменную использовать.

Ну вот с оберткой допустим, которую я недавно показывал. Можно попутно подсчитать количество запросов на странице.
PHP
$count 0;  
    function 
query($sql$file$line)
    {
        global 
$count;
        
$res mysql_query($sqlCONNECT);
  
        if(
$res)
        {
            ++
$count;            
            return 
$res;
        }
        else
        {
            die(
'<b style="color:red">Musql error: </b>'mysql_error() .'<br><b>Query: </b>'$sql .'<br>
<b>File: </b>'
$file .'<br><b>Line: </b>'$line);
            
header('location: error.html');
            exit;
        }
    }


Так же и с рекурсией. Тот же счетчик. Параметром его не передать, да и не вывести показания просто так. Вообще много чего можно. Ты просто привык к своим $this-> а это практически тоже самое.

Спустя 1 час, 11 минут, 36 секунд (13.10.2009 - 16:01) glock18 написал(а):
Цитата
Так же и с рекурсией. Тот же счетчик. Параметром его не передать, да и не вывести показания просто так. Вообще много чего можно. Ты просто привык к своим $this-> а это практически тоже самое.


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

с глобальными мы будем вводить $countDb, $countFile и прочие ужасные вещи.

с параметром:
PHP
$count 0;  
    function 
query($sql$file$line, &$count)
    {
        
$res mysql_query($sqlCONNECT);
  
        if(
$res)
        {
            ++
$count;            
            return 
$res;
        }
        else
        {
            die(
'<b style=\"color:red\">Musql error: </b>'mysql_error() .'<br><b>Query: </b>'$sql .'<br>
<b>File: </b>'
$file .'<br><b>Line: </b>'$line);
            
header('location: error.html');
            exit;
        }
    }


Цитата
Ты просто привык к своим $this-> а это практически тоже самое

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

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

Db::$count
File::$count

если пойти дальше и абстрагироваться от конкретного класса, то со счетчиком можно организовать работу на абстрактном уровне, не ориентируясь на емя переменной ($count, $countFile, etc).

Спустя 25 минут, 42 секунды (13.10.2009 - 16:26) twin написал(а):
Ну так вот в этом и всё различие философий.
Ты видишь приложение, как одну большую программу с общей областью видимости, и по этому тебе приходится локализовать их (области) посредством классов. Что бы не заблудиться и не попутать чего нибудь.

Конечно, если смотреть на вещи с твоей колокольни, то так и есть, глобальная переменная может навредить.

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

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

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





Спустя 21 минута, 42 секунды (13.10.2009 - 16:48) glock18 написал(а):
Цитата
А ты незадуряясь грузишь сразу всё, нужно это или нет. А потом, чтобы работать с необходимыми на данный момент данными, начинаешь маневрировать вызовами и обращениями.
По этому у тебя и возникают потребности в абстрактных уровнях (чего мне совершенно не требуется). И чем дальше, тем больше. Все это на самом деле сильно путает следы и ухудшает читабельность (на уровне функционала, не синтаксиса).


откуда такие выводы? НИКОГДА не гружу все - всегда только то, что нужно и ничего лишнего.

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


представляю как представляю - естественно могу ошибаться.

Цитата
По этому у тебя и возникают потребности в абстрактных уровнях (чего мне совершенно не требуется).


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

Цитата
Я динамически формирую скрипт, в котором область видимости не затрагивает другие сценарии


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

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

Спустя 1 час, 20 минут, 17 секунд (13.10.2009 - 18:08) twin написал(а):
Цитата
НИКОГДА не гружу все - всегда только то, что нужно и ничего лишнего.

А вот и неправда. Ты в любом случае грузишь весь класс, все методы тебе нужны, или нет.
Вспомни ваш с Семеном спич про валидатор. Ты пихаешь все в кучу, обозначаешь для этого область видимости (локализуешь участок программы) и потом вытаскиваешь то, что нужно. Из этого участка. То есть из класса, который все равно загружен весь.
Я хоть убей не вижу функционального приемущества этого кода:
PHP
$valid = new Validator();
$error = $valid->checkNum($_POST['phone']);

перед этим
PHP
$error = !is_numeric($_POST['phone'])?$errors['phone']:NULL;


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

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

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

Поехали дальше. Если у тебя на странице несколько разных проверок и обработок, ты грузишь несколько классов, выдергивая из каждого по одному - два метода. Допустим при авторизации ты вызываешь класс User(), методы которого определяют его идентификатор, имя, возраст и еще кучу параметров. А нужен всего навсего его телефон.
Ты загружаешь весь класс, со всеми его методами. И в итоге у тебя уже гора излишнего функционала, который присутствует в данном сценарии и который совсем невостребован. Так вот, в том месте, где это все собирается в кучу (а там допустим 10-15 методов и каждый из разного класса) у тебя только вывод. То есть вызов методов. А чтоб получить общую картину того, что происходит в данный момент, ты должен перелопатить все эти классы (а они как правило в разных файлах) и (в голове!!!) представить себе текущий сценарий.

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

Я формирую функционал непосредственно в обработчике. Контроллере, если угодно. Используя вспомогательный функционал только там, где он действительно оправдан. Динамически подключая необходимые библиотеки. А если есть возможность обойтись штатными процедурами, не ломаю голову над тем, как и куда их упрятать, что бы не дай Бог не нарушить концепцию. Просто применяю их прямо там, где им и место.

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

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

Если чесно, я ничего не понял, что именно подключить и чего подсчитать?

Спустя 31 минута, 53 секунды (13.10.2009 - 18:40) HardWoman написал(а):
КАк эту темку добавить в избранное, чтоб не потерять?

Спустя 3 минуты, 8 секунд (13.10.2009 - 18:43) glock18 написал(а):
ладно, закроем тему. твоя трактовка ооп далека от того, что с ним нужно делать. так же, возможно, ошибаюсь и я, пытаясь понять твой стиль.

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

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

ты меня не переубедил, я тебя - нет. просто предлагаю остановиться.

Спустя 3 минуты, 50 секунд (13.10.2009 - 18:47) twin написал(а):
А, кстати, проглядел. Про глобальную то. По ссылке конечно можно, но ключевое слово было "добавить". То есть так можно организовать счетчик, не прописывая аргумент в каждый вызов функции. Что согласись несколько удобнее. smile.gif
Да и не вижу смысла перегружать код только потому, что кто то сказал, что глобальные переменные - зло.

Спустя 5 минут, 19 секунд (13.10.2009 - 18:53) twin написал(а):
Цитата
только не говори, Твин, что у тебя "методы" доступа к "телефону юзера" и его "имени" лежат в разных файлах, и подключается всегда только тот, который нужен. и оба подключаются только, если их оба и нужно использовать. ну что за детский сад - сплошь доводы "лишняя подключенная функция".

А я и не говорил. Я говорил о том, что я его там же и определяю, где он мне нужен. И не бегаю в класс. У меня страницу формирует один файл, а общий функционал подключается при надобности.
И доводы не те у меня. Это ответ был на то, что ты сказал:
Цитата
НИКОГДА не гружу все - всегда только то, что нужно и ничего лишнего.
А я думаю - всегда.
А довод у меня был и остается один - ты усложняешь все, пытаясь упростить. Сам того не замечая. Сначала набуробить все в кучу, потом разгребать акселераторами. Хотя можно сразу сделать легко и просто. smile.gif

Лан, всё. Я потом все равно сравнительный анализ сделаю.

Спустя 39 минут, 17 секунд (13.10.2009 - 19:32) glock18 написал(а):
Цитата
А довод у меня был и остается один - ты усложняешь все, пытаясь упростить. Сам того не замечая.


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

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

Спустя 20 минут, 19 секунд (13.10.2009 - 19:52) twin написал(а):
А я вот воспитан на радиотехнике, по этому полиформизм мне претит как таковой. Мне гораздо проще и интереснее начинать каждый раз все с нуля, используя прошлые наработки, чем пытаться создать что то такое блольшое и всеобъемлящее...

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

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

Спустя 23 часа, 24 минуты, 35 секунд (14.10.2009 - 19:17) WhiteKnight написал(а):
Что бы не создавать еще одну тему, а то начнут меня ругать. Отпишусь я тут.
Значит попробовал переписать книгу с компонентным подходом. Немного вышел за рамки гостевой книги, это что то вроде блога wink.gif версии 0.0001 wink.gif

На "главной" странице отображается содержимое "блога" файла в котором хранится вся информация.
Добавляется она из админки. Пока что админка открыта для всех. Не реализовано пока что авторизация, надо наверно будет потом с сесиями повозится что бы ее сделать wink.gif
Раздел "статьи" пустой, вернее его не существует, поэтому будет проявляться ожидаемая ошибка.

Структура
user posted image

Развернутая структура

user posted image

Рабочий вариант: BlogE

Архив с исходником: components.zip

Спустя 19 дней, 4 часа, 30 минут, 31 секунда (4.11.2009 - 00:47) Dron19 написал(а):
Вам нужно сообщения выводить в таблице, желательно белым цветом и с закругленной рамкой, текст сделать по-меньше и цветом #424242
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.