All streams
Search
Write a publication
Pull to refresh
44
0
sectus @sectus

User

Send message
Без первоисточников читать не интересно.

Я думаю, что были бы полезны из статьи на соседние Числа и близкие по теме. Ну и тэги.
Что-то я не ощутил разницы между trigger_error() и throw new RuntimeException(). И там, и там идёт прерывание кода(нотисы не в счёт, с ними разговор короткий). И там, и там идёт последующая обработка: показать страницу с ошибкой, записать в лог, уведомить заинтересованных. В чём всё-таки разница?
Комбинирование флагов — это так, бесплатное приложение к подходу. Основная идея в том, чтобы использовать битовые маски как битовые маски, а не как массив.

define('FLAG_CIRCULAR', 128);
define('FLAG_PUBLIC', 256);

class some
    {
    const FLAG_BLOCKED = 1;
    const FLAG_BIG = 2;
    const FLAG_LAST = 4;
    const FLAG_BEST = 8;
    const FLAG_COLORED = 16;
    const FLAG_PREMIUM = 32;
    const FLAG_WITH_SOUND = 64;

    public $flags = self::FLAG_BLOCKED;

    }

$lang_array = array(1 => 'заблокирована', 2 => 'большая', 4 => 'последняя',
    8 => 'лучшая', 16 => 'цветная', 32 => 'высшего качества', 64 => 'со звуком',
    128 => 'круглая', 256 => 'общедоступная');

$some = new some();

$some->flags ^= some::FLAG_BLOCKED; //не заблокирована

$some->flags |= some::FLAG_LAST; //эта вещь последняя
$some->flags |= some::FLAG_COLORED; //цветная
$some->flags |= some::FLAG_PREMIUM; //высшего качества
$some->flags |= some::FLAG_WITH_SOUND; //и со звуком
$some->flags |= FLAG_CIRCULAR; //так же она круглая
$some->flags |= 512; //ещё какой-то флаг

echo 'Эта вещь: ';
foreach ($lang_array as $key => $title)
    if (($some->flags & $key) === $key)
        echo '
'.$title;

echo '

Заблокирована? ';
echo (($some->flags & some::FLAG_BLOCKED) === some::FLAG_BLOCKED)? 'Да':'Нет';

echo '

Установлен ли флаг, который заранее не определён? ';
echo (($some->flags & 512) === 512)? 'Да':'Нет';
Мне показалась странной работа с флагами таким образом. Обычно, в качестве констант хранят не номер бита, а само значение. Это позволит ввести (если надо) дополнительные константы, которые комбинируют предыдущие.

const FLAG_LAYOUT_LEFT=1;
const FLAG_LAYOUT_RIGHT=2;
const FLAG_LAYOUT_TOP=4;
const FLAG_LAYOUT_BOTTOM=8;

const FLAG_LAYOUT_LEFT_AND_RIGHT = 3;
const FLAG_LAYOUT_TOP_AND_BOTTOM = 12;
const FLAG_LAYOUT_ALL = 15;


Так же будут упрощены установки флага:

$this->flags |= self::FLAG_LAYOUT_ALL;


снятия флага:

$this->flags ^= self::FLAG_LAYOUT_LEFT;
$this->flags ^= self::FLAG_LAYOUT_RIGHT;


проверки флага:

($this->flags & self::FLAG_LAYOUT_TOP) === self::FLAG_LAYOUT_TOP;
($this->flags & self::FLAG_LAYOUT_LEFT) === self::FLAG_LAYOUT_LEFT;

Простите меня великодушно, простите, но я не могу себя сдержать… Вы знаете, что ваше название на слух воспринимается как «какал»?

Ну, а так… сервис, вроде, ничего себе…

