Skip to content

Instantly share code, notes, and snippets.

@mickgeek
Created May 31, 2018 21:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mickgeek/91513a96ca5d5befbfa8becfd19c0daf to your computer and use it in GitHub Desktop.
Save mickgeek/91513a96ca5d5befbfa8becfd19c0daf to your computer and use it in GitHub Desktop.
cheat sheet
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