SlideShare una empresa de Scribd logo
1 de 67
Descargar para leer sin conexión
Выжить с ООП
Макс Гопей
Почему?
Объектно-
Oриентированное
Программирование
8
Почему ООП?
•   Это удобно
•   Это расширяемо
•   Адекватная модель мира
•   Позволяет строить асбтракции
•   Мне так сказали
9
Объект олицетворяет объект
в реальном мире.
10
Объект олицетворяет объект
в реальном мире вашем домене.
11
Класс — это не область имен
12
Пожалуйста, не делайте так:
use SpatieRegexRegex;
 
// Using `match`
Regex::match('/a/', 'abc'); // `MatchResult` object
Regex::match('/a/', 'abc')->hasMatch(); // true
Regex::match('/a/', 'abc')->result(); // 'a'
01.
02.
03.
04.
05.
06.
13
Вместо:
Regex::match('/a/', 'abc'); // `MatchResult` object
Regex::match('/a/', 'abc')->hasMatch(); // true
Regex::match('/a/', 'abc')->result(); // 'a'
лучше:
$pattern = new Regex('/a/');
$matchingResult = $pattern->match('abc'); // `MatchResult` object
$matchingResult->hasMatch(); // true
$matchingResult->result(); // 'a'
01.
02.
03.
01.
02.
03.
04.
14
Вместо:
Assertion::nullOrMax(null, 42); // success
Assertion::nullOrMax(1, 42); // success
Assertion::nullOrMax(1337, 42); // exception
лучше:
// since PHP 5.6
AssertionnullOrMax(null, 42); // success
AssertionnullOrMax(1, 42); // success
AssertionnullOrMax(1337, 42); // exception
01.
02.
03.
01.
02.
03.
04.
15
Инкапсуляция
16
Реализация меняется
•   разные алгоритмы
•   разные хранилища
•   разные протоколы
17
Абстракция не меняется
18
Наследование
21
Стакан
23
Чашка
24
Динозаврик с ручкой
25
Проектируйте для наследования.
Наследуйте, если спроектировали для этого.
27
Полиморфизм
28
Полиморфизм
Один интерфейс — множество реализаций.
И не важно, какая используется сейчас.
29
interface Container {
public function drop();
}
class Glass implements Container {
public function drop() { /* well, crash */ }
}
class Cup implements Container {
public function drop() { /* well, crash, and throw the handle out */ }
}
class Cat {
public function dropContainer(Container $container) {
$container->drop();
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
30
$cat = new Cat();
$cat->dropContainer(new Glass());
$cat->dropContainer(new Cup());
$cat->runAway();
01.
02.
03.
04.
31
class ContainerCollection implements Iterator {
public function current() : Container { /* ... */ };
// ...
}
 
$containersOnTable = new ContainerCollection();
 
// Your mom fills the collection here:
$eventManager->dispatch('serve_table', $containers);
 
array_walk($containersOnTable,
function(Container $container) use ($cat) {
$cat->dropContainer($container);
}
);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
32
Инкапсуляция помогает скрыть реализацию за абстракицей.
Наследование помогает строить абстракции.
Полиморфизм помогает писать код на основе абстракций.
33
34
Методы классов
35
class SearchEngine {
public function indexProduct(Product $product) {
$addToIndex = $product->isVisible();
if ($addToIndex) {
$this->productIndex->add($product);
}
}
}
01.
02.
03.
04.
05.
06.
07.
08.
36
Три вида сообщений:
•   Команда
•   Запрос
•   Документ
37
Метод-команда
•   принимает запрос на изменение состояние объекта,
•   ничего не возвращает (void),
•   выполняется успешно, либо бросает исключение.
38
Метод-запрос
•   принимает запрос на получение информации,
•   возвращает значение указанного типа,
•   если это невозможно, возвращает NULL ,
•   или бросает исключение,
•   никогда не меняет наблюдаемое состояние объекта.
*
*
39
Принцип:
Command Query Separation (CQS)
40
Избегайте сеттеров
41
class Person {
private $firstName, $lastName, $gender, $email;
// __constructor()
// getters
// setters
}
 
$person = new Person('Sheldon', 'Cooper', 'M', 'shelly@gmail.com');
render($person);
01.
02.
03.
04.
05.
06.
07.
08.
09.
42
class Person {
private $firstName, $lastName, $gender, $email;
// __constructor()
// getters
// setters
}
 
$person = new Person('Sheldon', 'Cooper', 'M', 'shelly@gmail.com');
 
$person->setFirstName('Penny');
$person->setGender('F');
 
render($person);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
44
Отдавайте предпочтение
неизменяемым объектам
(immutables)
46
class Person {
private $firstName, $lastName, $email, $gender;
 
public function rename(NameChangingRequest $request) {
// change first/last/... names depending on request
// throw exception if name is not male, for instance
}
 
public function changeGender(GenderChangingRequest $request) {
// A request which contains also the new name,
// maybe the reason or whatever is needed.
}
}
 
$person->changeGender(new GenderChangingRequest('M', 'New Name'));
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
47
Метод — это транзакция
48
class Product {
public function reduceQuantity($deltaQuantity) {
$this->quantity -= $deltaQuantity;
}
public function verifyStockAvailability() {
if ($this->quantity == 0) {
$this->removeFromStock();
}
}
}
 
$product->reduceQuantity($orderedQuantity);
$product->verifyStockAvailability();
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
49
class Product {
private function reduceQuantity($deltaQuantity) { /*...*/ }
private function verifyStockAvailability() { /*...*/ }
 
public function takeFromStock($quantity) {
try {
$this->reduceQuantity($orderedQuantity);
$this->verifyStockAvailability();
} catch() {
// ...
}
}
}
 
$product->takeFromStock($orderedQuantity);
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
50
Название — это интерфейс
51
$product = 'Ski Boots'; // product name
$product = 456; // product id
$product = [ // product data
'id' => 456,
'name' => 'Ski Boots'
];
01.
02.
03.
04.
05.
06.
52
function getProductUrl($product) {
return '/'
. str_replace(' ', '-', strtolower($product));
}
01.
02.
03.
04.
53
Name things by their real value
•   $product — object
•   $productName — string
•   $productId — integer / hash
•   $productData — array / structure
54
Объекты-значения
(value-objects)
55
$person->addContactInformation(
new EmailAddress('max.gopey@gmail.com')
);
$person->addContactInformation(
new LinkedInProfileUrl('@max.gopey')
);
$this->redirect(new Url('https://stackoverflow.com'));
01.
02.
03.
04.
05.
06.
07.
56
Объекты-значения не изменяются.
57
Немного практики
58
Интернет-аптека для ветеринаров.
Можно покупать товар:
•   для клиники (clinic),
•   для клиента (pet owner).
От этого зависит процесс заказа. Например, при заказе для
клиента можно оформить доставку в клинику или на дом.
59
class Cgi_Nda_Model_Order_Mode
{
const ORDER_MODE_CLINIC = 1;
const ORDER_MODE_PET_OWNER = 2;
}
01.
02.
03.
04.
05.
60
class Cgi_Nda_Model_Session
{
public function getOrderMode() : int {
return $this->getSessionValue('order_mode');
}
}
01.
02.
03.
04.
05.
06.
61
class Cgi_Nda_Block_Order_Mode_Info
{
public function getOrderMode () {
$orderMode = $this->_getSession()->getOrderMode();
if ($orderMode ) {
if ($orderMode == Cgi_Nda_Model_Order_Mode::ORDER_MODE_PET_OWNER) {
return 'For pet owner' ;
} elseif ($orderMode == Cgi_Nda_Model_Order_Mode::ORDER_MODE_CLINIC) {
return 'For clinic' ;
} else {
return false;
}
} else {
return false;
}
}
public function isSeparateShippingAddressAllowed ()
{
$orderMode = $this->_getSession()->getOrderMode();
return $orderMode &&
$orderMode == Cgi_Nda_Model_Order_Mode::ORDER_MODE_PET_OWNER
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
62
interface Cgi_Nda_Model_Order_Mode_Interface
{
public function getCode() : int;
public function getTitle() : string;
public function isSeparateShippingAddressAllowed() : bool;
}
01.
02.
03.
04.
05.
06.
07.
08.
63
class Cgi_Nda_Model_Order_Mode_Clinicimplements Cgi_Nda_Model_Order_Mode_Interface
{
public function getCode() : int {
return 1;
}
public function getTitle() : string {
return 'For Clinic';
}
public function isSeparateShippingAddressAllowed() : bool {
return false;
}
}
 
class Cgi_Nda_Model_Order_Mode_PetOwnerimplements Cgi_Nda_Model_Order_Mode_Interface
{
public function getCode() : int {
return 2;
}
public function getTitle() : string {
return 'For Pet Owner';
}
public function isSeparateShippingAddressAllowed() : bool {
return true;
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
64
class Cgi_Nda_Model_Session
{
public function getOrderMode()
: Cgi_Nda_Model_Order_Mode_Interface {
return $this->getSessionValue('order_mode');
}
}
01.
02.
03.
04.
05.
06.
07.
65
class Cgi_Nda_Block_Order_Mode_Info
{
private $orderMode;
public function __construct(
Cgi_Nda_Model_Order_Mode_Interface $orderMode
) {
$this->orderMode = $orderMode;
}
public function getOrderModeTitle() {
return $this->orderMode->getTitle();
}
public function isSeparateShippingAddressAllowed() {
return $this->orderMode->isSeparateShippingAddressAllowed();
}
}
01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
66
Survive with OOP

Más contenido relacionado

La actualidad más candente

Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
Magecom Ukraine
 
Yii development
Yii developmentYii development
Yii development
MageCloud
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Глеб Тарасов
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
Krivoy Rog IT Community
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
Pavel Novitsky
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
HappyDev
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Ontico
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
Magecom Ukraine
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
AndreyGeonya
 

La actualidad más candente (20)

WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
 
Профилирование и отладка Django
Профилирование и отладка DjangoПрофилирование и отладка Django
Профилирование и отладка Django
 
Yii development
Yii developmentYii development
Yii development
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Javascript
JavascriptJavascript
Javascript
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
 
Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)Meet Magento Belarus debug Pavel Novitsky (rus)
Meet Magento Belarus debug Pavel Novitsky (rus)
 
Andrew Borisenko "Magic of Vue.js""
Andrew Borisenko  "Magic of Vue.js""Andrew Borisenko  "Magic of Vue.js""
Andrew Borisenko "Magic of Vue.js""
 
Магия метаклассов
Магия метаклассовМагия метаклассов
Магия метаклассов
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
 
Как программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногуКак программировать на JavaScript и не выстрелить себе в ногу
Как программировать на JavaScript и не выстрелить себе в ногу
 

Destacado

Kihada_Brand_Marketing_Advertsing
Kihada_Brand_Marketing_AdvertsingKihada_Brand_Marketing_Advertsing
Kihada_Brand_Marketing_Advertsing
Rene Quijada
 
Website numbers for linkedin
Website numbers for linkedinWebsite numbers for linkedin
Website numbers for linkedin
Benedicte Brocks
 

Destacado (15)

ITD 0315 project 2 (Object 2)
ITD 0315 project 2 (Object 2) ITD 0315 project 2 (Object 2)
ITD 0315 project 2 (Object 2)
 
Kihada_Brand_Marketing_Advertsing
Kihada_Brand_Marketing_AdvertsingKihada_Brand_Marketing_Advertsing
Kihada_Brand_Marketing_Advertsing
 
Μέμα- Επανάληψη 4ης ενοτητας
Μέμα- Επανάληψη 4ης ενοτηταςΜέμα- Επανάληψη 4ης ενοτητας
Μέμα- Επανάληψη 4ης ενοτητας
 
Μέμα Ω, ω
Μέμα Ω, ω  Μέμα Ω, ω
Μέμα Ω, ω
 
Mladí a Násilí z nenávisti 2014 - výzkumná zpráva #1
Mladí a Násilí z nenávisti 2014 - výzkumná zpráva #1Mladí a Násilí z nenávisti 2014 - výzkumná zpráva #1
Mladí a Násilí z nenávisti 2014 - výzkumná zpráva #1
 
Retour d'expérience, les poubelles à puce à Ecaussinnes
Retour d'expérience, les poubelles à puce à EcaussinnesRetour d'expérience, les poubelles à puce à Ecaussinnes
Retour d'expérience, les poubelles à puce à Ecaussinnes
 
Website numbers for linkedin
Website numbers for linkedinWebsite numbers for linkedin
Website numbers for linkedin
 
Unido tool kit 2-textbook
Unido tool kit 2-textbookUnido tool kit 2-textbook
Unido tool kit 2-textbook
 
Paco Etxeberria
Paco EtxeberriaPaco Etxeberria
Paco Etxeberria
 
HVS Global Brochure
HVS Global BrochureHVS Global Brochure
HVS Global Brochure
 
Write That Down! Van Wilder's Guide to Social Media
Write That Down!  Van Wilder's Guide to Social MediaWrite That Down!  Van Wilder's Guide to Social Media
Write That Down! Van Wilder's Guide to Social Media
 
Sanduiche da Maricota
Sanduiche da MaricotaSanduiche da Maricota
Sanduiche da Maricota
 
Late Adulthood: changes & challenges
Late Adulthood: changes & challengesLate Adulthood: changes & challenges
Late Adulthood: changes & challenges
 
Earn More Work Less, Teach ESL Online
Earn More Work Less, Teach ESL OnlineEarn More Work Less, Teach ESL Online
Earn More Work Less, Teach ESL Online
 
Χάσαμε τη γάτα - Α ΄Δημοτικου - Γλώσσα
Χάσαμε τη γάτα - Α ΄Δημοτικου - ΓλώσσαΧάσαμε τη γάτα - Α ΄Δημοτικου - Γλώσσα
Χάσαμε τη γάτα - Α ΄Δημοτικου - Γλώσσα
 

Similar a Survive with OOP

ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf Conference
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
BlackFan
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
solit
 
Регрессионное тестирование верстки
Регрессионное тестирование версткиРегрессионное тестирование верстки
Регрессионное тестирование верстки
Talks&Works
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
DrupalCampDN
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
ITmozg
 

Similar a Survive with OOP (20)

Объектное и прототипное программирование в Javascript
Объектное и прототипное программирование в JavascriptОбъектное и прототипное программирование в Javascript
Объектное и прототипное программирование в Javascript
 
Толстая модель. История разработки ORM
Толстая модель. История разработки ORMТолстая модель. История разработки ORM
Толстая модель. История разработки ORM
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложениеASP.NET MVC - как построить по-настоящему гибкое веб-приложение
ASP.NET MVC - как построить по-настоящему гибкое веб-приложение
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
Next Gen Applications
Next Gen ApplicationsNext Gen Applications
Next Gen Applications
 
Регрессионное тестирование верстки
Регрессионное тестирование версткиРегрессионное тестирование верстки
Регрессионное тестирование верстки
 
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
 
Bytecode
BytecodeBytecode
Bytecode
 
Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.Импорт данных с фреймворком Migrate. Владислав Богатырев.
Импорт данных с фреймворком Migrate. Владислав Богатырев.
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 

Survive with OOP