Как дела обстоят с нагрузками?
На самом деле не дотягивают до Колдографии… заметны некоторые артефакты.
До сих пор в шоке…
Какие Ваши доказательства? Где сбор статистики посещаемости, где репрезентативный опрос, где, хотя бы, авторитетные мнения?
Интересно, что сам оператор for не подвергся анафеме. Ведь есть while. И ведь действительно не все умеют использовать while, а используют for и break.
Первое что бросилось в глаза — это бесконечный цикл for(;;) и ниже условие для выхода из цикла. Потом бессмысленный перевод индекса цвета в массив, потом использование простыней из switch. Короче, захотелось переписать.

class BrainLoller2 {

    const DIRECTION_UP = 0;
    const DIRECTION_RIGHT = 1;
    const DIRECTION_DOWN = 2;
    const DIRECTION_LEFT = 3;
    
    protected $directions = array(array( 0,-1),
                                  array( 1, 0),
                                  array( 0, 1),
                                  array(-1, 0));
    protected $commands = array(0x00FF00 => '+', 
                                0x008000 => '-', 
                                0xFF0000 => '>',
                                0x800000 => '<',
                                0xFFFF00 => '[',
                                0x808000 => ']',
                                0x0000FF => '.',
                                0x000080 => ',');
    
    protected $picture; // Картинка BrainLoller
    protected $size = array(0,0);

    function __construct($picture){
        // Открываем собственно изображение
        $this->picture = imagecreatefrompng($picture);
        // Получаем размер изображения
        $this->size = getimagesize($picture);
    }

    public function getCode(){
        $current_pixel = array(0, 0); // Текущий пиксель (x, y)
        $pointer = self::DIRECTION_RIGHT;
        $code = '';
        
        while(!($current_pixel[0] > $this->size[0] or $current_pixel[1] > $this->size[1] or 
                $current_pixel[0] < 0 or $current_pixel[1] < 0)){
            $pixel_color = imagecolorat($this->picture, $current_pixel[0], $current_pixel[1]); // Берем цвет пикселя
            $pixel_color &= 0xFFFFFF;
            
            // Проверяем какой команде сопоставлен данный цвет, если поворот то поворачиваем, если команда то добавляем к $code
            if (isset($this->commands[$pixel_color]))
                    $code .= $this->commands[$pixel_color];
            elseif ($pixel_color == 0x00FFFF)
                $pointer = ($pointer + 1) % 4;
            elseif ($pixel_color == 0x008080)
                $pointer = ($pointer - 1 + 4) % 4;
            
            $current_pixel[0] += $this->directions[$pointer][0];
            $current_pixel[1] += $this->directions[$pointer][1];
        }
        return $code;
    }

    function __destruct(){
        imagedestroy($this->picture); // Высвобождаем занятые ресурсы
    }
}


P.S. Что-то мне подсказывает, что нельзя попасть в бесконечный цикл.
Было бы совсем хорошо, если бы добавить к каждому заданию набор тестов.
Очень не люблю когда вопрос о помощи начинается с «выходом из-за печки».
— Привет.
… Ждут ответа.
— Как дела?
… Ждут ответа.
— Есть время?
… Ждут ответа.
— Можешь помочь с *этой фигнёй*?
… Ждут ответа.

И только с пятого сообщения начинается вопрос по делу. По мне лучше всё одним сообщением:
— Привет. Не мог бы ты мне помочь с *этой фигнёй*? *Полное описание фигни*.

И ещё многие люди думают, что другие люди читают мысли и видят что творится на мониторе первых.
Простите, не мог не акцентировать на этом выражении внимание: «свое объективное мнение».
Из известного анекдота:
деньги, машину, квартиру — это раз.…

P.S. Code Kata кто-нибудь бы перевёл.
В «Моём Мире»…
Я думаю, что некоммерческий проект — это проект у которого основная цель не извлечение прибыли. При этом получение прибыли не делает проект коммерческим.
Много фраз(особенно определения) можно было сформулировать гораздо понятнее.
Эх, держите меня семеро, пока я свои разработки на хабр не запостил.

Information

Rating
Does not participate
Location
Иркутск, Иркутская обл., Россия
Registered
Activity