Created
May 31, 2018 21:18
-
-
Save mickgeek/91513a96ca5d5befbfa8becfd19c0daf to your computer and use it in GitHub Desktop.
cheat sheet
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
RFC (Request for Comments; Приглашение к обсуждению) - документы, которые рассматриваются как стандарты Интернета (о протоколах и технологиях). | |
# Сетевая модель OSI (Open Systems Interconnection Model; Модель взаимодействия открытых систем) | |
Модель сетевых протоколов, определяющая уровни взаимодействия систем. Стек слоев (построены поверх друг друга): | |
7. Прикладной (Application), данные: DNS, HTTP, SMTP... | |
6. Представления (Presentation), данные: ASCII, JPEG... | |
5. Сеансовый (Session), данные: RPC... | |
4. Транспортный (Transport), сегменты/дейтаграммы: TCP (Transmission Control Protocol), UDP... | |
3. Сетевой (Network), пакеты: IP (Internet Protocol), IPsec... | |
2. Канальный (Data Link), кадры: IEEE 802.22, Ethernet... | |
1. Физический (Physical), биты: USB, витая пара... | |
TCP/IP - сетевая модель передачи данных, включающая в себя четыре уровня: прикладной, транспортный, сетевой и канальный. | |
## DNS (Domain Name System; Система доменных имен) | |
Хранилище соответствия доменных имен IP-адресам, состоит из ресурсных записей и [других параметров](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml). | |
NS-запись - связывает имя домена с DNS-сервером (содержит имя хоста). | |
A-запись - сопоставляет имя домена (содержит IPv4-адрес). | |
AAAA-запись - сопоставляет имя домена (содержит IPv6-адрес). | |
CNAME-запись - сопоставляет алиас для A-записи (содержит имя домена). | |
MX - определяет маршрутизацию электронной почты (содержит имя хоста). | |
FQDN (Fully Qualified Domain Name; Полностью определённое имя домена) | |
## HTTP (HyperText Transfer Protocol; Протокол передачи гипертекста) | |
### HTTP-запрос | |
``` | |
GET /users HTTP/1.1 - строка запроса (Метод URI HTTP/Версия) | |
[Заголовки] | |
[Тело] | |
``` | |
Методы: | |
- `GET /users` - список всех записей | |
- `HEAD /users` - HEAD-ответ идентичен GET-ответу, отсутствует только тело | |
- `POST /users` - создание записи | |
- `PUT /users/123` - чаще всего полное обновление записи по идентификатору | |
- `PATCH /users/123` - частичное обновление записи по идентификатору | |
- `DELETE /users/123` - удаляет запись по идентификатору | |
- `OPTIONS /users/123` - возвращает список разрешённых методов для ресурса | |
- `TRACE /` - возвращает содержание запроса, может использоваться для отладки | |
- `CONNECT /` - устанавливает соединение с сервером | |
Методы выше часто используются для создания RESTful API, [подробное описание и примеры](https://www.tutorialspoint.com/http/http_methods.htm). | |
### HTTP-ответ | |
``` | |
HTTP/1.0 200 OK - строка ответа (HTTP/Версия Статус Причина) | |
[Заголовки] | |
[Тело] | |
``` | |
# Парадигмы программирования | |
- Императивный стиль описывает "как" добиться нужного результата. | |
Пример (объектно-ориентированный стиль): ButtonHelper::setType('button') или $button->setType('button') | |
Пример (процедурный стиль): set_type('button') | |
- Декларативный стиль описывает "что" представляет собой нужный результат. | |
Пример (HTML): <button type="button"> | |
Пример (XML): <service id="app.user.manager" class="App\EntityManager\UserManager" /> | |
## ООП (объектно-ориентированное программирование) | |
Подход к написанию ПО, который подразумевает использование характеристик классов в динамическом (через объекты) или статическом контексте. | |
Основные понятия: | |
- Класс - тип данных, описанный пользователем. | |
- Объект - экземпляр класса; сущность, способная сохранять своё состояние. | |
- Абстрактный класс - шаблон класса, который может содержать абстрактные методы для замещения. | |
- Интерфейс - шаблон класса, который содержит только абстрактные методы (косвенным образом, без использования ключевого слова abstract). | |
Базовые принципы: | |
- (Абстракция) - выделение общих характеристик (данных и методов) класса. | |
- Инкапсуляция - сокрытие реализации класса, невозможность манипуляции свойствами напрямую. | |
Пример: class Cryptocurrency { private $name; public function __construct($name) { $this->name = $name; } public function getName() { return $this->name; } } | |
- Наследование - механизм выстраивания иерархии классов, с помощью которого производный класс может получить характеристики базового класса. | |
- Полиморфизм - возможность производных классов описывать методы с одинаковой сигнатурой, но с разным набором инструкций (концепция - один интерфейс, множество реализаций). | |
Пример: | |
abstract class CurrencyInterface { public function getName() { return 'Dollar'; } } | |
class CryptocurrencyInterface extends CurrencyInterface { public function getName() { return 'Bitcoin'; } } | |
## Процедурное программирование | |
Основывается на описании переменных, хранящих простые типы данных, и методов. Процедурную программу можно рассматривать как последовательность инструкций. | |
## Функциональное программирование | |
Подразумевает использование методов и только их. Подобно математическим преобразованиям. | |
# Принципы ПО | |
- DRY (Don't Repeat Yourself) - Не повторяйся | |
- KISS (Keep It Simple, Stupid) - Не усложняй, тупица | |
- YAGNI (You Ain't Gonna Need It) - Тебе это не понадобится | |
## SOLID, Принципы Роберта Мартина (Дяди Боба): | |
- Single Responsibility Principle (SRP; Принцип единственной обязанности) - каждый класс должен покрывать только одну зону обязанности. | |
- Open/Closed Principle (OCP; Принцип открытости/закрытости) - сущности должны быть открытыми для расширения, но закрытыми для модификации. | |
Пример: | |
class BaseBitcoin { public function getRank() { return 1; } } | |
class Bitcoin extends BaseBitcoin { public function getRank() { return date('Y-m-d') > '2018-01-15' ? BlockchainAPI::readRank($this->getName()) : 1; } } | |
- Liskov Substitution Principle (LSP; Принцип подстановки Барбары Лисков) - должна быть возможность вместо базового класса подставить любой его производный. | |
Пример: | |
class Currency { public function getDescription() { return $this->description; } } | |
class Cryptocurrency extends Currency { public function getTransactionCount() { return $this->transactionCount; } } | |
class ViewHelper { static public function encodeDescription(Cryptocurrency $currency) { return htmlspecialchars($currency->description, ENT_QUOTES); } } | |
- Interface Segregation Principle (ISP; Принцип разделения интерфейса) - много специализированных интерфейсов лучше, чем один универсальный. | |
Пример: TransactionSuccessHandlerInterface и TransactionFailureHandlerInterface вместо TransactionHandlerInterface | |
- Dependency Inversion Principle (DIP; Принцип инверсии зависимостей) - зависимости должны строится относительно абстракций, а не деталей. | |
Пример: | |
interface CryptocurrencyInterface { public function getName(); } | |
class Cryptocurrency implements CryptocurrencyInterface { public function getName() { return $this->name; } } | |
class CryptocurrencyHelper { static public function getCharts(CryptocurrencyInterface $currency) { return BlockchainAPI::readCharts($currency->getName()); } } | |
## GRASP (General Responsibility Assignment Software Patterns (или принципы); Основные паттерны (или принципы) распределения обязанностей в ПО), Принципы Крэга Лармана: | |
- Information Expert (Информационный эксперт) - ответственность должна быть назначена классу, обладающему максимумом информацией, необходимой для исполнения обязанностей (см. Abstract Factory). | |
- Creator (Создатель) - класс должен создавать экземпляры тех классов, которые он может: содержать или агрегировать/записывать/использовать/инициализировать. | |
- Controller (Контроллер) - отвечает за обработку пользовательских событий и делегирует работу компетентным классам. | |
- Low Coupling (Низкая связность) - принцип слабой зависимости от других классов. | |
- High Cohesion (Высокое зацепление) - принцип разбиения приложения на классы и компоненты. | |
- Polymorphism (Полиморфизм) - использование альтернативных методов на основе базового класса через обобщённый интерфейс. | |
- Pure Fabrication (Чистая выдумка) - введение дополнительного класса в предметной области для исполнения обязанностей концептуально не принадлежащих к предметной области (соответствует элементу Service в DDD). | |
- Indirection (Перенаправление) - реализует низкую связность, путём назначения обязанностей по их взаимодействию дополнительному классу-посреднику (см. Adapter, Facade, Observer). | |
- Protected Variations (Устойчивость к изменениям) - обеспечение устойчивости интерфейса путём введения нового интерфейса. | |
# Паттерны проектирования | |
- CQRS (Command Query Responsibility Segregation) - https://martinfowler.com/bliki/CQRS.html | |
- IoC (Inversion of Control; Инверсия управления) - https://martinfowler.com/bliki/InversionOfControl.html - любой код, где отдаётеся управление какому-то внешнему компоненту, и ожидаются результаты его работы, чтобы продолжить, является реализацией IoC. | |
Реализации: Dependency Injection, Factory Method, Service Locator. | |
- Dependency Injection (DI; Внедрение зависимостей) - концепция, которая заключается в передаче требуемых зависимостей определенному типу. | |
- Service Locator (Локатор служб) - антипаттерн, в котором контейнер используется непосредственно объектами. | |
- EAV (Entity-Attribute-Value) - доменная модель для описания объектов, в которых атрибуты (свойства, параметры) могут использоваться для их описания. | |
Ссылки: | |
- https://en.wikipedia.org/wiki/Software_design_pattern | |
- https://github.com/domnikl/DesignPatternsPHP | |
- https://github.com/nixsolutions/design-patterns | |
## Паттерны проектирования, Паттерны банды четырёх (Gang of Four): | |
Creational (Порождающие): | |
- Abstract Factory (Абстрактная фабрика) - интерфейс для создание семейств взаимосвязанных объектов без указания их точных подтипов. | |
- Factory Method (Фабричный метод) - создание объектов с одинаковым интерфейсом концентрируется в отдельном методе. | |
- Builder (Строитель) - создание сложного объекта через интерфейс, в котором присутствует его разделение на части. | |
- Prototype (Прототип) - создание объектов на основе прототипа (через клонирование). | |
- Singleton (Одиночка) - антипаттерн, который создаёт только один экземпляр объекта в приложении. | |
Structural (Структурные): | |
- Adapter (Адаптер) - перевод интерфейса, недоступного для модификации, в совместимый интерфейс. | |
- Bridge (Мост) - отделение абстракции от реализации так, чтобы они могли изменяться независимо; использует инкапсуляцию, агрегирование и может использовать наследование. | |
- Facade (Фасад) - предоставляет высокоуровневый интерфейс (сложного объекта); похож на Builder. | |
- Proxy (Заместитель) - предоставляет интерфейс к другому классу, выполняя функцию контейнера; используется для lazy initialization. | |
- Decorator (Декоратор) - динамическое добавление функционала к объекту; похож на trait. | |
- Сomposite (Компоновщик) - обработка как группы объектов, так и одного, имея одинаковый интерфейс. | |
- Flyweight (Приспособленец) - повторное использование одного и того же класса, меняя его состояние. | |
Behavioral (Поведенческие): | |
- Observer (Наблюдатель) - механизм подписки, с помощью которого одни объекты могут подписываться на обновления. | |
- Mediator (Посредник) - обеспечивает взаимодействие множества объектов; использует инкапсуляцию; альтернатива Observer. | |
- Strategy (Стратегия) - разделение стратегий действий и обеспечить быстрое переключение между ними. | |
- Command (Команда) - отделение инициатора (клиента) от получателя команды. | |
- Visitor (Посетитель) - делегирование операций объекта другому объету. | |
- State (Состояние) - изменение состояния объекта; использует инкапсуляцию. | |
- Memento (Хранитель) - позволяет зафиксировать и сохранить внутреннее состояние объекта. | |
- Template Method (Шаблонный метод) - определяет скелет алгоритма, хорошо подходящий для фреймворков. | |
- Chain of Responsibility (Цепочка обязанностей) - строит цепочку объектов для обработки вызова в последовательном порядке (если запрос не обработан, то он передается дальше). | |
- Iterator (Итератор) - делает объект итерабельным и похожим на коллекцию объектов. | |
- Interpreter (Интерпретатор) - предоставляет формальный язык и обрабатывает его выражения через интерпретатор. | |
Ссылки: | |
- https://github.com/nixsolutions/design-patterns | |
- https://github.com/domnikl/DesignPatternsPHP | |
- https://ru.wikipedia.org/wiki/Design_Patterns | |
- https://habrahabr.ru/post/210288/ | |
## Архитектурные паттерны, Паттерны Мартина Фаулера: | |
Web Presentation (Веб-представления): | |
- Model View Controller (MVC) - разделение обработки пользовательский событий, доменной логики и представлений. | |
- Front Controller - единая точка входящих запросов (index.php). | |
- Application Controller - единая точка управления отображением и выполнением приложения. | |
- Page Controller - объект, обрабатывающий запрос к отдельной странице или действию. | |
... | |
Domain Logic (Доменной логики): | |
- Domain Model (Доменная модель) - объектная модель доменного уровня, объединяющая данные и поведение. | |
- Service Layer (Сервисный уровень) - инкапсулирует бизнес-логику приложения. | |
... | |
Data Source Architectural (Архитектуры источников данных): | |
- Active Record (Активная запись) - управляет и данными, и поведением. | |
- Data Mapper (Обработчик данных) - прослойка, разделяющая объект и БД. | |
... | |
Object-Relational Metadata Mapping (Обработка объектно-реляционных метаданных): | |
- Metadata Mapping (Обработка метаданных) - хранит данные об объектно-реляционном распределении в метаданных. | |
- Repository (Репозиторий) - посреднник между доменным уровнем и уровнем обработки метаданных. | |
- Query Object (Объект-запрос) - объект, представляющий запрос к БД. | |
Object-Relational Behavioral (Объектно-реляционные поведенческие): | |
- Unit of Work (Единица работы) - обслуживает набор объектов, изменяемых в бизнес-действиях. | |
- Lazy Load (Ленивая загрузка) - отказ от загрузки дополнительных данных, когда в этом нет необходимости; ставится маркер о том, что данные не загружены и загружает их при обращении. | |
- Identity Map (Карта соответствия) - обеспечивает однократную загрузку объекта, сохраняя данные в объекте. | |
Object-Relational Structural (Объектно-реляционные структурные): | |
- Identity Field (Поле первичного ключа) - хранит первичный ключ из БД в объекте. | |
- Foreign Key Mapping (Разметка внешних ключей) - представляет отношения по внешним ключам между таблицами в виде отношений между объектами. | |
... | |
Distribution (Распределения данных): | |
- Data Access Object (DAO; Объект передачи данных) - объект, который предоставляет абстрактный интерфейс к какому-либо хранилищу; с поведениями. | |
- Data Transfer Object (DTO; Объект передачи данных) - объект, который используется для передачи данных между компонентами системы. | |
... | |
Session State (): ... | |
Offline Concurrency (): ... | |
Base (Базовые): | |
- Value Object (Объект-значение) - объект для хранения данных. | |
- Layer Supertype (Супертип уровня) - тип, выступающий родительским для всех типов в своём уровне. | |
- Mapper (Распределитель) - управляет сообщением между независимыми друг от друга объектами. | |
- Gateway (Шлюз) - инкапсулирует доступ к внешней системе и ресурсу. | |
... | |
Ссылки: | |
- https://martinfowler.com/eaaCatalog/ | |
# PHP | |
PSR (PHP Standards Recommendations; Рекомендации PHP-стандартов) - документы, которые рассматриваются как стандарты PHP: | |
- PSR-1 - Basic Coding Standard | |
- PSR-2 - Coding Style Guide | |
- PSR-0 - Autoloading Standard (deprecated) | |
- PSR-4 - Autoloading Standard | |
- PSR-3 - Logger Interface | |
- PSR-7 - HTTP Message Interface | |
- PSR-11 - [Container Interface](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container-meta.md#4-recommended-usage-container-psr-and-the-service-locator) | |
- PSR-13 - Hypermedia Links (for link utilities) | |
- PSR-6 - Caching Interface | |
- PSR-16 - Simple Cache (in contrast to PSR-6, for simple use-cases) | |
- PSR-5 (draft) - PHPDoc Standart (Documentation Standart) | |
Основные понятия: | |
- Литерал - значение переменной (числовой/строковой/булев литерал или литерал массива). | |
- Рекурсия - когда функция вызывает саму себя (непрямая рекурсия - когда первая функция вызывает вторую, а вторая - первую). | |
- Массив (список) - тип данных, который устанавливает соответствие между значением и ключом. | |
- Хэш-таблица - ассоциативный массив. | |
- Граф - дерево. | |
- Замыкание (http://javascript.ru/basic/closure) - лямда/анонимная функция (функция, охватывающая или замыкающая текущую область видимости). | |
- Sessions - файлы на сервере ($_SESSION) | |
- Cookies - файлы на клиенте ($_COOKIE) | |
Тестирование: | |
- Юнит-тестирование - тестирование отдельных классов. | |
- Интеграционные тесты - тестирование компонентов/классов в связке (обычно, если присутствует работа с ФС или БД). | |
- Функциональное тестирование - тестирование сценариев, заполняя среду параметрами POST и GET. | |
- E2E-тесты - тесты пользовательского уровня. | |
SPL (Standard PHP Library; http://php.net/manual/ru/book.spl.php): | |
- Iterator - для реализации собственных алгоритмов итерации PHP. | |
- SplDoublyLinkedList – двусвязный список. | |
- SplHeap - куча в виде бинарного дерева, каждый узел которого имеет не более двух дочерних узлов. | |
- SplFixedArray - массив фиксированной длины, индексами которого могут быть только целые числа. | |
- SplObjectStorage – хранилище объектов, предоставляет интерфейс для сопоставления объектов к данным. | |
Ключевые отличия версий: | |
http://php.net/manual/ru/migration53.new-features.php (пространство имён, позднее статическое связывание, замыкания) | |
http://php.net/manual/ru/migration54.new-features.php (трейты, короткий синтаксис массивов) | |
http://php.net/manual/ru/migration55.new-features.php (суффик "::class" после имени класса, генераторы (http://php.net/manual/ru/language.generators.overview.php), ключевое слово finally в try-catch) | |
http://php.net/manual/ru/migration56.new-features.php (скалярные выражения в константах, ... - неограниченное множество аргументов в виде массива, use function и use const) | |
http://php.net/manual/ru/migration70.new-features.php (декларация скалярных типов, декларация возврата, анонимные классы, групповые декларации use) | |
http://php.net/manual/ru/migration71.new-features.php (префикс "?" перед типом в декларации, void в декларации возврата, видимость констант класса) | |
http://php.net/manual/ru/migration72.new-features.php (новый тип object, добавлен алгоритм хеширования Argon2, разрешена завершающая запятая для групповой декларации use) | |
Ссылки: | |
https://habrahabr.ru/post/230805/ | |
https://habrahabr.ru/post/324934/ | |
https://habrahabr.ru/post/233129/ - PHP-транслятор | |
http://php.net/manual/ru/features.gc.refcounting-basics.php - Garbage Collection | |
# Database | |
SQL (Structured Query Language; Язык структурированных запросов): | |
- (INNER) JOIN - в выборке будут присутствовать только записи, значение связанных полей в которых совпадают. | |
- RIGHT JOIN - левое внешнее соединение, в результате которого присутствуют все записи из Table1 и соответствующие записи из Table2 (если соответствий нет, поля из Table2 будут пустыми). | |
- LEFT JOIN - левое внешнее соединение, в результате которого присутствуют все записи из Table2 и соответствующие записи из Table1 (если соответствий нет, поля из Table1 будут пустыми). | |
Основные понятия: | |
- Кортеж - строка таблицы (конечное множество взаимосвязанных допустимых значений атрибутов, которые вместе описывают некоторую сущность) | |
- Предикаты - выражения, принимающие истинностное значение (предикаты в SQL: TRUE, FALSE или UNKNOWN; операторы-исключения (не возвращают UNKNOWN): NULL, EXISTS, UNIQUE и MATCH). | |
- Индекс - отсортированный набор значений (используются для увеличение скорости доступа к данным). | |
- Составной индекс - для запросов, в которых используется несколько атрибутов. | |
Нормализация - организация БД (устранение из базы избыточных функциональных зависимостей между атрибутами): | |
Первая нормальная форма: | |
- Устраните повторяющиеся группы в отдельных таблицах. | |
- Создайте отдельную таблицу для каждого набора связанных данных. | |
- Идентифицируйте каждый набор связанных данных с помощью первичного ключа. | |
Вторая нормальная форма: | |
- Создайте отдельные таблицы для наборов значений, относящихся к нескольким записям. | |
- Свяжите эти таблицы с помощью внешнего ключа. | |
Третья нормальная форма: | |
- Устраните поля, не зависящие от ключа. | |
Связи (http://www.online-academy.ru/demo/access/urok1/teor/teor4.htm): | |
- Один к одному - У одного пользователя есть одна корзина. | |
- Один ко многим - У одного пользователя есть много адресов доставки. | |
- Многие к одному - Много адресов доставки у одного пользователя. | |
- Многие ко многим - Много товаров добавлено в множество корзин. | |
Ссылки: | |
https://jsehelper.blogspot.ru/2016/01/sql-1.html | |
https://habrahabr.ru/post/254773/ | |
# Другое | |
- Web API (Web Service): XML-RPC (Extensible Markup Language Remote Procedure Call), SOAP (Simple Object Access Protocol), REST (Representational State Transfer). | |
- JSON (JavaScript Object Notation), XML (Extensible Markup Language), CSV (Comma-Separated Values) - формат, предназначенный для представления табличных данных. | |
- URI (Uniform Resource Identifier) - строка, позволяющая идентифицировать какой-либо ресурс. | |
- URL (Uniform Resource Locator) - URI, который, помимо идентификации ресурса, предоставляет ещё и информацию о местонахождении этого ресурса. | |
- MVP (Minimum Viable Product) | |
- CI (Continuous Integration, Непрерывная интеграция) | |
## Методологии | |
- Agile software development (Гибкая методология разработки): XP (Extreme Programming; Экстремальное программирование), Scrum. | |
- TDD (Test-Driven Development; Разработка через тестирование) | |
### DDD (Domain-Driven Design; Предметно-ориентированное проектирование) | |
- Domain Layer (Доменный слой): модели и интерфейсы. | |
- Infrastructure Layer (Слой инфраструктуры): реализации доменного слоя, мапперы, репозитории. | |
- Application Layer (Слой приложения): хендлеры экшенов. | |
- Presentation Layer (Презентационный слой): фреймворк (запросы и ответы, валидация), представления. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment