Обновить
12
Виктор Павлович Гришко@Yeah

Пользователь

16
Подписчики
Отправить сообщение
Из этого текста я также понял:
  • Чашки после себя моют только программисты С++ (и возможно PHP, так как реализация класса от нас скрыта)
  • Программисты на Java и С пьют чай без сахара
  • Автор всей душой ненавилит PHP, так как хуже код и придумать сложно


Мой вариант для PHP:
<?php
interface Drinkable {
	//Это можно пить
	public function drink();
}

class Liquid_Exception extends Exception {}

//Абстрактный класс Жидкость
abstract class Liquid {
	//Объем жидкости
	protected $_amount = null;

	public function setAmount($amount) {
		$this->_amount = $amount;
		return $this;
	}

	public function getAmount() {
		return $this->_amount;
	}
}

//Абстрактный класс Кипяченая жидкость
abstract class BoiledLiquid extends Liquid {
	//Уже вскипятили???
	protected $_isBoiled = false;
	
	//Уже вскипятили???
	public function isBoiled() {
		return $this->_isBoiled;
	}
	
	//Закипятить!
	public function boil() {
		$this->_isBoiled = true;
		return $this;
	}
}

//Класс Чай (наследуется от класса Кипяченая жидкость) и его можно пить!
class Tea extends BoiledLiquid implements Drinkable {
	//Количество сахара
	protected $_sugar = 0;
	//Лимончику???
	protected $_lemon = false;
	
	/*public function __construct($sugar = 0, $lemon = false) {
		$this->boil()->setSugar($sugar)->setLemon($lemon);
	}*/
	//Насыпать сахарку
	public function setSugar($sugar) {
		$this->_sugar = $sugar;
		return $this;
	}
	//Сколько сахара?
	public function getSugar() {
		return $this->_sugar;
	}
	//Кинуть лимончик
	public function setLemon($lemon) {
		$this->_lemon = $lemon;
		return $this;
	}
	//А лимончик кинули?
	public function getLemon() {
		return $this->_lemon;
	}
	
	//Пьем чай
	public function drink() {
		if ($this->getAmount() <=0 ) {
			throw new Liquid_Exception('А пить-то нечего!!!');
		}
		if (!$this->isBoiled()) {
			throw new Liquid_Exception('Пить холодный??? Фи!');
		}
		return array(
			'sugar' => $this->getSugar(),
			'lemon' => $this->getLemon()
		);
	}
}

class Cup_Exception extends Exception {}

//Абстрактный класс Чашка
abstract class Cup {
	//Вместимость чашки
	protected $_capacity = null;
	//Содержимое чашки
	protected $_liquid = null;
	
	//Наливаем в чашку жидкость
	public function fill(Liquid $liquid) {
		if ($liquid->getAmount() > $this->getCapacity()) {
			throw new Cup_Exception('Куда ты столько льешь? Кто с пола вытирать будет?');
		}
		$this->_liquid = $liquid;
		return $this;
	}

	//Выливаем жидкость из чашки
	public function outpour() {
		$liquid = $this->_liquid;
		unset($this->_liquid);
		return $liquid;
	}
	
	//Чашка пустая???
	public function isEmpty() {
		//Проверяем, что в чашке вообще содержиться жидкость и ее объем больше 0
		return (!($this->_liquid instanceOf Liquid) || $this->_liquid->getAmount() > 0);
	}

	public function setCapacity($capacity) {
		$this->_capacity = $capacity;
		return $this;
	}

	public function getCapacity() {
		return $this->_capacity;
	}
	
	public static function factory($type) {
		$className = ucfirst($type) . 'Cup';
		if (class_exists($className, true)) {
			$reflector = new ReflectionClass($className);
			//Это чашка вообще?
			if ($reflector->isSubclassOf('Cup')) {
				$args = func_get_args();
				array_shift($args);
				return ($reflector->hasMethod('__construct'))?$reflector->newInstanceArgs($args):$reflector->newInstance();
			}
		}
		return false;
	}
	
	//Магический метод для манипуляций с содержимым чашки, не выливая его
	public function __call($method, $options) {
		if (preg_match('$(set|get)Liquid(\w+)$', $method, $m)) {
			$newMethodName = $m[1].$m[2];
			if (method_exists($this->_liquid, $newMethodName)) {
				return call_user_func_array(array($this->_liquid, $newMethodName), $options);
			}
		}
		throw new Cup_Exception('Такое действие с чашкой выполнять нельзя');
	}
	
}

class CupsShelf_Exception extends Exception {}

//Коллекция чашек на полке
abstract class CupsShelf {
	//Сколько всего чашек в доме?
	protected static $_totalCupsCount = 0;
	//Все чашки, которые есть в доме
	protected static $_cups = array();
	
	public static function setTotalCupsCount($totalCupsCount) {
		self::$_totalCupsCount = $totalCupsCount;
	}

	public static function getTotalCupsCount() {
		return self::$_totalCupsCount;
	}
	
	public static function init() {
		if (self::getTotalCupsCount() > 0) {
			for($i=0;$i<=self::getTotalCupsCount();$i++){
				array_push(self::$_cups, Cup::factory('Tea')->setCapacity(0.25));
			}
		}
	}
	
	public static function getCup() {
		for($i=0;$i<=self::getTotalCupsCount();$i++){
			$cup = self::$_cups[$i];
			if ($cup->isEmpty()) {
				return $cup;
			}
		}
		throw new CupsShelf_Exception('Нет свободных чашек');
	}
}

//Класс чашка для чая
class TeaCup extends Cup {
	
}

try {
	CupsShelf::setTotalCupsCount(10);
	CupsShelf::init();
	
	//Достаем чашку с полки
	$cup = CupsShelf::getCup();
	//Завариваем чай
	$tea = new Tea();
	//И закипятить не забыли
	$tea->boil()->setAmount(0.25);
	//Наливаем в чашку
	$cup->fill($tea);
	//Кинули в чашку сахарку
	$cup->setLiquidSugar(2.5);
	//А лимончик мы не любим. Ну его!
	$cup->setLiquidLemon(false);
	//Пьем!
	$cup->outpour()->drink();
}
catch (Exception $e) {
	echo 'Да, не пить тебе чаю сегодня... (' . $e->getMessage() . ')';
}
?>

что идея априорной вероятности якобы противоречит коммунистической теории

Не коммунистической теории, а диалектическому материализму.
Так или иначе, это их система, их ошибки. Они вольны устранять их так, как им кажется необходимым.
Конечно, уделять внимание нужно критичным задачам, но плюс на минус — это секунда времени (можно устранить вместо перекура — и для здоровья польза), а ошибка, хоть и некритичная сразу бросается в глаза.
Где-то в яваскрипте нужно минус поменять на плюс (или наоборот). Неужели это так сложно, что в данной ситуации вообще нужно говорить о приоритетах?
Для того, чтобы питать автомобиль, нужны очень емкие аккумуляторы. Для того, чтобы заряжать очень емкие аккумуляторы за небольшое время нужна большая сила тока. Мне кажется, что зарядка через обычную сеть будет невозможна или затруднена из-за невозможности выдать большую силу тока при заданном напряжении. В противном случае (при малой силе тока), потребуется неоправданно большое время для зарядки.
Первоначально бензином торговали аптекари — это был их побочный бизнес: www.bertha-benz.de/indexen.php?sub=2&col=b&inhalt=pers_erstetankst

Так что аналогия неуместна — у нас в розницу электричеством не торгуют, но возможно, кулибины смогли бы сделать переходник для того, чтобы заправляться от обычной электросети (в гараже, например). Правда опять же — все зависит от параметров зарядного устройства. Вполне возможно, что в спец. заправках очень большой ток, который не сможет дать обычная сеть.
Статья перевод. В оригинале — «Submit». «Submit» чаще всего переводится именно как «отправить» — нюанс пеервода. В оригинале было «Why Your Form Buttons Should Never Say Submit»
В почтовом интерфейсе эта кнопка называлась бы «Send» (и у Gmail именно так), так что в данном случае «Отправить» вполне соответствовало бы функциональному назначению кнопки.
ЭлектроФорд, конечно, классный, да вот только ситуация с заправками — мрак… Думаю, что не всякая компания осилит сеть заправок в масштабах страны. Причем ситуация патовая: электромобили никто не будет покупать, пока не появятся заправки, а заправки никто не будет строить, пока не появится достаточное для окупаемости количество электромобилей.
Наконец-то добавили PanelSmartGotoParentDir. Теперь смогу backspace на переход в родительский каталог назначить.
Мой папа как-то швырнул в запале перепалки (его кто-то подрезал на дороге) человеку в голову мобильником. Не могли бы вы выполнить аналогичный тест для данного ноутбука — швырните его в кого-нибудь. Присматриваюсь к ноутбукам фирмы Lenovo, как к подарку.

Спасибо!
Вы так добры!
Я и сам знаю, что умеет мой телефон, но я перечислил лишь те функции, которые я использую постоянно.
В качестве mp3-плеера я использую iRiver iFP-899, фонарика в 790 нет, так как используется ксеноновая вспышка, вместо светодиодной, avi-плеер в таком качестве — изврат, годный лишь для показывания камеди-клаба, FM-радио мне в принципе не нужно (а если что, то есть iRiver), насчет фотокамеры соглашусь, иногда фоткаю объявления или вывески, если лень или нечем записать.
Удаленное управление через bluetooth пробовал — но это игрушка.
А, еще один раз, в деревне использовал его как gprs-модем.
А у меня Sony Ericsson K790i! Он умеет:
  • Звонить
  • Не звонить

А больше мне ничего и не нужно…
А почему в гитхабе все в одном файле идет? Особенно плагины. Не лучше ли разбить по отдельным файлам?
Это описывалось ранее. Основное применение данного фреймворка — приложения для мобильных браузеров. Автор не собирается реализовывать обратную совместимость, так как если нужна совместимость, то есть jQuery.
Неправда:

Вот тест на 10000 проходах для массива из 1000 строк+1000 чисел, случайно перемешанных.

array(3) {
[«serialize»]=>float(14.9195878506)
[«json»]=> float(15.6144771576)
[«print_r»]=> float(28.0943210125)
}

gist.github.com/743578
Черт, и действительно. Посыпаю голову пеплом и впредь буду менее самонадеянным.
Баг закрыл.
В подвале сайта на стороне сервера можно объявлять js переменную, в которую вносится timestamp (это будет метка времени, когда страница была сформирована)
В JS коде на функцию onload (ready и т.д.) вставляем определение timestamp и сравнение его с меткой времени в подвале.
У этого варианта есть недостаток: если у пользователя неправильно настроены часы, то значения будут абсурдными.

Модифицируем метод:
В шапку сайта вставляем что-то типа:

<script type="text/javascript">var startTimestamp = new Date();</script>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(function() {
    var finishTimestamp = new Date();
    var loadingTime = startTimestamp.getTime() - finishTimestamp.getTime();
});
</script>


На основе loadingTime определяем время загрузки всех скриптов/стилей/изображений. Если заранее определить каким-то образом их размер, то с какой-то степенью точности можно вычислить скорость интернета.
Создал issue: github.com/theshock/nanojs/issues/issue/2
if (!arguments.length) {
	var e = [doc];
} else if (typeof arg == s_string) {
	e = arg.match(idRe) ? [In.getElementById(arg.substr(1))] :
		toArray(
			arg.match(classNameRE) ? In.getElementsByClassName(arg.substr(1)) :
			arg.match(tagNameRE)   ? In.getElementsByTagName(arg) :
				In.querySelectorAll(arg)
		);

Кратко поясню: в первом блоке if переменная e объявлена, как локальная, однако при ложности условия и попадании в любой из последующих блоков else if эта переменная уже будет трактоваться, как глобальная, что чревато коллизиями.

Информация

В рейтинге
Не участвует
Откуда
Харьков, Харьковская обл., Украина
Дата рождения
Зарегистрирован
Активность