Pull to refresh

Comments 69

Годно. Шикарно. В самую центру.
p.s.: Есть ощущение что ZF2 делался теми же разработчиками из тех же соображений.
В самую точку! Превосходно!
Ну так, zf еще год назад подобное умел.
Хоть и боян, но в проекте постоянно появляются новые лулзы!
Вот, например, совсем свежий Pull Requеst, который добавляет Symfony 2 Bundle, чтобы можно было завернуть 90% кода в Sf2 DI контейнер: github.com/Herzult/SimplePHPEasyPlus/pull/15
Я надеюсь, unit тесты есть?
Есть же ресурсы, куда постят подобный код… И он получается, уж точно, не из-за ооп
А если серьезно, есть ли какие то критерии целесообразности использования технологий или подходов?

Иногда мне кажется, что все вокруг бородатые суперпрограммисты, а я один пишу слишком простой код, без ООП, без сложных паттернов, фреймворков и прочих ORMов.

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

Как понять, это я отстал от жизни, или это все остальные переусложняют?
Думаю, остальные не переусложняют. Все эти паттерны, фреймворки и ООП придумали как-раз чтобы было легче работать с кодом и повторно его использовать. С большой кучей функций гораздо сложнее работать, чем с несколькими хорошо продуманными классами.

Если проект небольшой и с кодом будете работать только Вы, то пишите как нравится. В противном случае, стоит посмотреть в сторону более «сложных» подходов. В конечном счете, они сэкономят кучу времени и нервов.
А я считаю, что как раз таки оверинжининг встречается очень часто, и это большое зло. Он создает излишнюю неоправданную сложность. Что касается поста, то этот код спокойно можно переписать в структурном стиле, его суть не изменится.
Тем и отличается хороший программист от плохого, что он может найти баланс между оверинжинингом и недоинжинингом
UFO just landed and posted this here
Да и не факт, что ограничены. Надо сделать чистый SQL — берём NativeQuery в той же Docrine, и все дела :-)
UFO just landed and posted this here
Да и SQL зачастую тоже не очень уместно. Настройки программы, например. Практически во всех случаях достаточно какого-нибудь текстового файла key=value, парсящегося через fscanf(file, "%31s=%31s\n", key, value), а то и бинарника со структурой.
UFO just landed and posted this here
Неприменительно к сложению 1+1: код в таком стиле используется при создании компиляторов или байт-кодовых машин. Прекрасный способ проверить компилятор на LLVM — поискать там символы /, *, %, и другие арифметические операции над числами. Если таковые есть, то скорее всего это ошибка (в свёртке констант такого тоже не должно быть, т. к. LLVM делает это сам). В итоге сложение выливается в лучшем случае в:
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».
Хороший признак, что пора осваивать ООП — куча функций принимающих одним из параметров или возвращающих ассоциативный массив с одной или близкими структурами (в частности записи БД из fetch_assoc) или множество одинаковых параметров, функций с одинаковым префиксом/суффиксом (user_* или *_user). Если таких нет, то стоит присмотреться к коду — может в нем полно функций использующих глобалы и суперглобалы, может полно функций или скриптов на сотни и тысячи строк, может ещё какие признаки плохого запаха кода.

В принципе использование ООП, ORM и фреймворков не взаимосвязано. Начинать можно с чего-то одного — с ООП прежде всего. Как только начнете представлять записи в БД как объекты, у вас появится своя маленькая ускоспециализированная ORMка, как только начнете перетаскивать из проекта в проект код типа ($app = new Applicaction)->run(); — свой фреймворк.
Было бы забавно, если бы не так печально. В q&a уже в советах предлагают $.trim(text) вместо text.trim()
И правильно делают!
jQuery использует String.trim() если его поддерживает движок javascript.
Если же конечный пользователь использует какой-нибудь Internet Exporer 8 то будет применена регулярка.
Наверное, еще не хватает разухабистого xml-конфига. )
В MongoDB, конечно же.
Можно еще на С++ написать, и потом прокинуть в 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;
}

Some people see a problem and think «I know, I'll use Java!» Now they have a ProblemFactory. ©
UFO just landed and posted this here
Нужно еще добавить фабрики фабрик.
Да действиетльно! что это такое? new SimpleNumberStringParser();? Как можно напрямую вызывать new?? А вдруг надо будет другой парсер подсовывать и т.п.?
Собственно, отличный гиперболизированный пример к моей статье. Сколько таких лишних классов люди писали не потому, что тонко решили пошутить, как автор, а что считали себя умнее всех и что могут сделать супергибкую структуру.

А потом, когда профайлер показывает 15000 вызовов методов в одном экшне, сидишь и офигеваешь. Или тратишь полчаса на изучение всей иерархии классов. Пипец
Будет ли добавлен во второй версии автолоадер?
composer чем не угодил? Вызов composer install генерирует файл vendor/autoload.php.
Можно ли прикрутить redis в роли кеша?
Зачем redis? Нужен универсальный интерфейс кеша.
Толку-то от него? Там все равно «1» 2 раза написано… Вот если бы ввести константу для каждого числа, вот это да:)
Для каждой цифры, а числа будут собирать соответствующие фабрики.
Вы гениальны!
Что-то типа:

$num[0] = new Sequence(ONE, ONE, ONE)->getValue(); //111
$num[1] = new Sequence(ONE, TWO, THREE)->getValue(); //123

[Ушел писать свою библиотеку]
В 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

Название «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();
Да у вас же Parse error at line FIVE!
Листинг напомнил стектрейс Java + Spring AOP, верной дорогой идете товарищи :)
У вас есть hardcoded константы в коде, это плохая практика, их обязательно нужно вынести в конфиг в формате XML.
Итератор от sql-injection забыли защитить.
Еще нужно обязательно сделать SOAP-веб-сервис. XML/JSON — для нубов, они слишком простые.
Прикольная штука, лично мне нравится
Прямо в стиле php: Длинно, нудно, глючно
Вообще, больше похоже на стиль java. По крайней мере, первые 2 слова.
Вы слишком долго пользовались Zend Framework и Symfony.
Упущен вопрос представления, не мешало бы создать еще шаблонизатор под эту библиотеку
Честно говоря, конечная реализация не впечатлила:

Скрытый текст
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 для синхронизации).
Так для того и ООП, чтобы вы могли переписать один класс как хотите и ничего в остальной программе не изменится :)
Было бы уместнее опубликовать это через три недели. ;-)
Кстати, скобки при создании экземляра объекта без аргументов необязательны.
use SimplePHPEasyPlus\Iterator\CallbackIterator;

Похоже лишний, либо разработчики фреймворка не до конца продумали )
Задумка хорошая, но до конца не добита — прочитав код примера, я всё ещё могу понять, что там делается. В идеале хотелось бы этого избежать.
А ограничения по размеру и точности чисел есть?
Родные из PHP
$numbers = array($numberOne->getValue(), $numberTwo->getValue());
$result = new $resultClass(array_sum($numbers));
Ничего себе приход у автора был! :)
Sign up to leave a comment.

Articles