Comments 69
Годно. Шикарно. В самую центру.
p.s.: Есть ощущение что ZF2 делался теми же разработчиками из тех же соображений.
p.s.: Есть ощущение что ZF2 делался теми же разработчиками из тех же соображений.
+45
В самую точку! Превосходно!
+1
Боян же.
+21
Ну так, zf еще год назад подобное умел.
+21
Хоть и боян, но в проекте постоянно появляются новые лулзы!
Вот, например, совсем свежий Pull Requеst, который добавляет Symfony 2 Bundle, чтобы можно было завернуть 90% кода в Sf2 DI контейнер: github.com/Herzult/SimplePHPEasyPlus/pull/15
Вот, например, совсем свежий Pull Requеst, который добавляет Symfony 2 Bundle, чтобы можно было завернуть 90% кода в Sf2 DI контейнер: github.com/Herzult/SimplePHPEasyPlus/pull/15
+6
Я надеюсь, unit тесты есть?
+23
Есть же ресурсы, куда постят подобный код… И он получается, уж точно, не из-за ооп
-5
А если серьезно, есть ли какие то критерии целесообразности использования технологий или подходов?
Иногда мне кажется, что все вокруг бородатые суперпрограммисты, а я один пишу слишком простой код, без ООП, без сложных паттернов, фреймворков и прочих ORMов.
Причем, мне мой код нравится — написал под наши задачи пару десятков основных функций, которые постоянно использую.
Как понять, это я отстал от жизни, или это все остальные переусложняют?
Иногда мне кажется, что все вокруг бородатые суперпрограммисты, а я один пишу слишком простой код, без ООП, без сложных паттернов, фреймворков и прочих ORMов.
Причем, мне мой код нравится — написал под наши задачи пару десятков основных функций, которые постоянно использую.
Как понять, это я отстал от жизни, или это все остальные переусложняют?
+16
Думаю, остальные не переусложняют. Все эти паттерны, фреймворки и ООП придумали как-раз чтобы было легче работать с кодом и повторно его использовать. С большой кучей функций гораздо сложнее работать, чем с несколькими хорошо продуманными классами.
Если проект небольшой и с кодом будете работать только Вы, то пишите как нравится. В противном случае, стоит посмотреть в сторону более «сложных» подходов. В конечном счете, они сэкономят кучу времени и нервов.
Если проект небольшой и с кодом будете работать только Вы, то пишите как нравится. В противном случае, стоит посмотреть в сторону более «сложных» подходов. В конечном счете, они сэкономят кучу времени и нервов.
+6
А я считаю, что как раз таки оверинжининг встречается очень часто, и это большое зло. Он создает излишнюю неоправданную сложность. Что касается поста, то этот код спокойно можно переписать в структурном стиле, его суть не изменится.
+6
UFO just landed and posted this here
Да и не факт, что ограничены. Надо сделать чистый SQL — берём NativeQuery в той же Docrine, и все дела :-)
+1
Неприменительно к сложению 1+1: код в таком стиле используется при создании компиляторов или байт-кодовых машин. Прекрасный способ проверить компилятор на LLVM — поискать там символы /, *, %, и другие арифметические операции над числами. Если таковые есть, то скорее всего это ошибка (в свёртке констант такого тоже не должно быть, т. к. LLVM делает это сам). В итоге сложение выливается в лучшем случае в:
Но обычно используется не CreateFAdd, а
Вот если бы в статье был оптимизирующий компилятор и вместо
Value *one = ConstantFP::get(getGlobalContext(), APFloat(left));
Value *two = ConstantFP::get(getGlobalContext(), APFloat(right));
Value *result = Builder.CreateFAdd(one, two, "addtmp");
Но обычно используется не CreateFAdd, а
AddFPMathAttributes(BinaryOperator::CreateFAdd...
или CreateInsertNUWNSWBinOp(Instruction::Sub, ...
, только вместо Instruction::Sub нужная инструкция на основе сопоставляющего массива, а не прописанная вручную. И это именно для облегчения восприятия. Теоретически, разработчики LLVM могли бы создать API, в котором есть класс BuilderValue, который инкапсулирует Value * и имеет полный набор перегруженных операторов С++. Только операций в LLVM намного больше, чем можно представить стандартными перегрузками, например, целочисленное сложение, сложение чисел с плавающей точкой, беззнаковое сложение и т. д. Вот если бы в статье был оптимизирующий компилятор и вместо
$runner = new CalculRunner();
что-то вроде $codeGen = new CodeGenerator();
, тогда это был бы вполне нормальный пример для секции «Getting Started».+3
Хороший признак, что пора осваивать ООП — куча функций принимающих одним из параметров или возвращающих ассоциативный массив с одной или близкими структурами (в частности записи БД из fetch_assoc) или множество одинаковых параметров, функций с одинаковым префиксом/суффиксом (user_* или *_user). Если таких нет, то стоит присмотреться к коду — может в нем полно функций использующих глобалы и суперглобалы, может полно функций или скриптов на сотни и тысячи строк, может ещё какие признаки плохого запаха кода.
В принципе использование ООП, ORM и фреймворков не взаимосвязано. Начинать можно с чего-то одного — с ООП прежде всего. Как только начнете представлять записи в БД как объекты, у вас появится своя маленькая ускоспециализированная ORMка, как только начнете перетаскивать из проекта в проект код типа
В принципе использование ООП, ORM и фреймворков не взаимосвязано. Начинать можно с чего-то одного — с ООП прежде всего. Как только начнете представлять записи в БД как объекты, у вас появится своя маленькая ускоспециализированная ORMка, как только начнете перетаскивать из проекта в проект код типа
($app = new Applicaction)->run();
— свой фреймворк. +1
Ого java программа на PHP!
+36
Наверное, еще не хватает разухабистого xml-конфига. )
+17
Все настройки в MySQL.
+9
Можно еще на С++ написать, и потом прокинуть в PHP через exec :)
#include <iostream>
using namespace std::placeholders;
template <typename ...T>
int plus(T &&...value) {
return std::bind(std::plus<int>(), _1, _2)(value...);
}
;
int main() {
std::cout << plus(1, 1) << std::endl; // 2
return 0;
}
0
Some people see a problem and think «I know, I'll use Java!» Now they have a ProblemFactory. ©
+13
UFO just landed and posted this here
Zend Framework 2
SerializerAdapterPluginManagerFactory
DiStrictAbstractServiceFactoryFactory
Всё только начинается
SerializerAdapterPluginManagerFactory
DiStrictAbstractServiceFactoryFactory
Всё только начинается
+4
Configurator configurator = new Configurator();
configurator.configure();
+5
Нужно еще добавить фабрики фабрик.
+1
Собственно, отличный гиперболизированный пример к моей статье. Сколько таких лишних классов люди писали не потому, что тонко решили пошутить, как автор, а что считали себя умнее всех и что могут сделать супергибкую структуру.
А потом, когда профайлер показывает 15000 вызовов методов в одном экшне, сидишь и офигеваешь. Или тратишь полчаса на изучение всей иерархии классов. Пипец
А потом, когда профайлер показывает 15000 вызовов методов в одном экшне, сидишь и офигеваешь. Или тратишь полчаса на изучение всей иерархии классов. Пипец
+2
Будет ли добавлен во второй версии автолоадер?
+6
Можно ли прикрутить redis в роли кеша?
+3
Толку-то от него? Там все равно «1» 2 раза написано… Вот если бы ввести константу для каждого числа, вот это да:)
+5
Для каждой цифры, а числа будут собирать соответствующие фабрики.
0
Вы гениальны!
Что-то типа:
$num[0] = new Sequence(ONE, ONE, ONE)->getValue(); //111
$num[1] = new Sequence(ONE, TWO, THREE)->getValue(); //123
[Ушел писать свою библиотеку]
Что-то типа:
$num[0] = new Sequence(ONE, ONE, ONE)->getValue(); //111
$num[1] = new Sequence(ONE, TWO, THREE)->getValue(); //123
[Ушел писать свою библиотеку]
+1
$num->add(new Sequence(ONE, ONE, ONE)->getValue());
0
В PHP можно получить возможность autoload, если писать не ONE, а что-нибудь вида NumberFactory::ONE (да и вообще, глобальные константы это зло), поэтому пример будет немного другой:
$num[0] = new Sequence(NumberFactory::ONE, NumberFactory::ONE, NumberFactory::ONE)->getValue(); //111
$num[1] = new Sequence(NumberFactory::ONE, NumberFactory::TWO, NumberFactory::THREE)->getValue(); //123
+2
Название «Sequence» неудачное, слишком общее. Я бы переименовал в «FiniteNaturalDecimalNumberSequence», а классы вроде «NumberSequence» оставил глубоко в иерархии. То же касается NumberFactory — явно имеются в виду десятичные цифры. И что за безобразие, какие ещё $num[0]?! Родные похапэшные массивы в ООП коде, да ещё и без говорящих названий переменных?
$finiteNaturalDecimalNumberSequenceFactory = new FiniteNaturalDecimalNumberSequenceFactory();
$decimalNumberFactory = new DecimalNumberFactory();
$firstSummandNumber = $finiteNaturalDecimalNumberSequenceFactory->createNewSequence(
$decimalNumberFactory->loadNumberFromXmlConfig("ONE"),
$decimalNumberFactory->loadNumberFromXmlConfig("ONE")
$decimalNumberFactory->loadNumberFromXmlConfig("ONE")
)->getValue();
$secondSummandNumber = $finiteNaturalDecimalNumberSequenceFactory->createNewSequence(
$decimalNumberFactory->loadNumberFromXmlConfig("ONE"),
$decimalNumberFactory->loadNumberFromXmlConfig("TWO")
$decimalNumberFactory->loadNumberFromXmlConfig("THREE")
)->getValue();
+2
Листинг напомнил стектрейс Java + Spring AOP, верной дорогой идете товарищи :)
+2
У вас есть hardcoded константы в коде, это плохая практика, их обязательно нужно вынести в конфиг в формате XML.
+14
Итератор от sql-injection забыли защитить.
+1
Еще нужно обязательно сделать SOAP-веб-сервис. XML/JSON — для нубов, они слишком простые.
+1
Прикольная штука, лично мне нравится
0
Прямо в стиле php: Длинно, нудно, глючно
-19
Упущен вопрос представления, не мешало бы создать еще шаблонизатор под эту библиотеку
0
Честно говоря, конечная реализация не впечатлила:
Я надеялся увидеть, хотя бы, реализацию сложения столбиком или, например, какую-нибудь реализацию параллельного сложения (с использованием pcntl_fork и shm для синхронизации).
Скрытый текст
github.com/Herzult/SimplePHPEasyPlus/blob/master/src/SimplePHPEasyPlus/Operator/AdditionOperator.php
<?php
namespace SimplePHPEasyPlus\Operator;
use SimplePHPEasyPlus\Number\NumberInterface;
class AdditionOperator implements OperatorInterface
{
protected $resultClass;
public function __construct($resultClass)
{
$this->resultClass = $resultClass;
}
public function process(NumberInterface $numberOne, NumberInterface $numberTwo)
{
$resultClass = $this->resultClass;
$numbers = array($numberOne->getValue(), $numberTwo->getValue());
$result = new $resultClass(array_sum($numbers));
return $result;
}
}
Я надеялся увидеть, хотя бы, реализацию сложения столбиком или, например, какую-нибудь реализацию параллельного сложения (с использованием pcntl_fork и shm для синхронизации).
-1
Апплодирую стоя=)
+1
Было бы уместнее опубликовать это через три недели. ;-)
Кстати, скобки при создании экземляра объекта без аргументов необязательны.
Кстати, скобки при создании экземляра объекта без аргументов необязательны.
0
use SimplePHPEasyPlus\Iterator\CallbackIterator;
Похоже лишний, либо разработчики фреймворка не до конца продумали )
+1
Задумка хорошая, но до конца не добита — прочитав код примера, я всё ещё могу понять, что там делается. В идеале хотелось бы этого избежать.
+11
github.com/Herzult/SimplePHPEasyPlus/blob/master/tests/Functional/AdditionTest.php
stupidcodereview mode on
Комментарий к методу не соответствует тому, что находится в методе
0
А ограничения по размеру и точности чисел есть?
0
Ничего себе приход у автора был! :)
0
Sign up to leave a comment.
SimplePHPEasyPlus: Складываем числа на PHP