Всем доброго времени суток! Удивительно, но упоминание о шаблоне "Спецификация" в контексте php встречается крайне редко. А ведь с его помощью можно не только избежать комбинаторного взрыва методов репозитория, но и улучшить переиспользование кода. Я же в свою очередь хотел бы остановиться на еще одной возможности, предоставляемой данным паттерном. С ее помощью можно решить проблему, которая возникает почти в каждом веб-приложении. И лично мне очень не хватало этого знания еще пару лет назад.
Рубрика «Specification»
Пара слов о спецификациях
2021-01-30 в 17:02, admin, рубрики: architecture, doctrine, Doctrine ORM, pattern, php, Specification, symfony, usabilityПонимание спецификации ECMAScript, часть 1
2020-02-27 в 4:46, admin, рубрики: ECMAScript, javascript, Specification, Программирование, разработка, Разработка веб-сайтов, спецификация
Доброго времени суток, друзья!
В данной статье мы возьмем функцию из спецификации и разберем ее объяснение. Поехали.
Предисловие
Даже если вы хорошо знаете JavaScript, чтение спецификации может быть затруднительным. Следующий код демонстрирует использование Object.prototype.hasOwnProperty:
const o = {
foo: 1
}
o.hasOwnProperty('foo') // true
o.hasOwnProperty('bar') // false
В примере объект «o» не имеет метода «hasOwnProperty», поэтому мы обращаемся к его прототипу — «Object.prototype» (цепочка прототипов).
Для описания того, как работает Object.hasOwnProperty, в спецификации используется следующий псевдокод:
Читать полностью »
11 вещей которые я узнал, читая спецификацию flexbox
2017-05-30 в 15:05, admin, рубрики: css, flexbox, html, layout, Specification, браузеры, Разработка веб-сайтовЯ всегда считал, что с flexbox довольно легко работать — глоток свежего воздуха после стольких лет float'ов и clearfix'ов.
Правда недавно я обнаружил что борюсь с ним; что-то растягивалось, когда я не думал, что оно должно тянуться. Я поправил здесь, другой элемент сжался. Я починил это, что-то другое ушло за экран. Что во имя Джорджа Буша происходит?
В конце концов, все заработало, но солнце село, а мой процесс был привычной игрой с CSS. Или… как называется та игра, где надо ударить крота, а затем другой крот выпрыгивает и надо ударить и его тоже?
Как бы там ни было, я решил что пора вести себя как взрослый разработчик и выучить flexbox должным образом. Но вместо того, чтобы прочитать 10 очередных блог-постов, я решил отправиться прямиком к исходнику и прочитать The CSS Flexible Box Layout Module Level 1 Spec
Вот хорошие отрывки.
Шаблон проектирования «Спецификация» в C#
2017-03-30 в 11:51, admin, рубрики: .net, C#, DDD, IsSatisfiedBy, Specification, Проектирование и рефакторинг, Разработка веб-сайтов«Спецификация» в программировании — это шаблон проектирования, посредством которого представление правил бизнес логики может быть преобразовано в виде цепочки объектов, связанных операциями булевой логики.
Я познакомился с этим термином в процессе чтения DDD Эванса. На Хабре есть статьи с описанием практического применения паттерна и проблем, возникающих в процессе реализации.
Если коротко, основное преимущество от использования «спецификаций» в том, чтобы иметь одно понятное место, в котором сосредоточены все правила фильтрации объектов предметной модели, вместо тысячи размазанных ровным слоем по приложению лямбда-выражений.
Классическая реализация шаблона проектирования выглядит так:
public interface ISpecification
{
bool IsSatisfiedBy(object candidate);
}
Что с ним не так применительно к C#?
- Есть
Expression<Func<T, bool>>
иFunc<T, bool>>
, сигнатура которых совпадает с IsSatisfiedBy - Есть Extension-методы. alexanderzaytsev с помощью них делает вот так:
public class UserQueryExtensions { public static IQueryable<User> WhereGroupNameIs(this IQueryable<User> users, string name) { return users.Where(u => u.GroupName == name); } }
- А еще можно реализовать вот такую надстройку над LINQ:
public abstract class Specification<T> { public bool IsSatisfiedBy(T item) { return SatisfyingElementsFrom(new[] { item }.AsQueryable()).Any(); } public abstract IQueryable<T> SatisfyingElementsFrom(IQueryable<T> candidates); }