"PHP" / Говнокод #18830 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
<?if (strlen($prod['img'])>0):?>						
	<img src="<?=URL::site()?>resize/resizer.php?type=photos&width=260&height=210&method=crop&image=<?=$prod['img']?>"/></a>						
<?else:?>
	<img src="<?=URL::site()?>resize/resizer.php?type=catalog&width=260&height=210&method=crop&image=nophoto.jpg"/></a>
<?endif?>

Вы ещё не знаете, как использовать ООП для генерации URL? Тогда мы идём к вам!

Запостил: UncaughtException UncaughtException, (Updated )

Комментарии (17) RSS

    • Среди пыхомакак бытует поверье, что если перед говнофункцией написать "public static", то код автоматически становится объектно-ориентированным.
      Ответить
      • URL:: — это не объект, а в некотором роде... пространство имён. ООП тут и не пахнет.

        Для тру-ООП нужно:
        1. Собирать ссылку с помощью http-build-query, передавая ей объект, публичные поля которого содержат type, width, height, method, image.

        См.: http://php.net/manual/ru/function.http-build-query.php

        2. Вместо явного ветвления внутри функции вызывать метод одного из двух классов, унаследованных от одного абстрактного или реализующих один интерфейс. Метод первого класса должен передавать type=photos и заданный image, а метод второго — type=catalog и image=nophoto.jpg.

        3. С учётом первого пункта даже два класса не понадобятся: всё можно инициализировать уже в конструкторе.

        Кажется, я учу чему-то плохому...
        Ответить
        • Вы вдохновили меня вернуться к "проекту" в котором встретилось сиё творение и реализовать столь божественный замысел. Да прибудет с вами ООП. Аминь.
          Ответить
        • А ведь можно сделать threaded code, как в форте, на виртуальных методах! И вообще не пользоваться устаревшими ифами и форами...
          Ответить
          • > И вообще не пользоваться устаревшими ифами и форами
            Так вроде в smalltalk ифов и форов как таковых нет - ветвление делается через посыл объекту boolean двух лямбд: ifFalse и ifTrue, и объект по своему стейту понимает, что вызвать
            aBoolean
            	ifTrue: [someCode]
            	ifFalse: [otherCode]
            А for - через внутренний итератор
            1 to: 20 do: [:x | x printNl ]
            Ответить
          • Шитый код и без ООП можно сделать:
            $methodTable = array(
              false => function($image) {return array ('type' => 'photos', 'image' => $image); },
              true => function($image) {return array ('type' => 'catalog', 'image' => 'nophoto.jpg'); }
            );
            
            $properties = $methodTable[strlen($prod['img'])>0]($prod['img']);
            Ответить
              • А теперь немного чОрной магии:
                <?php
                class AbstractPhoto {
                  public $width = 260;
                  public $height = 210;
                  public $method = 'crop';
                  public $type = 'unknown';
                  public $image = 'nophoto.jpg';
                  public function __construct($image) {
                    $this->type = strtolower(get_class($this));
                  }
                }
                
                class Photos extends AbstractPhoto {
                  public function __construct($image) {
                    parent::__construct($image);
                    $this->image = $image;
                  }
                }
                
                class Catalog extends AbstractPhoto {
                }
                
                class PseudoArray implements ArrayAccess  {
                  private $classTable = array (false => 'Photos', true => 'Catalog');
                  public function offsetGet ($offset) {
                    $class = $this->classTable[strlen($offset)>0];
                    return new $class($offset);
                  }
                  public function offsetExists ($offset) {return true;}
                  public function offsetSet ($offset, $value) {}
                  public function offsetUnset ($offset) {}
                 }
                
                
                $properties = new PseudoArray();
                
                var_dump($properties['']);
                
                var_dump($properties['ololo.jpg']);


                http://ideone.com/1P60V1
                Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8