La présentation a pour but de revenir sur différents aspects avancés de Doctrine mis en oeuvre au sein de projets Symfony 2.x/3.
Elle abordera, entre autres, les éléments suivants :
Étendre le vocabulaire DQL (spécifiquement ou à l'aide de bundles existants)
Utiliser les différents listeners existants (annotations, listeners, subscribers, utilisation de l'UOW de Doctrine lors d'un flush, etc.)
Créer des hydrateurs spécifiques ou des entités partielles pour améliorer les performances sur certaines opérations.
Astuces diverses pour améliorer les performances (désactivation des logs, etc.)
Каждый разработчик рано или поздно сталкивается с предметно-ориентированными языками (DSL). Мы разберемся, зачем же нам нужны DSL, и какие проблемы они нам помогают решать. Поймем, в каких случаях нам стоит разрабатывать свой язык, а в каких — использовать уже существующий. Попробуем провести грань и решить, где у нас просто библиотека, а где — предметно ориентированный язык. Придумаем свой DSL и сравним различные подходы к работе с ним в Python. Увидим, как работают лексический и синтаксический анализаторы. Обязательно поговорим про то, как облегчить жизнь пользователям нашего языка. Как сделать информативными сообщения об ошибках? Как тестировать сценарии, написанные на нашем языке? На эти вопросы мы сможем дать ответ.
La présentation a pour but de revenir sur différents aspects avancés de Doctrine mis en oeuvre au sein de projets Symfony 2.x/3.
Elle abordera, entre autres, les éléments suivants :
Étendre le vocabulaire DQL (spécifiquement ou à l'aide de bundles existants)
Utiliser les différents listeners existants (annotations, listeners, subscribers, utilisation de l'UOW de Doctrine lors d'un flush, etc.)
Créer des hydrateurs spécifiques ou des entités partielles pour améliorer les performances sur certaines opérations.
Astuces diverses pour améliorer les performances (désactivation des logs, etc.)
Каждый разработчик рано или поздно сталкивается с предметно-ориентированными языками (DSL). Мы разберемся, зачем же нам нужны DSL, и какие проблемы они нам помогают решать. Поймем, в каких случаях нам стоит разрабатывать свой язык, а в каких — использовать уже существующий. Попробуем провести грань и решить, где у нас просто библиотека, а где — предметно ориентированный язык. Придумаем свой DSL и сравним различные подходы к работе с ним в Python. Увидим, как работают лексический и синтаксический анализаторы. Обязательно поговорим про то, как облегчить жизнь пользователям нашего языка. Как сделать информативными сообщения об ошибках? Как тестировать сценарии, написанные на нашем языке? На эти вопросы мы сможем дать ответ.
Using JavaScript ES2015 (ES6), ES2016, ES2017 in productionAnže Žnidaršič
JavaScript has been evolving very fast in recent years. At a first glance it seems awesome to have all these new features, but you soon realize that browser/server support is a huge bottleneck. This talk will show you how we use ES2015, ES2016, ES* in production code on a large project.
Talk about ECMAScript 6 at YAPC::Asia Tokyo 2015
http://yapcasia.org/2015/talk/show/44721562-10e4-11e5-88a0-d7f07d574c3a
https://www.youtube.com/watch?v=oSPv5IPDSxE
12. class Hero {
constructor(name){
this.name = name;
}
say (){
console.log(this.name + "参上");
}
}
var hero = new Hero("さうざー");
hero.say();
var _createClass = 省略・・
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError(
"Cannot call a class as a function");
}
}
var Hero = (function () {
function Hero(name) {
_classCallCheck(this, Hero);
this.name = name;
}
_createClass(Hero, [{
key: "say",
value: function say() {
console.log(this.name + "参上");
}
}]);
return Hero;
})();
var hero = new Hero("さうざー");
hero.say();
Classes
13. class Hero {
constructor(name){
this.name = name;
}
say (){
console.log(this.name + "参上");
}
}
class HokuKen extends Hero {
constructor(){
super("けんしろ");
}
say (){
console.log("お前はもう○○だ");
super.say();
}
}
var hokuken = new HokuKen();
hokuken.say();
var _createClass = 省略・・
function _classCallCheck 省略…
var _get = 省略…
function _inherits省略…
var HokuKen = (function (_Hero) {
function HokuKen() {
_classCallCheck(this, HokuKen);
_get(
Object.getPrototypeOf(HokuKen.prototype),
"constructor", this).
call(this, "けんしろ");
}
_inherits(HokuKen, _Hero);
_createClass(HokuKen, [{
key: "say",
value: function say() {
console.log("お前はもう○○だ");
_get(
Object.getPrototypeOf(
HokuKen.prototype
), "say", this).call(this);
}
}]);
return HokuKen;
})(Hero);
var hokuken = new HokuKen();
hokuken.say();
Classes -extends-
17. // Template Strings
// Multiline strings
var hello = `こんちは
せかい!`;
console.log(hello);
// Interpolate variable bindings
var name = "たろう", food = "すし";
console.log(`Hello ${name}, ${food} 食う?`);
// Template Strings
// Basic literal string creation
"use strict";
// Multiline strings
var hello = "こんちは n せかい!";
console.log(hello);
// Interpolate variable bindings
var name = "たろう",
food = "すし";
console.log(
"Hello " + name + ", " + food + " 食う?");
Template Strings
18. // list matching
var [goku, ,bejita] = [80,50,70];
// object matching
var {
name: targetNm,
option: { op: targetOption }
} = getTarget();
// object matching shorthand
// binds `op`, `lhs` and `rhs` in scope
var {name, option} = getTarget();
// Can be used in parameter position
function eat({food: f, times: t}) {
console.log(`${f}を${t}回食べたい`);
}
eat({food: "すし", times: 2})
// Fail-soft destructuring
var [hogehoge] = [];
// hogehoge === undefined;
// Fail-soft destructuring with defaults
var [fugafuga = "OK"] = [];
// fugafuka === "OK";
// list matching
var _ref = [80, 50, 70];
var goku = _ref[0];
var bejita = _ref[2];
// object matching
var _getTarget = getTarget();
var targetNm = _getTarget.name;
var targetOption = _getTarget.option.op;
// object matching shorthand
// binds `op`, `lhs` and `rhs` in scope
var _getTarget2 = getTarget();
var name = _getTarget2.name;
var option = _getTarget2.option;
// Can be used in parameter position
function eat(_ref2) {
var f = _ref2.food;
var t = _ref2.times;
console.log("" + f + "を" + t + "回食べたい");
}
eat({ food: "すし", times: 2 });
// Fail-soft destructuring
var _ref3 = [];
var hogehoge = _ref3[0];
// Fail-soft destructuring with defaults
var _ref4 = [];
var _ref4$0 = _ref4[0];
var fugafuga = _ref4$0 === undefined ? "OK" : _ref4$0;
Destructuring
19. // Default Params
function cal(x, y = 2) {
return x * y;
}
console.log(cal(3)); // 3*2=>6
// Rest Params
function entry(own, ...list) {
list.forEach(
(item)=>
console.log(`${own}は ${item} 持ってる`)
);
}
entry("スネヲ", "くるま", "ひこうき", "ふね");
// Spread Operator
function foge(x, y, z) {
return x * y * z;
}
console.log(foge(...[2, 3, 4])); // == 24
// Default Params
"use strict";
function cal(x) {
var y = arguments[1] === undefined ?
2 : arguments[1];
return x * y;
}
console.log(cal(3)); // 3*2=>6
// Rest Params
function entry(own) {
for (var _len = arguments.length,
list = Array(_len > 1 ? _len - 1 : 0),
_key = 1; _key < _len; _key++
) {
list[_key - 1] = arguments[_key];
}
list.forEach(function (item) {
return
console.log(""+own+"は "+item+" 持ってる");
});
}
entry("スネヲ", "くるま", "ひこうき", "ふね");
// Spread Operator
function foge(x, y, z) {
return x * y * z;
}
console.log(foge.apply(undefined, [2, 3, 4]));
// == 24
Default + Rest + Spread
20. //
// Let
//
var varX = 10;
let letX = 20;
{
var varX = 1;
let letX = 2;
console.log(varX, letX);
}
console.log(varX, letX);
//
// const
//
const ON = 1;
ON = 0; // => error!
//=> "ON" is read-only
"use strict";
var varX = 10;
var letX = 20;
{
var varX = 1;
var _letX = 2;
console.log(varX, _letX);
}
console.log(varX, letX);
//
// const
//
var ON = 1;
ON;
let ,const