Pull to refresh
26
0
Роман Бобров @resurection

User

Send message
Молодец Марк Шаттлворт! Вы отлично постарались! Садитесь пять.
И, за одно, передавать все свои словари :)
// Из доков:
echo new Month(Month::June); // выведет: 6
// Тот же самый результат:
echo Month::June;

Получается, смысл только в валидации входных значений:
// Но мне проще написать:
if ( ! array_key_exists(13, My_Date::$months)) {
    echo 'Error!';
}
// чем писать это:
try {
    new Month(13);
} catch (UnexpectedValueException $uve) {
    echo $uve->getMessage();
}

Чем же SplEnum лучше? Мне кажется, чем проще, тем лучше. Простые нативные массивы лучше чем класс, который никак не упрощает работу.
Если строго следовать этой логике, то вообще все переменные должны быть закрытыми + куча геттеров.

И это правильно.

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

вы бы легко впилили туда перевод

Этого не надо делать ни в коем случае! В справочнике могут быть ключевые слова. Например, они могут фигурировать в БД в ENUM полях. Да и перепиливать базовые классы под проект — это не хорошо.

Если вдруг моё приложение станет мультиязычным, то переводом я буду заниматься на совсем другом уровне. Там где происходит вывод:

echo '<select>';
foreach (My_Date::$months as $month) {
   echo '<option>'. translate($month) .'</option>';
}
echo '</select>';

Это немного сложнее, но правильнее. Это MVC-принципы. Перевод относится именно к «V».
Например, потом вам понадобится сделать API к вашему сайту. А у вас все справочники локализованы и API будет постоянно выдавать месяца на разных языках. Как клиентское ПО будет с этим работать?
Я только хотел сказать, что в статье показана одна сторона медали и практически не освещена другая. Я привёл конкретные примеры противоречащие утверждениям автора:
это не дает никаких преимуществ

даёт.

Вам придется жестко привязаться к

Я хочу, чтобы в моей системе был один справочник в одном месте => мне приходится привязываться к этому месту. Вы можете изобретать сложные механизмы, например, хранить справочник в отдельном файле или в БД или просто в атрибуте объекта, но зачем?

Но Вы же и философию из этого не делаете, верно?

Делаю. В некоторых случаях нельзя делать статические члены класса; в некоторых случаях это необходимо. Автор статьи плохо описал случаи в которых это необходимо. Я попытался дополнить.

P.S.> В качестве примера можете посмотреть в Zend Framework. Они не брезгуют использовать статические члены класса. Просто они грамотно их используют и это не создаёт лишних зависимостей и не мешает тестированию.
Отличная статья и отличный перевод. Заплюсовал.
Однако, некоторые утверждения кажутся мне странными.

это не дает никаких преимуществ по сравнению с процедурным программированием

Если несколько функций можно как-то сгруппировать по тематике, то я их группирую в один статический класс:
<?php
class My_Math {
	public static function fibonachi($n) {
		return ...;
	}
	public static function getK($m, $n) {
		return ceil(($m / $n) * log(2));
	}
}

Преимущества от этого следующие:
  • Вместо одного огромного файла functions.php, функции раскиданы по нескольким файлам и их легко найти
  • Работает autoload. Класс Math загрузится только тогда когда мне понадобится


Статические свойства никогда не должны быть доступны снаружи

Почему бы и нет?
<?php
class My_Date {
	// Пусть в моей системе будет только один справочник со списком месяцев
	public static $months = array('Январь', 'Февраль', ...);
	// Сделал бы его константой класса, но константы не могут быть массивами :(
}


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

Как насчёт этого?
<?php
class My_Pager {
	// Каждый экземпляр должен знать свой порядковый номер, что бы генерить уникальные ссылки
	protected $_num = 0;

	// Но как же его посчитать автоматически?
	// А вот как:
	protected static $_cntPagers = 0;

	public function __construct()
	{
		$this->_num = self::$_cntPagers++;
	}
}


Итог: статические члены классов, это неотъемлемый инструмент, которым надо уметь правильно пользоваться, не создавая лишних зависимостей.
Символично, что статья написана в песочнице.
Т.е. кризис коснулся только вашу семью? Родителей других детей, которые вас дразнили, кризис не задел?
Никто не заявлял, что Биг-Бази это выгодно. Это подавали под соусом, что им проще вложить деньги в саморекламу, чем отдать рекламные бюджеты телевизионщикам/радионщикам и прочим СМИ… Вполне правдоподобно. Кстати, я ещё клал себе на телефон 200 рублей оплачивая только 100. Это тоже не вписывалось в законы экономики, но это работало.
Год назад я отлично сходил в выходной вечер поиграл в боулинг за 130 рублей (цена обычной аренды в это же время 1300р). Сделал химчистку авто за 1500р. (обычная цена 6000р.).

Меня ни разу не обманули. Что я сделал не правильно? Кстати, покупал у БигБаззи.
Перевёрнутый верх ногами знак, установлен перпендикулярно продольной плоскости симметрии тс. Не вижу тут нарушения.
А ещё можно при ментах взять это приложение «Б» верх-ногами и сказать: «я всегда его так читал» :)
Перевёрнутый номер смогут прочитать два понятых, по этому номер читаемый. Может и не легко читаемый, но читаемый.
Есть там приложене «Б», которое определяет «шрифт букв, разрешённых для использования на регистрационных знаках». Перевёрнутый номер не будет соответствовать этому требованию.
Тоже плюсанул за старания, но не вижу смысла в этой штуке учитывая это:
Работает с уже существующим API для работы с данными инфоблоков, а не напрямую с базой.

Смысл Highload iblocks как раз в том, что бы обойти тормозное iblock-api. А вы просто сделали (не доделали) новое АПИ. В чём смысл?
В бухгалтерии без IT сейчас тоже никуда.
Очень интересна тема, но из-за плюсов-минусов не смог осилить статью.
Раньше опыты были интереснее. А теперь повторение школьной программы естествознания пятого класса.
Спирали вращаются от тёплого воздуха — зашибись!
Металл растягивается от температуры — круто!!!
Воздух расширяется при нагревании — уау!!!
только теперь про это в коде не написано.

Так не подойдёт?

this.trigger('classA.methodB', args);

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity