Чашки после себя моют только программисты С++ (и возможно 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() . ')';
}
?>
Конечно, уделять внимание нужно критичным задачам, но плюс на минус — это секунда времени (можно устранить вместо перекура — и для здоровья польза), а ошибка, хоть и некритичная сразу бросается в глаза.
Для того, чтобы питать автомобиль, нужны очень емкие аккумуляторы. Для того, чтобы заряжать очень емкие аккумуляторы за небольшое время нужна большая сила тока. Мне кажется, что зарядка через обычную сеть будет невозможна или затруднена из-за невозможности выдать большую силу тока при заданном напряжении. В противном случае (при малой силе тока), потребуется неоправданно большое время для зарядки.
Так что аналогия неуместна — у нас в розницу электричеством не торгуют, но возможно, кулибины смогли бы сделать переходник для того, чтобы заправляться от обычной электросети (в гараже, например). Правда опять же — все зависит от параметров зарядного устройства. Вполне возможно, что в спец. заправках очень большой ток, который не сможет дать обычная сеть.
Статья перевод. В оригинале — «Submit». «Submit» чаще всего переводится именно как «отправить» — нюанс пеервода. В оригинале было «Why Your Form Buttons Should Never Say Submit»
В почтовом интерфейсе эта кнопка называлась бы «Send» (и у Gmail именно так), так что в данном случае «Отправить» вполне соответствовало бы функциональному назначению кнопки.
ЭлектроФорд, конечно, классный, да вот только ситуация с заправками — мрак… Думаю, что не всякая компания осилит сеть заправок в масштабах страны. Причем ситуация патовая: электромобили никто не будет покупать, пока не появятся заправки, а заправки никто не будет строить, пока не появится достаточное для окупаемости количество электромобилей.
Мой папа как-то швырнул в запале перепалки (его кто-то подрезал на дороге) человеку в голову мобильником. Не могли бы вы выполнить аналогичный тест для данного ноутбука — швырните его в кого-нибудь. Присматриваюсь к ноутбукам фирмы Lenovo, как к подарку.
Вы так добры!
Я и сам знаю, что умеет мой телефон, но я перечислил лишь те функции, которые я использую постоянно.
В качестве mp3-плеера я использую iRiver iFP-899, фонарика в 790 нет, так как используется ксеноновая вспышка, вместо светодиодной, avi-плеер в таком качестве — изврат, годный лишь для показывания камеди-клаба, FM-радио мне в принципе не нужно (а если что, то есть iRiver), насчет фотокамеры соглашусь, иногда фоткаю объявления или вывески, если лень или нечем записать.
Удаленное управление через bluetooth пробовал — но это игрушка.
А, еще один раз, в деревне использовал его как gprs-модем.
Это описывалось ранее. Основное применение данного фреймворка — приложения для мобильных браузеров. Автор не собирается реализовывать обратную совместимость, так как если нужна совместимость, то есть jQuery.
В подвале сайта на стороне сервера можно объявлять 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 определяем время загрузки всех скриптов/стилей/изображений. Если заранее определить каким-то образом их размер, то с какой-то степенью точности можно вычислить скорость интернета.
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 эта переменная уже будет трактоваться, как глобальная, что чревато коллизиями.
Мой вариант для PHP:
Не коммунистической теории, а диалектическому материализму.
Так что аналогия неуместна — у нас в розницу электричеством не торгуют, но возможно, кулибины смогли бы сделать переходник для того, чтобы заправляться от обычной электросети (в гараже, например). Правда опять же — все зависит от параметров зарядного устройства. Вполне возможно, что в спец. заправках очень большой ток, который не сможет дать обычная сеть.
В почтовом интерфейсе эта кнопка называлась бы «Send» (и у Gmail именно так), так что в данном случае «Отправить» вполне соответствовало бы функциональному назначению кнопки.
Спасибо!
Я и сам знаю, что умеет мой телефон, но я перечислил лишь те функции, которые я использую постоянно.
В качестве mp3-плеера я использую iRiver iFP-899, фонарика в 790 нет, так как используется ксеноновая вспышка, вместо светодиодной, avi-плеер в таком качестве — изврат, годный лишь для показывания камеди-клаба, FM-радио мне в принципе не нужно (а если что, то есть iRiver), насчет фотокамеры соглашусь, иногда фоткаю объявления или вывески, если лень или нечем записать.
Удаленное управление через bluetooth пробовал — но это игрушка.
А, еще один раз, в деревне использовал его как gprs-модем.
А больше мне ничего и не нужно…
Вот тест на 10000 проходах для массива из 1000 строк+1000 чисел, случайно перемешанных.
array(3) {
[«serialize»]=>float(14.9195878506)
[«json»]=> float(15.6144771576)
[«print_r»]=> float(28.0943210125)
}
gist.github.com/743578
Баг закрыл.
В JS коде на функцию onload (ready и т.д.) вставляем определение timestamp и сравнение его с меткой времени в подвале.
У этого варианта есть недостаток: если у пользователя неправильно настроены часы, то значения будут абсурдными.
Модифицируем метод:
В шапку сайта вставляем что-то типа:
На основе loadingTime определяем время загрузки всех скриптов/стилей/изображений. Если заранее определить каким-то образом их размер, то с какой-то степенью точности можно вычислить скорость интернета.
Кратко поясню: в первом блоке if переменная e объявлена, как локальная, однако при ложности условия и попадании в любой из последующих блоков else if эта переменная уже будет трактоваться, как глобальная, что чревато коллизиями.