Please enable JavaScript.
Coggle requires JavaScript to display documents.
Java ( Hibernate ( Hibernate and ORM
Hibernate реализация механизма…
Java
GENERAL
Hibernate - ведущий persistence provider
Entity - POJO класс с добавление конфигурционной информации
Persistence unit - ииенованная конфигурация
Entity manager - интерфейс для доступа к БД
Persistence context - набор entity, управляемый entity manager
Сильно упрощает работу с БД, но скрывает детали
До Hibernate был EJB 2
-
Связи
One-to-one
One-to-many(many-to-one)
Many-to-many
Связи между сущностями настраиваются через аннтоации(xml)
В Hibernate много значений по умолчанию, но о некоторых Hibernate пытается "догодаться" самостоятельно
Flush Policy
- не сразу переносит изменения из persistence context в БД
- есть несколько вариантов для настройки выпоплнения flush
- JPA - Commit и Auto
- перед выполнением select выполняется flush(перед выполнением native запроса только с Hibernate 4.3.0)
-
Проблема N+1 Select
JOIN FETCH
Не работает с постраничным выводом, возвращает все строки
Нормализация нарушают для перфоманса, потому что JOIN дороже SELECTEmbedded и Embeddable - для денормализации схемы БД
При ошибках
Необходимо проверять SQL запросы, которые могут делить транзакции
Диалекты для разных БД
Логи запросов( Log4JDBC - библиотека для получения настоящих запросы и результаты и время их выполнения)
- Session merge vs update
Методы:
-merge переводит из detached в managed
-merge переводит из new в managed
- update - detached - managment
- What is ORM design pattern? How it works?
- ORM - решает проблему несоответствия объектно-реляционного отображения
- ORM - для осуществления связи POJO с таблицами базы данных(Адаптер)
- Мапятся колонки на поля
- ORM(object-relational mapping) работает через JDBC driver
- В Java есть спецификация(набор интерфейсов) JPA(Java Persistence API)
- Advantages of ORM
- Увеличивает скорость разработки, нет SQL
- уменшает объём кода
- может менять легко database driver
- работаешь с кодом, а не с sql
- Hibernate Framework overview
- Hibernate ORM
- Hibernate Validator
- Hibernate OGM
- Hibernate Search
- Hibernate Tools
- Others
- Hibernate and ORM
Hibernate реализация механизма ORM
Hibernate - ORM Framework
-
- JPA overview. Hibernate and JPA
JPA - Java Persistence Api(javax.persistence) - спецификация Java EE, для реализации ORM framework
Hibernate наследуется от JPA, и добавляет свой функционал
-
- Hibernate vs JDBC: advantages and disadvantages of using
- JDBC быстрее
- Hibernate имеет кэш
- Hibernate предоставляет более высокоуровнивый интерфейс для работы с транзакциями по сравнения с JDBC
- Hibernate поддерживает HQL
- Hibernate переносится на другую СУБД
- Hibernate позволяет работать из кода, нет связи на SQL запросы
- в JDBC явно видны запросы, в Hibernate они скрыты
- Hibernate important interfaces
SessionFactory
Session
Transaction
Configuration
Query and Criteria
- Hibernate configuration file
- persistence.xml
- hibernate.cfg.xml
- hibernate.properties
- используя аннотации
- Hibernate mapping file
Мапить можно через pesistence.xml и через аннотации
Entity
Column
Basic - обозначает базовый тип
Column - для определения имени таблиц и столбцов
Type - указать тип поля
- SessionFactory and Session in Hibernate
- SessionFactory - thread-safe(immutable) представление отображение модели предметной области приложения в базу данных. Действует как фабрика создания обектов hibernate.session
- Session - однопоточный недолговечный объект, концептуально моделирующий единицу работы. За кулисами hibernate.session оборачивает JDBC java.sql.connection в виде фабрики объектов hibernate.transaction(использует кэш первого уровня)
- Transaction - однопоточный недолговечный объект, используемый приложением для разделения границ отдельных физических транзакций. Действует как абстракция от низкоуровневой транзакционной системы в JDBC
-
- Hibernate caching. Levels of cache
В Hibernate 3 уровня кэша:
- Первого уровня - нельзя отклчюить, результаты запросов(текущей сессии)
- Второго уровня - должен быть явно включен и настроен, кеширует сущности среди нескольких entity manager(общий кеш между нескольки sessions)
Cacheble
- Третего уровня - кеширует результаты запросов по запросу и его параметрам
(сохраняет айдишники на кеш второго уровня)
Метод refresh выгружает актуальное состояние4 стратегии для кэша второго уровня кэширования:(различаются уровнями изоляции транзакции)
- Read-only(отключает проверки синхронизации)
- Read-write(синхронизация )
- Nonstrict-read-write
- Transaction
- Save vs saveOrUpdate vs persist
- Save и SaveOrUpdate - можно вызвать вне транзакции
- Persist - только в транзакции
Save переводит из new в managed
SaveOrUpdate переводит из new в managed
SaveOrUpdate переводит из detached в managed
Persist из new в managed(но только внутри транзакции)
- Joins implementation in Hibernate
JOINS можно делать через аннотации, ассоциации(OneToMany,ManyToONe....)
- Lazy loading in Hibernate
OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
Default:
OneToMany и ManyToMany - LAZY
ManyToOne и ManyToMany - EAGER
- HQL overview
HQL язык запросов с объектами
HQL - Подмножество SQL для работы с нашими объектами в не зависимости от базы данных
В Hql можно делать joins
Не зависит от вендеров СУБД
- Query cache in Hibernate
Отдельный подвид кеша, 2.5 уровень
- Different types of cascading?
- Persist - при сохранении entity, сохраняются и сущности хранящиеся в нём
- Remove - тоже самое при удалении
- Refresh - тоже самое при обновлении
-Merge - переводит из detached в managed и связанные с ним
- Detached - переводит состояние в detached и связанные с ним
- All - объединяет всех
20.Вначале попытаться уйти от резделяемых данных, если не получается, то ограничить данные одним потоком, если не получается, то передизайнить приложение и делать критические секции маленькими
GENERAL
Жизненный цикл: через states
- Процесс джава работает пока есть любой не демон поток
- На каждый тред работает со своей областью стек памяти( в нем методы и локальные переменные)
-heap общая область для потоков(мониторы для синхронизации доступа)
-Проблемы:
не детерменированое поведение потоков, проблема разделенного доступаinterupt - ставит флагhttps://habr.com/ru/company/luxoft/blog/157273/как освобождение/захват монитора, так и записать/чтение в volatile переменную связаны отношением happens-before
- What is a process in term of Java?
- Один процесс, много потоков, потоками управляет ОС, процесс jvm заканчивается с последним потоком
- Процесс исполняемая ОС программа, и с выделенными для неё ресурсами(контейнер потоков)
- Процесс Java - экземпляр запущенной JVM
- среда выполнения под которую ОС выделила ресурсы
- What is a thread and how to implement it?
- Поток - единица исполнения программы(которая делит ресурсы процесса с другими потоками)
- три способа: Tread, Runnable, Callable
- Resources is assigned to a thread
Каждому потоку выделяются:
- стек исполнения
- стек нативных вызовов
- process counter
Heap общая область для всех потоков.
- Interaction of threads with a single method(static, non static), variables (local, global). Understanding of memory model in terms of a thread
При доступе к глобальным переменным происходит конкурентном доступе
- Life cycle of thread
States:
- NEW
- RUNNABLE
- BLOCKED - ждём монитор
- WAITING - join, wait
- TIMED_WAITING - sleep(), join(), wait()
- TERMINATED
-
- Demon and none Demon threads, comparison
Daemon Thread - второстепенный поток, который прерывается при завершении всех не Daemon потоков(поток, который не держит процесс JVM)
- Runnable vs Thread for running a new thread. Best practice
Не имеет особого значения, но Runnable - интерфейс, поэтому его проще наследовать
- Threads Scheduler what is it, how it manages threads
- Thread Sheduler - Механизм управления потоками, часть JVM
- Управляется ОС, можно только указать приоритет
Green Sheduling and Native Sheduling
Timeslicing and preemtev
- Monitor in Java. Monitor usage best practice
Монитор - сущность управляющая доступом к синхронизированному блоку кода
Монитором может быть класс или объект в java, по сути это флаг определяющий доступность ресурса для потокаСвязано с блоком synhronized, можно использовать на обычном методе, на статическом методе и просто блокМонитором может являться класс или объектМонитор - высокоуровневый механизм взаимодействия и синхронизации процессов, обеспечивающий доступ к неразделяемым ресурсам
- механизм контроля конкурентного доступа
- How Thread Scheduler manages thread conditions
- Thread Scheduler, threads and monitor interaction
- Methods of Thread class to manage threads: overview, comparison, best practice to use
- start
- sleep
- setPriority
- setDaemon
- join
- interrupt - ставит флаг(Interrupt exception, если поток interupt и для него вызываются методы wait, join, sleep)
- yield
- Methods of Object class to manage threads: overview, how to use
- Why methods to manage threads in two different classes?
- Чтобы не осуществлять взаимосвязь между потоками, монитор менеджит отдельная сущность
- потомe что монитором может быть что угодно и потому что в synhronized мы не знаем конретный работающий поток
- Sleep vs wait
- Wait - может быть безсрочным, sleep - нет
- wait - отпускает монитор, а sleep - нет
- What is volatile variable in Java? How it works?
- volatile берет значение переменной не из кэша, а из реального пула
- long и double станет атомарным
- How synhronization works in Java. Best practice
Поток захватывает монитор synhronized если он никем не занят, wait отправляет в ожидание, notify выводит из ожидания
- Synchronize and volite difference
- volatile - значит что переменная не кешируется(видна всем потокам)(запрещает оптимизация)
- synhronized - решает проблему общего доступа к ресурсам
- Устанавливают happens-before
-
- Atomic operations
Набор операций совершающихся одним действие
-
- What is Spring Framework? Different features
- для реализации принципа IoC(создаёт и связывает компоненты нашего приложения), делает код менее зацепленным, для упрощения использования JavaEE, обеспечивает легкое переключение между реализациями, модульный, упрощает тестирование
- XmlBeanDefinitionReader - сканирует xml и переводит в beanDefinition(Map) - это информация о бине(обязательны сеттеры)
- Передать context.xml в ClassPathXmlApplicationContext
- ContextListener(application listener) - ContextStartedEvent/ContextStoppedEvent/ContextRefreshedEvent/ ContextClosedEvent
- BeanPostProcessor - позволяет настраивать бины до попадания в IoC Container(Два метода BeforeInitilazation и AfterInitialization - выполняются после конструктора)(ReflectionUtils)(Init метод можно указать в xml или аннотацией PostConstruct)
- Bean
- BeanFactory - отвечает за создание и хранение всех объектов(синглтонов)
- BeanFactoryPostProcessor - работает до создания бинов и может настраивать BeanDefinitions, имеет один метод postProcessBeanFactory
- ClassPathBeanDefinitionScanner - для поиска Bean'ов обозначенных Component (не является BPP)
- AnnotationBeanDefinitionReader
- GroovyBeanDefinitionReader
- ConfigurationClassPostProcessor - создаёт BeanDefinitions по Bean
XmlBeanDefinitionReader создаёт BeanDefinition по context.xml -> BeanFactory берёт из BeanDefinition BeanPostProcessor-ы и создаёт их и настраивает -> Потом для каждого бина все методы Before у BPP-ов, потом Init, потом все After у BPP-ов-> В итоге получаем что все бины созданы в IoC Container MBean
- в autowired есть requared, если не получилось заинжектить, то можно не кидать ошибка
Component - для того чтобы сделать Bean
- Overview of Spring modules
Spring Core, Spring MVC, Spring Data, Spring AOP, Spring Batch, Spring ORM, Spring Security, Spring Cloud
- Spring core container overview
Spring expresion language
IoC(Core and Beans)
BPP
- Spring configuration file
содержится в каком-то файле (xml)
указываются все бины, конфиг базы данных, view resolvers, package scan
(5 способов
XML
Java config
Groovy Config)
- Spring IoC Container overview
Хранит созданные синглтон бины
- Dependency Injection
- виды injection
IoC - принцип ООП
DI -реализация принципа IoC
Внедрение зависимостей: через поля, конструктор, сеттеры
- Constructor injection vs setter injection vs field injection
лучше конструктор
- BeanFactory vs ApplicationContext
BeanFactory часть ApplicationContext'a
-
- What is Spring Beans?
Объект находящийся под управлением IoC контейнера
- XML-based vs Annotation-based vs Java-based configuration
- Bean Scopes overview, comparison
6 scopes
default: singleton, prototype
web-scopes:request,session,application,websocket в MVC
- Bean life cycle in Spring bean factory
-//-
- Inner beans in Spring
можно создаватьь но доп ограничения
Создаётся отношение (Parent-Child)
- Для того чтобы объявить бин, который виден только внешнему классу
- Autowiring in Spring, limitions
Modes
- no
- byName
- byType
- constructor
- autodetect
-
- Annotation-based container configuration
-
- Required vs Autowired vs Qulifier annotations
Вместе с autowired используются qulifier(если несколько бинов, то позволяет указать какой) и required(обязательная зависимость)
GENERAL
HTTP - протокол прикладного уровня передачи данных
https://jazzteam.org/ru/technical-articles/restful-services-manual/
REST (Representational State Transfer) - архитектурный стиль взаимодействия компонентов распределённого приложения в сети.
CRUD - POST/GET/PUT/DELETE
Преимущества сервиса, не хранящего состояние:
- сервис обрабатывает запросы независимо друг от друга
- архитектура сервиса упрощается
- не требуется дополнительных усилий для реализации сервисов с использованием протокола HTTP, который также не хранит состояния.
Недостатки
- клиент сам должен отвечать за передачу необходимого контекста сервису.
- Structure of Http. Optional and mandatory parts
Структура:
- Стартовая строка(Starting Line) - определяет тип сообщения
Метод URI HTTP/Версия
- Заголовок (Header) - характеризует тело сообщения, параметры передачи и прочие сведения. Content-Type- формат запроса, Accept- список форматов ответа
General Headers/Request Headers/ Response Headers/Entity Headers
- Тело сообщения(Message Body) - непосредственно данные сообщения. Обязательно должно отделяться от заголовков пустой строкой
Тело может отсутствовать, но заголовок и стратовая строка обязательны
Для версии 1.1 заголовок обязательно должен содержать host
-
- Request methods overview
Методы:
- OPTIONS - определение возможностей сервера
- GET - используется для запроса содержимого указанного адреса. Считается идемпатентными(частичный и условный GET), можно передавать параметры выполнения запроса в URI целевого ресурса после символа ?
- HEAD - как GET, только без тела, применяется для извлечения мета-данных, проверка наличия ресурса
- POST - используется для передачи пользовательских данных ресурсу, НЕ идемпотентный - для нового ресурса
- PUT - для загрузки содержимого запроса на указанный в запросе URI
Метод POST предполагает, что по указанному URI будет производиться обработка передаваемого клиентом содержимого. Используя PUT, клиент предполагает, что загружаемое содержимое соответствует находящемуся по данному URI ресурсу.
- PATCH - PUT к фрагменту ресурса
- DELETE - удаляет указанный ресурс
- TRACE - Возвращает полученный запрос так, что клиент может увидеть, какую информацию промежуточные серверы добавляют или изменяют в запросе.
- CONNECT - Преобразует соединение запроса в прозрачный TCP/IP-туннель, обычно чтобы содействовать установлению защищённого SSL-соединения через нешифрованный прокси.
- Status code in Http
Коды ответов
1хх - Информация
2хх - Успех
3хх - Перенаправление
4хх - Ошибка клиента
5хх - Ошибка сервера
- Http basic features
- HyperText Transfer Protocol -предназначен для обеспечения взаимодействия между клиентом и сервером
- В соответствии со спецификацией OSI, HTTP является протоколом прикладного (верхнего, 7-го) уровня.
- API многих программных продуктов также подразумевает использование HTTP для передачи данных — сами данные при этом могут иметь любой формат, например, XML или JSON.
- Uniform Resource Identifier - унифицированный идентификатор ресурса -предоставляет идентификатор ресурса- Может быть URL(Locator) или URN(Name) или двумя одновременно
URL - кроме URI имеет информацию о местонахождении ресурса
URN - URI который ещё идентифицирует ресурс в определенном пространстве имён
-
- Version of http
- HTTP/1.1
Современная версия протокола; принята в июне 1999 года[2]. Новым в этой версии был режим «постоянного соединения»: TCP-соединение может оставаться открытым после отправки ответа на запрос, что позволяет посылать несколько запросов за одно соединение. Клиент теперь обязан посылать информацию об имени хоста, к которому он обращается, что сделало возможной более простую организацию виртуального хостинга.
- HTTP/2
11 февраля 2015 года — опубликованы финальные версии черновика следующей версии протокола. В отличие от предыдущих версий, протокол HTTP/2 является бинарным. Среди ключевых особенностей: мультиплексирование запросов, расстановка приоритетов для запросов, сжатие заголовков, загрузка нескольких элементов параллельно, посредством одного TCP-соединения, поддержка проактивных push-уведомлений со стороны сервера.
-
- Http vs Https
HTTPS - HyperText Transfer Protocol Secure - расширение протокола HTTP для поддержки шифрования в целях повышения безопасности, использует протоколы SSL или TLS
- администратор должен получить и установить в систему сертификат открытого и закрытого ключа для этого веб-сервера
- Structure of Request and Response message in Http
Отличаются стартовой строкой, в запросет метод запроса, а в ответе код ответа
-
- Difference between get and post methods
- PUT предназначен для создания, замены или обновления, для POST это не определено
- Get безопасный и идемпотентный
- GET может быть кэширован и добавлен в закладки, а POST нет
- GET передаёт информацию через URL, макс рекомендованная длина 2048 символов, только ASCII и менее секьюрный(нельзя пересылать пароли и прочее)
-
- Idempotent methods
Безопасность и идепатентность
Безопасный запрос — это запрос, который не меняет состояние приложения.
Идемпотентный запрос — это запрос, эффект которого от многократного выполнения равен эффекту от однократного выполнения.
-
- Structure of Header part of Http. Limitations
- Заголовки HTTP - разделённые двоеточием пару параметр-значение
- Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой.
- General Headers («Основные заголовки») — могут включаться в любое сообщение клиента и сервера;
- Request Headers («Заголовки запроса») — используются только в запросах клиента
- Response Headers («Заголовки ответа») — только для ответов от сервера
- Entity Headers («Заголовки сущности») — сопровождают каждую сущность сообщения.
- Примерное ограничение 8килобайт, любых ASCII символов кроме переноса строки
- Structure of Body part of Http. Limitations
message-body = entity-body
| <entity-body закодировано согласно
Transfer-Encoding>
По умолчания 2мегабайта
- How session in maintained on Http?
HTTP не хранит состояние
Но использует Cookie , name-value пары, хранятся в браузере
Для этого используется setCookie заголовок
- Cookies. Advantage and disadvantage of using. Best practice
-
1.JSP overwiew, key moments. When and why we need it.
- JavaServer Pages - технология обеспечивающая упрощенный и быстрый способ создания динамического веб-контента.
- технология, позволяющая веб-разработчикам динамически генерировать HTML, XML и другие веб-страницы. JSP был включен в состав Java EE - программной платформы для программирования веб-приложений.
- Когда пользователь переходит по ссылке, назовем ее index.jsp, он отправляет http запрос на сервер в виде "GET /index.jsp". Затем на основе этой страницы, сервер генерирует, компилирует и выполняет Java сервлет, который приходит ответом пользователю в виде отображения этой страницы.
- Минус в том что гоняет сразу всю страничку
-
- JSP lifecycle
Если посмотреть код внутри созданной JSP страницы, то он будет выглядеть как HTML и не будет похож на java класс. Конвертацией JSP страниц в HTML код занимается контейнер, который так же создает сервлет для использования в веб приложении(теже методы жизненного цикла что и у сервлета). Жизненный цикл JSP состоит из нескольких фаз:
- Translation - JSP контейнер проверяет код JSP страницы, парсит ее для создания кода сервлета. К примеру, в Tomcat вы можете найти классы сервлетов в директории TOMCAT/work/Catalina/localhost/WEBAPP/org/apache/jsp. Если страница JSP называется home.jsp, то созданный сервлет обычно будет иметь имя home_jsp и имя файла - home_jsp.java.
- Compilation - JSP контейнер компилирует исходный код jsp класса и создает класс на этой фазе.
- Class Loading - контейнер загружает классы в память на этой фазе.
- Instantiation - внедрение конструкторов без параметров созданных классов для инициализации в памяти классов.
- Initialization - в контейнере вызывается init метод объекта JSP класса и инициализируется конфигурация сервлета с init параметрами, которые указаны в дескрипторе развертывания (web.xml). После этой фазы JSP способен обрабатывать запросы клиентов.Обычно эти фазы происходят после первого запроса клиента (т.е. ленивая загрузка), но можно настроить загрузку и инициализацию JSP на старте приложения по аналогии с сервлетами.
- Request Processing - длительный жизненный цикл обработки запросов клиента JSP страницей. Обработка является многопоточной и аналогична сервлетам - для каждого запроса создается новая нить, создаются объекты ServletRequest и ServletResponse и происходит внедрение сервис методов JSP.
- Destroy - последняя фаза жизненного цикла JSP на которой JSP класс удаляется из памяти. Обычно это происходит при выключении сервера или андеплое приложения.
-
- Implicit objects overview
- JSP implicit objects (неявные объекты) создаются контейнером при конвертации JSP страницы в код сервлета для помощи разработчикам. Эти объекты можно использовать напрямую в скриптлетах для передачи информации в сервис методы, однако мы не можем использовать неявные объекты в JSP Declaration, т.к. такой код пойдет на уровень класса.
- Существует 9 видов неявных объектов, которые можно использовать прямо на JSP странице. Семь из них объявлены как локальные переменные вначале _jspService() метода, а два оставшихся могут быть использованы как аргументы метода _jspService().
- out
- request
- response
- config
- application
- session
- pageContext
- page
- exception
- Неявный объект исключений JSP недоступен в обычных JSP страницах и используется на страницах ошибок JSP только для того, чтобы перехватить исключение, брошенное JSP страницей и далее предоставить какую-либо полезную информацию клиенту.
-
- Different types of comments
- HTML комментарии - <-- HTML Comment --> . Такие комментарии будут видны клиенту при просмотре кода страницы.
- JSP комментарии - <%-- JSP Comment --%>. Такие комментарии создаются в созданном сервлете и не посылаются клиенту. Для любых комментариев по коду или отладочной информации необходимо использовать этот тип комментариев.
-
- Configuring init params for JSP
- Идентично с сервлетами
- Мы можем задать параметры инициализации для JSP аналогично сервлетам в web.xml файле. Мы должны сконфигурировать init параметры JSP с элементами servlet и servlet-mapping. Единственным отличием будет указание местонахождения JSP страницы.
-
- Is it possible to define a class/interface in JSP?
Можно, в итоге получится скриптлет, но это считается плохой практикой
- Include directive vs jsp:include action
Include directive срабатываем когда мы преобразуем JSP в сервлет(или при изменении JSP), а jsp:include при каждом вызове. Поэтому приизменении include ресурса Include directive не изменит страницу, а jsp:include изменит
-
- JSP expresson language overview
Exression Language - это переменные определенного скоупа, которые доступны через выражение ${…}, среди скоупов есть и скоуп page, но даже в этом скоупе переменная не является локальной для класса страницы. Поэтому мы просто так не можем в скриптлете обратиться к переменной из этих скоупов, в том числе и скоупа страницы. Скоупы бывают: page, request, session, application, response, out, config.
-
- JSTL overview
- Стандартная библиотека тегов JSP (англ. JavaServer Pages Standard Tag Library, JSTL) - расширение спецификации JSP, добавляющее библиотеку JSP тегов для общих нужд, таких как разбор XML данных, условная обработка, создание циклов и поддержка интернационализации.
- JSTL является альтернативой такому виду встроенной в JSP логики, как скриптлеты, то есть прямые вставки Java кода. Использование стандартизованного множества тегов предпочтительнее, поскольку получаемый код легче поддерживать и проще отделять бизнес-логику от логики отображения. Для использования JSTL тегов необходимо подключить библиотеку и указать на страницы пространство имен.
- Библиотека тегов JSTL состоит из пяти групп тегов:
- Core Tags - основные теги, предоставляют возможности итерации, обработки исключений, url, forward и redirect response и т.д.
- Formatting и Localization Tags - теги форматирования, предоставляют возможности по форматированию Numbers, Dates и поддержки i18n локализации и resource bundles.
- SQL Tags - теги для работы с SQL, поддержка работы с базами данных вроде MySQL, Oracle и т.д.
- XML Tags - теги для работы с XML документами. Например для парсинга XML, преобразования данных XML и выполнения выражений XPath.
- JSTL Functions Tags - функции-теги для обработки строк, предоставляет набор функций, которые позволяют выполнять различные операции со строками и т.п.. Например по конкатенации или разбиению строк.
-
- JSP:useBean overview, scopes. Best practice
Позволяет связываться c JavaBeans
-
- JSP custom best practice
- Когда есть повторяющиеся элементы, их можно сделать кастомным тегом и не повторять везде
- Одна и таже бизнес-логика может быть использована много с помощью этого тега
- JSP vs Servlet
JSP - особый вид сервлета для отделения представления
- JSP Writer vs Servlet printWriter
- JspWriter может выбрасывать исключения, а PrintWriter не должен
JspWriter скрыто использует PrintWriter
- JSP страницы буфферизуются, то PrintWriter нет. PrintWrite будет записан в ответ после очистки буффера
-
- JMS overview
Java Message Service - часть Java EE, спецификация стандарта для отправки и получения сообщений между двумя или более клиентами. Это спецификация, которая описывает методы которыми Java-программа создёт, отправляет и получает сообщения.
JMS API поддерживает слабую связанность и асинхронную передачу сообщений
JMS Provider - JMS Message Oriented Middleware - компонент который помогает в обиене сообщениями между системами соединёнными через сеть
JMS clients:
- JMS Producer / Publisher - клиент который создаёт и отправляет сообщения
- JMS Consumer/ Subscriber - клиент который получает сообщения
-
- Synchronous vs Asynchronous types of messaging
В jms обычно асинхронный, но в point-to-point можно реализовать синхронное поведение
- Point-to-point vs publish and subscribe types of messaging model
-
- Point-to-point - основные компоненты: queue, senders, receivers. Очередь хранит сообщения, а клиенты извлекают их из очереди. Хранит пока сообщение не будет использовано и не истечёт время
- Publisher/Subscriber - клиенты подписываются на топики, публикуют и подписываются на топик
- Topic vs queue
queue - один на одни
topic - множество получателей
- Components of JMS
ConnectionFactory и Destination(topic или queue) - administrative object
Clients
Message
- JMS provider vs JMS client
- На клиенте добавить зависимость (ActiveMQ)
- Administrated object - отдельный сервис(сервер)
- JMS client vs Native client
- Message vs TextMessage vs BytesMessage vs ObjectMessage vs MapMessage
- Administered objects overview
- состоит из connection factory и destination
- Message producer vs Message consumer
- отличаются методами, одни для передачи, другие для получения сообщений
- JMS session vs connection
connection factory создёт соединение, оно создаёт сессию(может создавать несколько соединений)
- JMS vs RPC
RPC -всегда синхронен
- ActiveMQ overview, best practice
Apache ActiveMQ — это message broker с открытым исходным кодом
- ActiveMQ and Apache Camel integration
-
- What is a Web Services?
это сервер, слушающий запросы на выбраном порте по сети, поддерживающий веб-докуиенты(html,json, xml, images) и создающий сервис приложения, которое обслуживает решение специфической доменной проблемы через сеть
к веб-сервисам могут ображаться другие сервисы, а не только клиенты
- Advantages of Web Services
Плюсы
- независимость от платформы
- основаны на базе открытых стандартов и протоколов
- позволяет работать через HTTP, модно, круто, молодёжно)
Минусы
- Меньше производительность и большой размер сетевого трафика
- безопасность, необходимо использовать кодирование(HTTPS)
- Different types of Web Services
- SOAP/WSDL/UDDI
- REST
- XML-RPC
- SOAP Web Services overview. WSDL, UDDI
Web Services Description Language - язык описания веб-сервисов и доступа к ним, основанный на языке XML
SOAP - Simple Object Access Protocol - использует обмен xml сообщениями
UDDI - инструмент для расположения описаний веб-сервисов (WSDL) для последующего их поиска другими организациями и интеграции в свои системы.
- Top Down vs Bottom up
Bottom up - сначала код, потом под него контракт
Top Down - сначала контракт, потом код
- Advantages and disadvantages of SOAP Web Services
- Библиотека для работы с xml
- Встроенная система обработки ошибок
- Хорошая секьюрнасть
- Не гибкий
- Не использует фичи http
- Медленный
- REST Web Services overview
Передача состояния представления
REpresentational State Transfer - архитектура веб-приложений, включающая универсальные способы обработки и передачи состояний ресурсов по HTTP
Принципы:
- Клиент-сервер - взаимодействие
- stateless - сервер не должен хранить состояние, запрос должен хранить всю необходимую информацию
- Cacheble - каждый ответ должен быть отмечен является ли он кэшируемым
- Unifier interface - Используем HTTP, CRUD, идентифицируйте ресурсы, HATEOAS(самоописывемость), манипуляции через представления
- Layred System - многоуровневая архитектура
- Code on deman - код по требования(опционально)
- Advantages and disadvantages of REST Web Services
:check: Не привязаны к формату передаваймых данных
:check: Быстрее чем SOAP
:check: Нет контракта, придерживаемся методов HTTP
:check: На стороне сервера меньше проблем с потокобезопасностью
:red_cross: Нет общего согласования REST
:red_cross: Сложнее дебажить
- SOAP vs REST difference
Безопасность - SOAP
CRUD - REST
- How to choose between SOAP and REST?
REST:
- Когда есть ограничение пропускной способности соединения
- Если необходимо кэшировать запросы
- Если система предлагает значительное масштабирование
- В сервиса, использующих AJAX
- Используются только CRUD операции
- JAX-WS API overview
Java API for XML Web Services
API для SOAP сервисов
спецификации
-
-
- Servlet interface overview.
- Servlet interface - интерфейса Java, который расширяет функциональные возможности сервера.
- Компоненты javaee способные обрабатывать запросы и генерировать динамические ответы на них
- Взаимодействует с клинтами посредством запрос-ответ.
-
2.Servlet lifecycle
- Жизненный цикл конторлируется контейнером в котором развернут сервлет(контейнер это сервер tomcat)
- Когда запрос маппится к сервлету, контейнер делает следующие шаги:
a)Если инстанса нет, то контейнер загружает класс сервлета, создаёт экземпляр сервлета, инициализирует экземпляр вызывая init метод
b)Контейнер запускает service метод, передавая объекты запросов и ответов.
c)Если необходимо удалить сервлет, контейнер завершает сервлет вызывая метод destroy
- Обрабатывать события жизненного цикла сервлетов можно с помощью специальных слушателей WebListener
- В случае экспшена контейнер создаёт страницу по умолчанию, с сообщением "A Servlet Exception Has Occurred". В случае необходимости это можно настроить
-
- Quantity of Servlet instance loaded/supported by servlet container: different scenarios. Best practice.
Один сервлет на одно приложение, но создаёт треды для каждого запроса
- PrintWriter vs ServletOutputStream
- ServletResponse интерфейс реализуется двумя путями:
Для символьной информации PrintWriter, а для бинарной информации ServletOutputStream
-
- GenericServlet vs HttpServlet
GenericServlet -абстрактный класс, а HttpServlet экстендится от него.
В HttpServlet реализованы методы для работы с HTTP-протоколом
- Way of Servlet collaboration
Servlet Collaboration - обмен информацией между вебресурсами, сервлетами, html страницами, JSP, в веб-приложении.
Для этого есть два способа(интерфейса):
-
- Forward vs sendRedirect
- работает на сервере/работает на клиенте
- отправляет тот же объект запроса и ответа другому ресурсу/ всегда отправляет новый запрос
- работает только внутри сервера/может использовать и внутри и снаружи
-
- ServletConfig vs ServletContext
9.ServletRequest.dispatch vs ServletContext.dispatch
метод getRequestDispathcer
Servlet request в рамках одно приложения, servlet context между приложениями
- Filter overview. Best practice.
Filter - объект, который может транформировать заголовок и/или контент запроса или ответа.
Задачи фильтра:
- Отправить запрос и сделать сообтветствующее действие
- Заблокировать пару запрос-ответ от использования в дальнейшем
- Модифицировать заголовок и данные запроса. Это делается для отбеспечении настраиваемой версионности запроса.
- Модифицировать заголовк и данные ответа. Это делается для отбеспечении настраиваемой версионности ответа.
- Взаимодействие с внешними ресурсами
-
-
-
- What is serialization?
Сериализация - процесс сохранения состояния объекта в последовательность байт.
Десериализаця - процесс восстановления обекта из этих байт.
- Overview of Serialization in Java, key moments
- два механизма сериализации:
- java.io.Serializable
- java.io.Externalizable
- запись/чтение через ObjectOutputStream/ObjectInputStream
JAXB - Java Architecture for XML Binding - для Маршалинга/Демаршалинга - настройка аннотациями
GSON - для JSON - простая и быстрая
- Making class serializable
Добавить интрефейс-маркер serializable
- Serializable vs Externalazable
- public void writeExternal(ObjectOutputStream out) throws IOException
- out.defaultWriteObject();
- public void readExternal(ObjectInputStream in) throws IOException, ClassNotFoundException
Обязательно необходимо переопределять методы( и у потомков тоже)Extenalizable не записывает информацию родительских классов, он сам по себе, для очень кастомной сериализации(нет метаинформации)
- serialVersionUID in Java. Default and specified values. How serialization mechanism interacts with serialVersionUID?
- В каждый класс, реализующий интерфейс Serializable, на стадии компиляции добавляется еще одно поле – private static final long serialVersionUID.
- нужно указать serialVersionUID - версия объекта
- по дефолту ставится: 1L
- Serialization and inheritance
- все потомки serializable класса тоже serializable
- если класс-родитель не serializable, то его поля инициализируются конструктором по умолчанию(no-args-constructor)
- Serialization and Composition
Сериализация полей ссылочного типа происходит если он serializable(String, Integer и т.д. - serializable)
- Ways to manage serialization process
Определить методы с такой сигнатурой:
- private void writeObject(ObjectOutputStream out) throws IOException
- out.defaultWriteObject();
- private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
- Including or excluding data to be serialized
записываются:
- метаданные класса
- метаданные всех родителей
- значение полей всех родителей
- значение полей класса
Transient поля пропускаются
- Serialization and java versions, possible restrictions
Нет ограничений по версии Java, решение всех проблем переходит на плечи разработчиков
- Where we can see usage of Serialization mechanism in java, best practice
Используется:
- скорость по сравнению с xml/json
- в распределенны системах(session)
-
- What is XML document
- eXtensible Markup Language - расширяемый язык разметки
- XML - это инструмент для хранения и транспортировки данных.
- XML был разработан, чтобы быть как читаемым человеком, так и машиной.
-
- Difference between XML and HTML
- XML и HTML разработаны для разных целей
- XML разработан для транспортировки данных с фокусом на самих данных
- HTML разработан для отображения данных с фокусом на том как данные выглядят
- В XML теги не предопределены как HTML-теги
-
- Version in XML, meaning
- Можно не указывать, по умолчанию 1.0
Второй ( XML 1.1 ) был первоначально опубликован 4 февраля 2004 года, в тот же день, что и третье издание XML 1.0, и в настоящее время находится во втором издании, опубликованном 16 августа 2006 года. Он содержит функции (некоторые спорные) предназначенные для облегчения использования XML в определенных случаях. Основные изменения - разрешить использование символов окончания строки, используемых на платформах EBCDIC , а также использование сценариев и символов, отсутствующих в Unicode 3.2. XML 1.1 не очень широко реализован и рекомендуется для использования только теми, кому нужны его особенности.
-
- Benefits of XML
- Простота - Информация, закодированная в XML, легко читается и понимается,
плюс она может легко обрабатываться компьютерами.
- Открытость - XML - это стандарт W3C,
одобренный лидерами рынка программного обеспечения.
- Расширяемость - Не существует фиксированного набора тегов.
Новые теги могут быть созданы по мере необходимости.
- Самоописание - документы XML могут быть сохранены без [схем]потому что они содержат метаданные; любой тег XML может иметь неограниченное количество атрибутов, таких как автор или версия.
- Содержит машиночитаемую контекстную информацию - Теги, атрибуты и структура элементов предоставляют контекстную информацию
- Отделяет контент от представления - XML-теги описывают значение, а не представление. Внешний вид XML-документа может контролироваться таблицами стилей XSL, позволяя изменять внешний вид документа (или всего веб-сайта), не затрагивая его содержимого.
- Поддерживает многоязычные документы и Unicode - Это важно для интернационализации приложений.
- Облегчает сравнение и агрегирование данных - Древовидная структура документов XML позволяет сравнивать и эффективно агрегировать документы по элементам.
- Может включать несколько типов данных - XML-документы могут содержать любые возможные типы данных - от мультимедийных данных (изображения, звука, видео) до активных компонентов (апплеты Java, ActiveX)
- Может встраивать существующие данные - Отображение существующих структур данных, таких как файловые системы или реляционные базы данных, в XML легко
- Предоставляет «представление одним сервером» для распределенных данных. - XML-документы могут состоять из вложенных элементов, которые распределены по нескольким удаленным серверам.
-
- Well-formed XML
Правила для well-formed
- все теги закрыты
- должен быть один корневой элемент
- названия тегов регистрозависимые
- соблюдать корректную вложенность
- значения xml атрибутов должны браться в кавычки
- Valid Xml
Быть well-formed и соответствовать сделанной DTD или XSD
- DTD vs XSD
- DTD - Document Type Definition
- XSD - XML Schema Definition
XML схема мощнее DTD
- XML схема пишется на XML
- XML схема легко расширяется
- XML схема поддерживает типы данных
- XML схема поддерживает пространства имен
-
- XPath in XML
Xpath - язык запросов к элементам XML-документа
Для работы с XML докуметов в виде путей к деректориям
- XML data binding
JAXB -Java Architecture for XML Binding
Десериализует xml файл в java-объект , заполняя схему
- XML namespace
Могут оказаться теги с одинаковым именем, но в для это ввели пространства имён для их различия
xmlns:prefix
- Classloader(Hierarchy: Bootstrap, Extensions, System, User-defined...)
GENERAL
Антон Архипов
ClassLoader - abstract class
Методы:
- loadClass() - загружает класс
- findClass() - не определен
- defineClass()
- getResource()
- getParent()
У загрузчика есть родитель и он опрашивается первымНО: загрузчик Java EE опрашивается первымНа каждый WAR отдельный загрузчик(изолирование приложений)Классы грузятся по мере надобности, класслоудер позволяет грузить классы на лету
- What is the mechanism of classloading?
Механизм динамической загрузки байт-кода(.class) в JVM
- (loading)загрузка байт-кода из ресурсов и создание экземпляра класса Class
- (linking)связывание (или линковка)
1) Verification - происходит проверка корректности полученного байт-кода.
2) Preparation - выделение оперативной памяти под статические поля и инициализация их значениями по умолчанию (при этом явная инициализация, если она есть, происходит уже на этапе инициализации).
3) Resolution - разрешение символьных ссылок типов, полей и методов.
- (initialisation)инициализация полученного объекта
Класс должен быть полностью загружен прежде, чем слинкован.Класс должен быть полностью проверен и подготовлен прежде, чем проинициализирован.Ошибки разрешения ссылок происходят во время выполнения программы, даже если были обнаружены на этапе линковки.
- Default hierarchy of classloaders
1) Базовый загрузчик - Bootstrap - реализован в JVM, загружает JAVA_HOME/lib
2) Загрузчик расширений - Extention Classloader - уровень JRE, JAVA_HOME/lib/ext
3) Системный загрузчик - System Classloader - уровень JRE, грузятся классы в CLASSPATH
4) Пользовательский загрузчик(может несколько)
- Current Classloader - это загрузчик класса, код которого в данный момент исполняется
- Context Classloader - загрузчик контекста текущего потока.
-
- What is the role of every element in hierarchy?
- Why don't use only one or two classloaders?
Попытка модулизировать и изолировать
Для разделения доверенности
- Life cycle of a 'class' when it loads by classloaders
-
- Stages of class construction
Делегирование
- Запрос на загрузку класса передается родительскому загрузчику, и попытка загрузить класс самостоятельно выполняется, только если родительский загрузчик не смог найти и загрузить класс. Такой подход позволяет загружать классы тем загрузчиком, который максимально близко находится к базовому. Так достигается максимальная область видимости классов. Каждый загрузчик ведет учет классов, которые были загружены именно им, помещая их в свой кэш. Множество этих классов и называется областью видимости.
Видимость
- Загрузчик видит только «свои» классы и классы «родителя» и понятия не имеет о классах, которые были загружены его «потомком».
Уникальность
- Класс может быть загружен только однажды. Механизм делегирования позволяет убедиться, что загрузчик, инициирующий загрузку класса, не перегрузит загруженный ранее в JVM класс.
- User-defined classloader. Why and when we need it? Best practice
- должны расширять класс java.lang.ClassLoader
- поддерживать модель динамической загрузки
///
- расширить область откуда грузить классы
- грузить разные версии библиотек
- делать верификацию класса
- изменить класс при загрузки(в рантайме подминить классы)
- Library Version Conflicts and how classloaders resolve it
- A possibility to load different version of the same libs
Создать несколько своих класслоудеров
и в каждом грузить свою версию либы
- Types of Exceptions are thrown by classloading mechanism
- NoClassDefFoundError(Нет файла - при загрузке родителя)/ClassNotFoundException(не нашли по имени) - класса не найден
- IncompatibleClassChangeError/AbstractMethodError/NoSuchMethod[Field]Error/IllegalAccessError - найден, но не тот
- ClassCastException/LinkageError/IllegalAccessError - найдено более одного
-
- What is GC
компонент JVM, исполняемый в отдельном низкоприоритетном потоке, которая автоматически управляет динамическими запросами работы с памятью
- Выделяет и возвращает память операционной системе
- Раздает эту память приложению, когда оно его запрашивает.
- Определяет, какие части памяти все еще используются приложением.
- Освобождает неиспользуемую память для повторного использования приложением.
-
- Ways to interact with Garbage Collector for a developer
- Strong, Soft, Weak, Phantom reference. When and how to use, best practice
- Finalize method known issues
- Finalize method vs Phantom reference
- Java memory model(java 1.8)
- Different regions in JVM Memory linked to GC
-
- Serial, Parallel, Cms, C1 algorithms comparison
-
- Ways to create a new type/class in java(class, interface, ...)
- Через ключевое слово new
- Через рефлексию(к классу или конструктору)
SomeType smt = (SomeType) Class.forName("com.company.SomeType").getDeclaredConstructor().newInstance();
- Через метод clone()
- Использовать десериализацию
ObjectInputStream in = new ObjectInputStream(new FileInputStream("data.obj"));
Employee emp5 = (Employee) in.readObject();
-
GENERAL
Class - шаблон для создания объектов
Объекты могут иметь общее состояние и поведение
Может иметь поля и методы
Object - экземпляр класса
Внешние классы могут быть public или package-private
Имя файла должно совпадать с public классом, если такой имеется
- 'Inner' classes: classification, difference, best practice
- использование внутренних классов увеличивает инкапсуляцию, код читабельнее и группирует классы используемые только в одном месте
- Nested Classes делятся на два вида статические и нестатические
- Статические назваются Static Nested Classes(не имею доступ к другим членам внешнего класса)
Нестатические называются Inner classes(имеют доступ к другим членам внешнего класса, даже если они private)
- Nested Class - может быть private, public, protected or package private(Outer Class только public или package private)
- Inner Classes - плохо сериализовать, не может иметь статику, имеет доступ к локальным переменным внешнего класса final или effectively final
- Inner Classes есть ещё два дополнительных типа: Local( в теле метода) and Anonymous(в теле метода без указания имени, лямбда выражения частный случай) Classes
-
- A few types in one 'java' file: rules of usage, best practice
Мы можем указать сколько угодно классов в одном файле, но только один public.(это ограничение ускоряет компиляцию) Не публичные оставили потому что они не мешают компилятору
-
- Naming convention for classes, best practice
Имена классов должны быть существительными, набранным в смешанном регистре (каждое слово с большой буквы с большой буквы). Постарайтесь, чтобы ваши имена классов были простыми и наглядными. Используйте целые слова - избегайте сокращений и аббревиатур (если только аббревиатура делает имя класса более наглядным и понятным, чем длинная форма, например такие как URL или HTML).
-
- Key words to be used for creating new classes/types
- class/inteface/enum - для объявления класса/enum/интерфейса
- extends/implements - для наследования от класса/интерфейса
- final - запрещает расширить или наследовать класс
- abstract - делает класс абстрактным, запрещает сделать экземпляр класса
- Модификаторы доступа: public, private, protected, package-private
- void или тип возвращаемого значения
- Structure of a new type, possible structurel elements
Объявление класса состоит модификаторов доступа, имя класса, имя родительского класса, списка интерфейсов и тело класса
Класс состоит из имени, объявления параметров, конструктора и методов
-
- Byte code in java
Компилятор переводит классы в .class, а JVM интерпретирует байткод в инструкции исполнения
-
- Structure of a file with extension '.class'
содержит байткод класса
-
- Collections API rewiew, hierarchy, contract of interfaces.
- Collection related features in Java 8
- Collections framework. benefits of usage
- Generics in Collections Framework
- Benefits of iterator usage. Iterator vs Listiterator. Fail-safe and Fail-fast difference
- Vector and ArrayList comparison
- How HashMap works in Java?
- HashMap and Hashtable comparison
-
GENERAL
- Raw type.
- List<Object> !=> List<String> - разные предки
- Bounded Type Parameter <T extends Product> <T super Product>
IN - аргументы - extends
OUT - аргументы - super
- Bounded Wildcard - <?>
- Рекурсивное расширение типов
- Нельзя параметризовать исключения
- Обобщения повышают стабильность вашего кода, делая больше ваших ошибок обнаруживаемыми во время компиляции
-
Правила
1: всегда использовать diamond синтаксис, если мы используем типизированные типы. В противном случае мы рискуем пропустить, где у нас используется raw type.
- Если класс типизирован, всегда указывать тип в дженерике.
- What is Generics in Java? How it works
- Generics позволяют параметризировать типы в объявлении классов, интерфейсов и методов
- Добавлен в Java 1.5
- С их помощью можно объявлять классы, интерфейсы и методы, где тип данных указан в виде параметра.
- Сделаны для компилятора, их нет во время исполнения(кроме редких случаев, но можно узнать тип через reflection)
Позволяют(для чего):
- Позволяет отлавливать ошибки во время компиляции, а не в runtime.
- Убирает приведение типов.
- Позволяет программистам вставлять generics в алгоритмы.
Инвариантность/ковариантность/контрвариантность...
-
- Bounded vs unbounded wildcards
Ограничить типы, которые можно использовать в качестве аргументов типа в параметризованном типе.
- In-аргументы - использовать extends
- Out-аргументы - использовать super
- Если до In можно достучаться через методы Object, тогда использовать ?
- Если переменная одновременно In и Out - не использовать wildcard
-Unbounded wildcards: 1) если имплементируем функциональность Object 2) Когда наш метод не зависит от переданного типа
-
- Rules to write a generic method
- Нельзя использовать generics с примитивными типами
- нельзя создать экземпляр параметра типа
- нельзя объявить статическое поле параметризированным типом
- нельзя использовать instanceof с параметрезированными типами
- нельзя создать массив параметрезированных типов
- нельзя использовать с эксепшенами
- нельзя перегрузить методы только дженериками
-
- Generics and collections
Generics в основном используются с collections
-
- Creating parametrized class/interface using Generics
Да, можно создать)
-
- Lambda expression overview, best practice
- Лябда - способ реализации функционального интерфейса
- Лямбда-выражения представляют собой экземпляр функциональных интрефейсов(интерфейс с единственным абстрактным методом)
Возможности:
- Позволяет рассматривать функциональность как аргумент метода или код как данные
- Создание функции без пренадлежности к какому либо классу
- Лямбда-выражение может быть передано как если бы это был объект и выполняться по требованию
- Пример: n -> { if (n%2 == 0) System.out.println(n); }
Есть доступ в final переменным, effectivly final
-
- Expression optionality with Optional feature
Optional - Контейнер объекта, который может содержать, а может не содержать не нулевое значение.
- Предупреждает разработчиков, что может быть null
Позволяет не указать что сделать(императивного подхода), а как сделать
-
- Method Refferences: defining Lambda Expressions by referring to methods derectly. Best practice
Передача ссылки на метод
Object :: methodName
Object::new - ссылка на конструктор
Если сигнатура метода функционаьного интерфейса, то мы можем заменить ссылкой на метод
-
- Functional Interface overview. Best practice
- Интерфейс содержащий только один абстрактный метод
- Примеры: Runnable, ActionListener, Comparable(equals and compareTo для обратной совместимости)
- FunctionalInterface Аннотация - означает что функциональный интерфейс не может иметь более одного абстрактного метода(не считая методов Object)
- Consumer/Supplier/Predicate/Function
-
- Default methods overview. Best practice
- Интерфейсы теперь могут иметь дефолтнеую реализацию методов
- Статические методы как у класса(для High Cohesion)
- В случае множественного наследования и совпадения дефолтных методов с одинаковой сигнатурой, наследник должен указать конкретный класс или переопределить метод
- Default методы введены для обеспечения обратной совместимостичо со старыми интерфейсами, чтобы они могли иметь новые методы без влияния на существующий код
-
- Date API overview
- Все классы в новом API потокобезопасные(Immutable)
- Точность с наносекундами
- Хранение меток времени и даты
- Указание временной зоны
- Месяцы идут с 1
-
- Stream API overview
Способ работать со структурами данных в функциональном стиле
Создать стрим:
- Пустой стрим: Stream.empty()
- Стрим из List: list.stream()
- Стрим из Map: map.entrySet().stream()
- Стрим из массива: Arrays.stream(array)
- Стрим из указанных элементов: Stream.of("1", "2", "3")
Операторы:
- Промежуточные (“intermediate”, ещё называют “lazy”) — обрабатывают поступающие элементы и возвращают стрим. Промежуточных операторов в цепочке обработки элементов может быть много.
- Терминальные (“terminal”, ещё называют “eager”) — обрабатывают элементы и завершают работу стрима, так что терминальный оператор в цепочке может быть только один.
- стрим нельзя переипользовать и обязательно должен быть терминальный оператор в конце
- стримы примитивных типов
-
- What is join? Difference types of SQL join clauses and how are they used
JOIN — оператор языка SQL, который является реализацией операции соединения данных из двух таблиц.
Виды: OUTER(LEFT, RIGHT, FULL),INNER, CROSS
- INNER - сопоставляет данные, чтобы были в обеих таблицах
- OUTER - в результат обязательно входят строки какой-либо из таблицы
- CROSS - декартово произведение, генерирует все возможные пары
-
- Difference between inner join and left join?
INNER возьмёт пересечение, а LEFT ещё добавит строки из первой таблицы с NULL
- Difference between left join and right join?
Кроме пересечения LEFT добавит строки из первой таблицы, а RIGHT из второй(подставив NULL)
- Full outer join. How to use
Добавляет строки и первой и второй таблицы(с NULL)
- Non Equi Join
NON EQUI JOIN - SQL JOIN со знаком неравенства
- Self join. When and how to use.
Когда таблица JOIN себя же
- Nested join.
Можно делать последовательность JOIN
- Cartesian join.
Тоже самое, что CROSS JOIN
- Description of the essence of the idea
Полиморфизм - множество форм одной сущности
- один тип множество реализаций
- с одинаково именнованой сущность, можно работать по разному
- концепт, характеризующий способность некой сущности принимать различные формы, взависимости от контекста
- What are the types of it?
- ad-hoc-полиморфизм
- параметрический полиморфизм
- полиморфизм подтипов
- Implementation and support ''Polymorphism' in Java
- Overloadding(количество, тип)
- Overriding(мы моем расширить область видимости у наследников, но не можем сузить)(эксепшены нельзя сделать более абстрактными, но можно сузить)(можем тип возвращаемого значения сделать наследником того что мы возвращаем в первом классе)(СПОСОБ ПРОВЕРИТЬ: не поломать обратную совместимость А а = new B();)
- Generics ()
- Полиморфизм типов, мы можем единообразно использовать с множеством типов через класс родителя
- Polymorphism and data members in Java
Поля переопределяются
- Overloading and overriding methods
-
- What is run time and compile time polymorphism?
Runtime - overloading
Compile time - overriding
- Polymorphism and best practice in Java
-
- Possibility to override of overload static methods in Java
Override низя
Overload можно
GENERAL
- Из-за соображения безопасности современные браузеры не допускают возможности обращаться к данным на других доменах.
Это означает, что веб-страница и XML файл, который она пытается загрузить, должны находиться на одном и том же сервере.
- What is XML parser?
- Все современные браузеры имеют встроенный XML парсер.
- Этот XML парсер преобразует XML документ в объект XML DOM, которым затем можно манипулировать при
помощи JavaScript.
- Средство для разбора XML документа
-
- What is DOM? How it works, when to use.
- XML - DOM (Document Object Model) определяет свойства и методы для доступа и редактирования XML.
- XML DOM представляет XML документ в виде древовидной структуры.
-
- What is SAX parser? How it works, when to use.
- SAX - Simple API for XML - способ последовательного чтения XML-файлов. Работает с помощью событий нахождения выбранных тегов.
- Обычно SAX-парсеры требуют фиксированного количества памяти для своей работы, но не позволяют изменять содержимое документа. Всё, что делает SAX-парсер, это сообщает вызвавшему приложению о встреченных распознанных элементах XML-разметки или о встреченных ошибках. Связь парсера с вызывающим приложением, как правило, осуществляется посредством функций обратного вызова.
-
- Difference between DOM and SAX. Advantages and disadvantages of each.
DOM - Лучше если файл небольшой
- Древовидная структура
- загружает файл в память и потом парсит его
- может как читать, так и записывать объекты
- обратный и прямой поиск возможен для тегов, это упрощает навигацию
- медленне выполняется
SAX - Лучше при больштх файлах
- Базируется на событиях(последовательности событий)
- Парсит файл по ходу чтения, тоесть парсит узел за узлом
- Нет ограничения по памяти, то есть не хранит файл в памяти
- может только читать документ(нельзя вставлять или удалять данные)
- читает файл сверху-вниз, обратная навигация невозможна
- быстрее выполняется
-
- What is StAX Parser?
- StAX - Streaming API for XML - вызывает hasNext и возвращает тег.
- StAX фокусируется на поточной обработке
- Как можно понять из названия стандарта, StAX фокусируется на поточной обработке. По сути, именно возможность приложений обрабатывать данные XML в виде потока событий отличает стандарт StAX от других подходов. Идея обработки XML как набора событий не слишком свежая (по сути, она уже представлена в стандарте SAX); однако в StAX программный код может запрашивать такие события одно за другим вместо того, чтобы предоставлять обработчики, которые получали бы события от синтаксического анализатора в определяемом самим анализатором порядке.
-
- Difference between SAX and StAX parsers. When to use. Best practice.
- SAX да - поддерживает валидацию схемой - StAX нет
- SAX нет - поддерживает возможность записи - StAX да
StAX - поддерживает субпарсинг
-
-
- What is annotations in Java? Why it was added?
- Аннотация - метаданные описывающие код
- Хранятся внутри кода
- Не влияют на код напрямую
Применение:
- Информация для компилятора
- Генерирование документации, файлов...
- Обработка во время выполнения
-
- Java Annotation package overview
- Typical use cases overview
Стандартные аннотации Java
- Creating annotations step by step
1) interface
2) Указать параметры аннотации, обязательные и с default значениями
3) Указать аннотации
- Which program element can be annotated?
Target - подефолту везде
- ANNOTATION_TYPE - над другими аннотациями
- CONSTRUCTOR - над констуктором
- FIELD - над полем класса
- LOCAL_VARIABLE - над локальной переменной метода
- METHOD - над методом
- PACKAGE - над пакетом, нужно создать файл package-info.java в пакете и сделать это там
- PARAMETER - над аргументом метода
- TYPE - над классом, интерфейсом..
- TYPE_PARAMETER - generics и прочее
- TYPE_USE - над ссылкой на тип
- MODULE (Java 9) - над модулем
Retention - подефотлу CLASS
- SOURCE - только в исходном коде(для документации)
- CLASS - Только на время работы компилятора
- RUNTIME - Во всём времени работы
- Repeating annotations, Meta-annotations
- What is unit testing? Goal/benefit of Unit testing
- процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.
- первый бастион по борьбе с багами
- интеграционное тестирование тестирует связь приложений
Цели: первый бастион качества кода
Плюсы:
- быстрое автоматизированное тестирование
- сохранение поведения
- документирование поведения
acceptance - приёмочные тесты, соответствия бизнес процесам
manual - обычное ручное тестирование
регрессионное тестирование - тестирование предыдущего функционала
-
- What is TDD? Advantages of TDD
TDD - техника разработки программного обеспечения, которая основывается на повторении очень коротких циклов разработки: сначала пишется тест, покрывающий желаемое изменение, затем пишется код, который позволит пройти тест, и под конец проводится рефакторинг нового кода к соответствующим стандартам.
BDD - ответвление TDD, разработка через поведение
DDD - это набор принципов и схем, направленных на создание оптимальных систем объектов. Сводится к созданию программных абстракций, которые называются моделями предметных областей
- Сильно замедляет разработку
- Не под все вещи можно написать тесты
- Если изначальный тест неверен, то и код неверен
- Видно когда задача выполнена
- После написания фичи, тесты не подгоняются под реализацию
- Features of JUnit
JUnit - фреймворк для написания юнит тестов
Позволяет удобно создавать тестовые объекты, запускать тесты и проверять валидность, позволяет создавать наботы тестов
-
- DB unit testing overview
DbUnit - это расширение JUnit
- Why do we need mocking?
- Mocking - создание заглушки для сторонней логики
- Mock-object - Mock-объект представляет собой конкретную фиктивную реализацию интерфейса, предназначенную исключительно для тестирования взаимодействия и относительно которого высказывается утверждение
- Mock - возвращает default реализацию
- Stub - возвращает конкретную указанную реализацию
- Указывая моку возвращаемое значение - мы делаем стаббинг
Spy - позволяет узнать вызывалась ли какая-то функция и скольок раз
- Mockito and PowerMock overview, how to use, best practice
- Usage of Static and none static Blocks in a Class
- Why static and none static blocks were introduced in Java?
-
- Life cycle of static and none static blocks
- Static and none static blocks and inheritance: rules of initialisation static and none static blocks
- Usage of static blocks and best practice
- None static blocks: usage best practice
-
- What is RMI in java?
- RMI - Remote Method Invocation(удалённый вызов методов)
- RMI – это механизм, который позволяет объекту в одной Java-машине вызывать методы объекта в другой Java-машине, даже если они находятся на разных компьютерах(RMI даёт возможность разделить и выполнить на разных JVM код ОПРЕДЕЛЯЮЩИЙ ПОВЕДЕНИЕ и РЕАЛИЗУЮЩИЙ ПОВЕДЕНИЕ)
- В Java удаленно можно вызывать только методы интерфейсов, но не классов. Классы определяют реализацию, интерфесы определяют поведение
- Architecture principle of RMI. Different layers.
- Client<->Stub<->Network<->Skeleton<->Server
Skeleton - объект зарегестрированный в реестре удаленных методов(и даём порт)
Stub - заглушка интерфейс с которой работаем на клиенте
- Уровень заглушки и скелета - взаимодействует разработчик, основан на proxy(сериализует и десериализует данные)
- Уровень удаленной ссылки - понимает как интрепретировать и управлять ссылками
- Транспортный уровень - основан на TCP/IP или любой другой протокол(передаёт сами данные)
https://upload.wikimedia.org/wikipedia/commons/b/ba/RMI-Stubs-Skeletons.svg
- Remote interface in RMI.
Все обекты должны
extends Remote
throws RemoteException
Интерфейсы должны называться одинаково
- Remote object in RMI.
Быть serializable
-
-
- What is java reflection?
Доступ к информации о классе
Reflection - итнструмент для исследования и модификации поведения методов, классов, интерфейсов в runtime
Класс Class и Field
-
- Reflection API
- java.lang.reflect package
- рефлексия даёт информацию о классе к которому принадлежит объект(в том числе и методы которые могут быть выполнены используя объект)
- с помощью рефлексии можно вызывать методы вне зависимости от модификатора доступа
MyClass a = new MyClass();
Class<MyClass> aclass = a.getClass();Class<MyClass> aclass = MyClass.classClass<?> c = Class.forName("java.lang.Byte");
- getName() - вернёт полное имя
- getSimpleName() - короткое имя
- getModifiers() - модификаторы доступа
- getSuperclass() - получить родителя
- getInterfaces() - получение всех имплементированных интерфейсов(но не интрефейсы суперкласса)
- getFields() - только публичные поля(класса и всех предков)
- getDeclaredFields() - все поля класса без предков
- getMethods() - только публичные(класса и всех предков)
- getDeclaredMethods() - все поля класса без предков
- getConstructors() - только публичные конструкторы класса и предков
- getDeclaredConstructors() - все конструкторы класса
- invoke() - вызов метода
- setAccessible(true) - для вызова приватных методов
- Where and why to use it
В крайнем случае
- Pros and cons of use. Best practice
:check: Фичи расширений. Приложение может использовать внешние пользовательские классы, создавая их экземпляры используя полностью определённые имена
:check: Инструменты дебага и тестирования. Можно использовать рефлексию для исследования приватных частей класса
:check: Просмотр классов. Для визуального отображения окружения, упрощает написание кода
:red_cross: Накладные расходы. Операции имеют низкую производительность. Следует избегать в частях кода от которых сильно зависит произвожительность
:red_cross: Внутреннее воздействие. Рефлексивный код нарушает абстракции и может изменять поведение.
:red_cross: Ограничение безопасности. Рефлексия может быть запрещена security manager-ом
-
- Reflection and performance
27.GROUP BY, Having...
- Grouping data using Group by
- Команда GROUP BY позволяет группировать результаты при выборке из базы данных.
SELECT [DISTINCT | ALL]{*
| [<выражение для столбца> [[AS] <псевдоним>]] [,…]}
FROM <имя таблицы> [[AS] <псевдоним>] [,…]
[WHERE <предикат>]
[[GROUP BY <список столбцов>]
[HAVING <условие на агрегатные значения>] ]
[ORDER BY <список столбцов>]
Порядок:
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
-
- Group by vs Distinct
- Если group by без агрегирующей функции, то он отработает как distinct
- Для того, чтобы при получении статистических показателей использовались только уникальные значения, при аргументе агрегатных функций можно использовать параметр DISTINCT
- Aggregation functions and group by
агрегатные функции (COUNT, MIN, MAX, AVG и SUM)
- Filtering data with Having clause
- Having может идти только после GROUP BY
- предложение HAVING применяется после группировки для определения аналогичного предиката, фильтрующего группы по значениям агрегатных функций.
- Difference between group by and having
- Это предложение необходимо для проверки значений, которые получены с помощью агрегатной функции не из отдельных строк источника записей, определенного в предложении FROM, а из групп таких строк. Поэтому такая проверка не может содержаться в предложении WHERE.
- Best practice of using group by and having
Having работает с результатами GROUP BY
- What is inheritance?
Концепция ооп, согласно которой (абстрактный) тип (данных) может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию кода.
- Inheritance in java, supported types.
- Простое наследование - да
- Многоуровневое наследование
- Иерархическое наследование
- Множественное наследование - только через интерфейсы
Единый базовый класс
- Ways to use inheritance in java
- extends - только один класс/ не наследуются приватные переменные и методы/ Можно переопределить метод/ методы родителя вызываются через super/ final запрещает наследование/
- implements
- Difference between inheritance and absrtaction
Для построения иерахии наследования, мы придерживаемся принципа абстракции
(Абстрактный класс используется когда нам нужна какая-то реализация по умолчанию. Интерфейс используется когда классу нужно указать конкретное поведение.)
- Polymorphism and inheritance differences
Наследование поволяет нам реализовавыть некоторые формы полиморфизм
- Composition vs inheritance
- Ассоциация - указывает на отношение "имеет"(Has-A)
- Композиция - зависимая сущность не самостоятельна
- Агрегация - зависимая сущность может существовать сам по себе
Наследование при компиляции(жёсткая структура), а композиция может происходить в рантайме
- Keys(Primary, unique, foreign)
- What is primary key? Restrictions, best practice.
- основной уникальный идентификатор записи в таблице
- Не может хранить NULL
- В таблице только один Primary key
- может быть связан с другой таблицей как Foreign Key
- можно генерировать автоматически
- По умолчанию первичный ключ является кластеризованным индексом, а данные в таблице базы данных физически организованы в последовательности кластеризованного индекса.
-
- What is unique key? Restrictions, best practice.
- дополнительный(альтернативный) уникальный идентификатор в таблице
- может иметь значение NULL
- в таблице может быть несколько UNIQUE KEY
- По умолчанию уникальный ключ является уникальным некластеризованным индексом.
- не может быть связано с чужой таблицей в качестве внешнего ключа.
- не поддерживает автогенерацию значения(автоинкремент)
- What is foreign key? Restrictions, best practice
- Foreign key - поле в таблице являющееся Primary key в другой таблице
- может принимать несколько NULL значений
- автоматически не создаёт индекс(кластерезированый или некластерезированный) Можно вручную создать индекс по внешнему ключу.
- можно иметь больее одного Foreign key в таблице
- (хорошая идея делать Foreign key кластерезированным)
- (плохая идея делать foreign key c null значением)
- Primary vs unique key
- PRIMARY Key и UNIQUE Key - обеспечивают уникальность столбца, для которого они определены
- Primary не хранит NULL, в отличии от UNIQUE
- Primary один на таблицу, UNIQUE - можно несколько на таблицу
- Primary создаёт класстеризованный индекс, UNIQUE создаёт некластеризованный индекс
-
- Foreign vs primary key
- На первичный ключ одной таблицы может ссылаться внешний ключ другой таблицы
- Primary не хранит NULL, в отличии от FOREIGN(несколько nulll может принимать)
- Primary один на таблицу, FOREIGN- можно несколько на таблицу
- Primary создаёт класстеризованный индекс, FOREIGN можно вручную указать некластеризованный или кластерезированный индекс
-
- Delete, Truncate, Drop
Виды SQL -Команд: DML, DDL, TCL(COMMIT, ROLLBACk), DCL(GRANT, REVOKE)
- Delete operation details
- удаляет записи из таблицы, может иметь where определяющий критерий отбора. Поддерживает транзакции и триггеры
- Truncate operation details
- удаляет все строки таблицы(не имеет оператора WHERE)
- Drop sql command
- DROP TABLE используется для удаления существующей таблицы(самой таблицы) в базе данных
- Delete vs truncate. Best practice
- Truncate не поддерживает триггеры, в отличие от Delete
- Delete блокирует каждую строку, а Truncate всю таблицу
- Truncate возвращает 0, а Delete кол-во удаленных строк
- Реализация Truncate может зависить от СУБД
-
-
- A database trigger(Oracle)
- Different Types of triggers
Триггер - хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено действием по модификации данных
Before/After - Creation/Alter/Drop/Insert()
Виды:
- DML(Data Manipulation Language) trigger (на таблицу или представление)
- System trigger (на схему или базу данных)
- Conditional trigger (те, которые имеют условие when)
- Instead of trigger (dml триггер на представление или system триггер на команду create)
-
- Row vs statement triggers
По области действия:
- Уровень всей команды (statement level triggers)(отработает один раз для всего)
- Уровень записи (row level triggers)(отработает для каждой записи)
- Составные триггеры (compound triggers)
- Before vs After vs Instead of triggers
DML trigger делятся по привязываемому объекту:
- На таблице
- На представление(insted of trigger)
По времени срабатывания:
- Перед выполнением операции(Before)
- После выполнения операции(After)
- System vs User events
в какой момент времени срабатывает системный триггер:
- До того, как будет выполнена операция (на которую срабатывает триггер)
- После того, как будет выполнена операция (на которую срабатывает триггер)
- Вместо выполнения оператора Create
- Best practice of using triggers
Для чего использовать:
- Для автоматической генерации значений виртуального поля
- Для логгирования
- Для сбора статистики
- Для изменения данных в таблицах, если в dml операции участвует представление
- Для предотвращения dml операций в какие-то определенные часы
- Для реализации сложных ограничений целостности данных, которые невозможно осуществить через описательные ограничения, установленные при создании таблиц
- Для организации всевозможных видов аудита
- Для оповещения других модулей о том, что делать в случае изменения информации в БД
- Для реализации бизнес логики
- Для организации каскадных воздействий на таблицы БД
- Для отклика на системные события в БД или схеме
- Advantages and disadvantages of Monolithic Architecture
- Монолитная архитектура означает что ваше приложение это большой связанный модуль, где все компоненты спроектированы так чтобы работать вместе с друг другом, общая память и ресурсы.
:check: Когда все проходит через одно приложение, очень легко присоедить типичный функционал к компонентам.
:check:Также есть преимущество в производительности, т.к. общий доступ к памяти быстрее чем коммуникация между процессами (IPC).
:red_cross: Монолитные приложения сильно связаны и становятся запутанными с эволюцией приложения. Становится сложнее изолировать сервисы для независимого масштабирования или поддержки кода.
:red_cross: Монолитная архитектура также сложнее для понимания, потому что зависимости, побочные эффекты и магия, которая не очевидна, когда смотришь какой-нибудь контроллер или сервис.
- Быстрее разработка пока не разрослась
- Проще добавлять функционал пока не разрослась
- Проще обслуживание на начальной стадии
- Когда код проект разростается сложно расширять и поддерживать, потому что код сильно связан
- для правок передеплоить всё приложение нужно
-
- Service-oriented architecture overview
Микросервисы это вид сервис ориентированной архитектуры
- What are microservices?
- Микросервисная архитектура означает что ваше приложение состоит из маленьких независимых приложений работающих со своей собственными ресурсами и развивающихся независимо друг от друга, потенциально могут быть размещены на разных машинах.
- Advantages and disadvantages microservices.Challenges you face while working Microservices Architectures
:check: Микросервисы архитектурно лучше организованы, т.к. каждый сервис занимается определенной задачей, и его не волнует работа других компонентов.
Несвязанные сервисы также легче переделать и перестраивать для обслуживания различных приложений
:check: Также могут быть преимущества в производительности в зависимости от того как они организованы, потому что можно изолирвать проблемыне места и масштабировать их независимо от остального приложения.
:red_cross: При построении нового сервиса с большой вероятностью вы с толкнетесь со связанными область функциональности (crosscutting concerns) (логирование, кэширование, права доступа, etc.)
- Сложнее тестировать из-за проверки контракта
Взаимодействую по средством HTTP
- Нет зависимости частей от технологий, языка программирования
- Части автономны, поэтому легко расширяются в распределеннную систему
- Микросервисы медленне работают, из-за большого количество передачи данных через сеть
- Много дублированных частей и добавляются контракты между сервисами
- Каждый сервис может использовать свою версию сторонних библиотек
- Сложно построить архитектуру и обслуживать её
- Базы данных разделены, сложно синхронизировать эти базы
- Каждый сервис может делать отдельная команда
- Difference between Monolithic, SOA and microservices architecture
Если система влазит в голову одного человек) то лучше монолит
Если сложность новой фичи большая, то лучше разбить на микросервисы
Часто начинают с монолита, а потом переходят на микросервисы
- What is cloud?
Облачные вычисления (англ. cloud computing) — модель обеспечения удобного сетевого доступа по требованию к некоторому общему фонду конфигурируемых вычислительных ресурсов, которые могут быть оперативно предоставлены и освобождены с минимальными эксплуатационными затратами или обращениями к провайдеру
- Клауд - вычислительные ресурсы доступные по сити интернет
- Функции решаемые клаудом : хранить данные, передавать данные и вычислять операции
Характеристики:
- Самообслуживание по требованию
- Универсальный доступ по сети
- Объединение ресурсов
- Эластичность
- Учёт потребления
-
- Reason to use cloud
- Экономить на инфраструктуре
- Адаптировать под нужды системы
- Servless Architecture overview
Архитектура при которой, сервера находятся в облаке
Function as a service
-
- Difference between IaaS, PaaS and SaaS
IaaS:
- минимальная стоимость
- повышенная масштабируемость
- простое развертывание
SaaS:
- Доступный по цене
- Доступен в любом месте
- Готовый к использованию
PaaS:
- Минимальное время на разработку
- Поддерживает множество языков программирования
- Улучшенное сотрудничество
-
- Cloud service models overview
- Infrastructure-as-a-Service - модель обслуживания облачных вычислений, по которой потребителям предосталвяется по подписке физические и фундаментальные ресурсы(сервера, ОС и доступ к сети)
- Platform as a Service - предосталвяется платформа: ОС, СУБД, связующее програмное обеспечение, средства разработки и тестирования размещённые у провайдера(AWS, Azure, Google Cloud и т.д.)
- Software as a Service - подписчикам предоставляется приеладное програмное обеспечение польностью обслуживаемое провайдером(всякого рода CRM)
-
- What is encapsulation
- концепция ооп, которая предлагает выделять данные и функционал сущности в отдельную капсулу с целью исключить влияние на окружение, обеспечив доступ к главному, но сокрыв детали(в своеобразный черный ящик)
- Features of encapsulation
Сокрытие данных
Позволяет получить доступ к объекту без раскрытия деталей
Предоставление интрефейса работы с объектом
- Advantages of encapsulation
- Защищает объект от нежелательного доступа
- Уменьшает человеческие ошибки
- Упрощает обслуживание приложения
- Делает приложение более простым для понимания
-
- Support encapsulation in java, how to achieve, benefits of using
- Модификаторы доступа:
- public
- protected
- default(package-private)
- private
Геттеры и Сеттеры/ предоставление интрефейс для работы с объектом
- Difference between inheritance and encapsulation
Наследование в каком-то смысле ломает инкапсуляцию
- What is View?
View(Представление) - представляет собой сохранённый запрос, являющийся результатом выполнения запроса к базе данных, определенного с помощью оператора SELECT, в момент обращения к представлению(виртуальная таблица)
CREATE VIEW - для создания, после этого можно ссылаться ко View как к таблице
-
- Advanteges and disadvanteges of using Views
:check: упрощает сложный запрос
:check: даёт возможность гибкой настройки прав доступа, давая права не на таблицу, а на представление
:check: позволяет разделить логику хранения данных и программного обеспечения
:red_cross: тригер нельзя повесить
- Materialized views
Materialized view - физический объект базы данных, содержащий результат выполнения запроса
- Limitations of a view
Тригер нельзя повесить
По сути используется только для чтения(изменения с ограничениями)
- What is an index? When and how to create
Index- объект базы данных, создаваемый с целью повышения производительности поиска данных
Бывают кластерные или некластерные
Составные и простые
-
- Advanteges and disadvanteges of using indexes
- Ускоряет поиск и чтение
- Замедляет вставку и удаление и апдейт(изменение)
- Индексы увеличивают размер БД
- Types of indexes(Oracle)
Древовидные, хешированные, битовые, functionbase
- Best practice of creating and using indexes
- стараться вычитывать по индексу
- ставить индекс на поля по которым делаюся JOIN и WHERE
- What is it? Important points about varargs in java
- Variable Arguments List - список аргументов переменной длины
Появились в java 1.5, для передачи в метод переменное число аргументов
-
- How varargs work?
public static void fun (int ... a) {//тело}
- этот синтаксис показыает, что метод может принимать 0 или более элементов типа int, в теле метода аргуументы используются как массив
- Varargs in methods. Overloading varargs methods
- Можно делать перегрузку метода с помощью varargs
- Vararg может быть только один на метод и обязательно указываться в конце
- Best practice
альтернатива varargs это перегрузка метода или передача массива аргументов, но это требует написания больше числа кода
Структурные
- Отвечают за построение удобных в поддержке иерархий классов.
Адаптер
- позволяет объектам с несовместимыми интерфейсами работать вместе
:check: Отделяет и скрывает от клиента подробности преобразования различных интерфейсов
:red_cross: Усложняет код программы из-за введения дополнительных классов.
- Клиент — это класс, который содержит существующую бизнес-логику программы.
- Клиентский интерфейс описывает протокол, через который клиент может работать с другими классами.
- Сервис – это какой-то полезный класс, обычно сторонний. Клиент не может использовать этот класс напрямую, так как сервис имеет непонятный ему интерфейс.
- Адаптер — это класс, который может одновременно работать и с клиентом, и с сервисом. Он реализует клиентский интерфейс и содержит ссылку на объект сервиса. Адаптер получает вызовы от клиента через методы клиентского интерфейса, а затем переводит их в вызовы методов обёрнутого объекта в правильном формате.
- Работая с адаптером через интерфейс, клиент не привязывается к конкретному классу адаптера. Благодаря этому, вы можете добавлять в программу новые виды адаптеров, независимо от клиентского кода. Это может пригодиться, если интерфейс сервиса вдруг изменится, например, после выхода новой версии сторонней библиотеки.
Мост
- разделяет один или несколько классов на две отдельные иерархии — абстракцию и реализацию, позволяя изменять их независимо друг от друга.
:check: Позволяет строить платформо-независимые программы.
:check:Скрывает лишние или опасные детали реализации от клиентского кода.
:check: Реализует принцип открытости/закрытости.
:red_cross: Усложняет код программы из-за введения дополнительных классов.
- Абстракция содержит управляющую логику. Код абстракции делегирует реальную работу связанному объекту реализации.
- Реализация задаёт общий интерфейс для всех реализаций. Все методы, которые здесь описаны, будут доступны из класса абстракции и его подклассов.
Интерфейсы абстракции и реализации могут как совпадать, так и быть совершенно разными. Но обычно в реализации живут базовые операции, на которых строятся сложные операции абстракции.
- Конкретные реализации содержат платформо-зависимый код.
- Расширенные абстракции содержат различные вариации управляющей логики. Как и родитель, работает с реализациями только через общий интерфейс реализации.
- Клиент работает только с объектами абстракции. Не считая начального связывания абстракции с одной из реализаций, клиентский код не имеет прямого доступа к объектам реализации.
Компоновщик
- позволяет сгруппировать множество объектов в древовидную структуру, а затем работать с ней так, как будто это единичный объект.
:check: Упрощает архитектуру клиента при работе со сложным деревом компонентов.
:check: Облегчает добавление новых видов компонентов.
:red_cross: Создаёт слишком общий дизайн классов.
- Компонент определяет общий интерфейс для простых и составных компонентов дерева.
- Лист – это простой компонент дерева, не имеющий ответвлений.
Из-за того, что им некому больше передавать выполнение, классы листьев будут содержать большую часть полезного кода.
- Контейнер (или композит) — это составной компонент дерева. Он содержит набор дочерних компонентов, но ничего не знает об их типах. Это могут быть как простые компоненты-листья, так и другие компоненты-контейнеры. Но это не является проблемой, если все дочерние компоненты следуют единому интерфейсу.
Методы контейнера переадресуют основную работу своим дочерним компонентам, хотя и могут добавлять что-то своё к результату.
- Клиент работает с деревом через общий интерфейс компонентов.
Благодаря этому, клиенту не важно, что перед ним находится — простой или составной компонент дерева.
Декоратор
- позволяет динамически добавлять объектам новую функциональность, оборачивая их в полезные «обёртки».
:check: Большая гибкость, чем у наследования.
:check: Позволяет добавлять обязанности на лету.
:check: Можно добавлять несколько новых обязанностей сразу.
:check: Позволяет иметь несколько мелких объектов вместо одного объекта на все случаи жизни.
:red_cross: Трудно конфигурировать многократно обёрнутые объекты.
:red_cross: Обилие крошечных классов.
- Компонент задаёт общий интерфейс обёрток и оборачиваемых объектов.
- Конкретный компонент определяет класс оборачиваемых объектов. Он содержит какое-то базовое поведение, которое потом изменяют декораторы.
- Базовый декоратор хранит ссылку на вложенный объект-компонент. Им может быть как конкретный компонент, так и один из конкретных декораторов. Базовый декоратор делегирует все свои операции вложенному объекту. Дополнительное поведение будет жить в конкретных декораторах.
- Конкретные декораторы — это различные вариации декораторов, которые содержат добавочное поведение. Оно выполняется до или после вызова аналогичного поведения обёрнутого объекта.
- Клиент может оборачивать простые компоненты и декораторы в другие декораторы, работая со всеми объектами через общий интерфейс компонентов.
Фасад
- предоставляет простой интерфейс к сложной системе классов, библиотеке или фреймворку.
:check: Изолирует клиентов от компонентов сложной подсистемы.
:red_cross: Фасад рискует стать божественным объектом, привязанным ко всем классам программы.
- Фасад предоставляет быстрый доступ к определённой функциональности подсистемы. Он «знает», каким классам нужно переадресовать запрос, и какие данные для этого нужны.
- Дополнительный фасад можно ввести, чтобы не «захламлять» единственный фасад разнородной функциональностью. Он может использоваться как клиентом, так и другими фасадами.
- Сложная подсистема состоит из множества разнообразных классов. Для того, чтобы заставить их что-то делать, нужно знать подробности устройства подсистемы, порядок инициализации объектов и так далее.
Классы подсистемы не знают о существовании фасада и работают друг с другом напрямую.
- Клиент использует фасад вместо прямой работы с объектами сложной подсистемы.
Легковес
- позволяет вместить бóльшее количество объектов в отведённую оперативную память. Легковес экономит память, разделяя общее состояние объектов между собой, вместо хранения одинаковых данных в каждом объекте.
:check: Экономит оперативную память.
:red_cross: Расходует процессорное время на поиск/вычисление контекста.
:red_cross: Усложняет код программы из-за введения множества дополнительных классов.
- Вы всегда должны помнить о том, что Легковес применяется в программе, имеющей громадное количество одинаковых объектов. Этих объектов должно быть так много, чтобы они не помещались в доступную оперативную память без ухищрений. Паттерн разделяет данные этих объектов на две части — легковесы и контексты.
- Легковес содержит состояние, которое повторялось во множестве первоначальных объектов. Один и тот же легковес можно использовать в связке со множеством контекстов. Состояние, которое хранится здесь, называется внутренним, а то, которое он получает извне — внешним.
- Контекст содержит «внешнюю» часть состояния, уникальную для каждого объекта. Контекст связан с одним из объектов-легковесов, хранящих оставшееся состояние.
- Поведение оригинального объекта чаще всего оставляют в Легковесе, передавая значения контекста через параметры методов. Тем не менее, поведение можно поместить и в контекст, используя легковес как объект данных.
- Клиент вычисляет или хранит контекст, то есть внешнее состояние легковесов. Для клиента легковесы выглядят как шаблонные объекты, которые можно настроить во время использования, передав контекст через параметры.
- Фабрика легковесов управляет созданием и повторным использованием легковесов. Фабрика получает запросы, в которых указано желаемое состояние легковеса. Если легковес с таким состоянием уже создан, фабрика сразу его возвращает, а если нет — создаёт новый объект.
Заместитель
- позволяет подставлять вместо реальных объектов специальные объекты-заменители. Эти объекты перехватывают вызовы к оригинальному объекту, позволяя сделать что-то до или после передачи вызова оригиналу.
:check: Позволяет контролировать сервисный объект незаметно для клиента.
:check: Может работать, даже если сервисный объект ещё не создан.
:check: Может контролировать жизненный цикл служебного объекта.
:red_cross: Усложняет код программы из-за введения дополнительных классов.
:red_cross: Увеличивает время отклика от сервиса.
- Интерфейс сервиса определяет общий интерфейс для сервиса и заместителя. Благодаря этому, объект заместителя можно использовать там, где ожидается объект сервиса.
- Сервис содержит полезную бизнес-логику.
- Заместитель хранит ссылку на объект сервиса. После того как заместитель заканчивает свою работу (например, инициализацию, логирование, защиту или другое), он передаёт вызовы вложенному сервису.
Заместитель может сам отвечать за создание и удаление объекта сервиса.
- Клиент работает с объектами через интерфейс сервиса. Благодаря этому, его можно «одурачить», подменив объект сервиса объектом заместителя.
Порождающие
- Отвечают за удобное и безопасное создание новых объектов или даже целых семейств объектов.
Одиночка
- гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа
:check: Гарантирует наличие единственного экземпляра класса.
:check: Предоставляет к нему глобальную точку доступа.
:check: Реализует отложенную инициализацию объекта-одиночки.
:red_cross: Нарушает принцип единственной ответственности класса.
:red_cross: Маскирует плохой дизайн.
:red_cross: Проблемы мультипоточности.
:red_cross: Требует постоянного создания Mock-объектов при юнит-тестировании.
Способы реализации:
- enum
- Lazy-init(thread safe/ not thread safe)
- Eager(Singleton.Instance = new...)
https://habr.com/ru/post/27108/
- Одиночка определяет статический метод getInstance, который возвращает единственный экземпляр своего класса.
Конструктор одиночки должен быть скрыт от клиентов. Вызов метода getInstance должен стать единственным способом получить объект этого класса.
Прототип
- позволяет копировать объекты, не вдаваясь в подробности их реализации.
:check: Позволяет клонировать объекты, не привязываясь к их конкретным классам.
:check: Меньше повторяющегося кода инициализации объектов.
:check: Ускоряет создание объектов.
:check: Альтернатива созданию подклассов для конструирования сложных объектов.
:red_cross: Сложно клонировать составные объекты, имеющие ссылки на другие объекты.
Способы создания:
1) Копирующий конструктор
2) Реализовать интерфейс с методом .clone()
3) переопределяем .clone() у Object
- Интерфейс прототипов описывает операции клонирования. В большинстве случаев — это единственный метод clone.
- Конкретный прототип реализует операцию клонирования самого себя. Помимо банального копирования значений всех полей, здесь могут быть спрятаны различные сложности, о которых не нужно знать клиенту. Например, клонирование связанных объектов, распутывание рекурсивных зависимостей и прочее.
- Клиент создаёт копию объекта, обращаясь к нему через общий интерфейс прототипов.
Строитель
- позволяет создавать сложные объекты пошагово. Строитель даёт возможность использовать один и тот же код строительства для получения разных представлений объектов
:check: Позволяет создавать продукты пошагово.
:check: Позволяет использовать один и тот же код для создания различных продуктов.
:check: Изолирует сложный код сборки продукта от его основной бизнес-логики.
:red_cross: Усложняет код программы из-за введения дополнительных классов.
:red_cross: Клиент будет привязан к конкретным классам строителей, так как в интерфейсе строителя может не быть метода получения результата.
- Интерфейс строителя объявляет шаги конструирования продуктов, общие для всех видов строителей.
- Конкретные строители реализуют строительные шаги, каждый по-своему. Конкретные строители могут производить разнородные объекты, не имеющие общего интерфейса.
- Продукт — создаваемый объект. Продукты, сделанные разными строителями, не обязаны иметь общий интерфейс.
- Директор определяет порядок вызова строительных шагов для производства той или иной конфигурации продуктов.
- Обычно Клиент подаёт в конструктор директора уже готовый объект-строитель, и в дальнейшем данный директор использует только его. Но возможен и другой вариант, когда клиент передаёт строителя через параметр строительного метода директора. В этом случае можно каждый раз применять разных строителей для производства различных представлений объектов.
Фабричный метод
- определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
:check: Избавляет класс от привязки к конкретным классам продуктов.
:check: Выделяет код производства продуктов в одно место, упрощая поддержку кода.
:check: Упрощает добавление новых продуктов в программу.
:check: Реализует принцип открытости/закрытости.
:red_cross: Может привести к созданию больших параллельных иерархий классов, так как для каждого класса продукта надо создать свой подкласс создателя.
https://www.youtube.com/watch?v=ZAh3NQ9WiSg
- Продукт определяет общий интерфейс объектов, которые может произвести создатель и его подклассы.
- Конкретные продукты содержат код различных продуктов. Продукты будут отличаться реализацией, но интерфейс у них будет общий.
- Создатель объявляет фабричный метод, который должен возвращать новые объекты продуктов. Важно, чтобы тип результата совпадал с общим интерфейсом продуктов.
Зачастую фабричный метод объявляют абстрактным, чтобы заставить все подклассы реализовать его по-своему. Но он может возвращать и некий стандартный продукт.
Несмотря на название, важно понимать, что создание продуктов не является единственной функцией создателя. Обычно он содержит и другой полезный код работы с продуктом. Аналогия: большая софтверная компания может иметь центр подготовки программистов, но основная задача компании — создавать программные продукты, а не готовить программистов.
- Конкретные создатели по-своему реализуют фабричный метод, производя те или иные конкретные продукты.
Фабричный метод не обязан всё время создавать новые объекты. Его можно переписать так, чтобы возвращать существующие объекты из какого-то хранилища или кэша.
Абстрактная фабрика
- позволяет создавать семейства связанных объектов, не привязываясь к конкретным классам создаваемых объектов.
:check: Гарантирует сочетаемость создаваемых продуктов.
:check: Избавляет клиентский код от привязки к конкретным классам продуктов.
:check: Выделяет код производства продуктов в одно место, упрощая поддержку кода.
:check: Упрощает добавление новых продуктов в программу.
:check: Реализует принцип открытости/закрытости.
:red_cross: Усложняет код программы из-за введения множества дополнительных классов.
:red_cross: Требует наличия всех типов продуктов в каждой вариации.
- Абстрактные продукты объявляют интерфейсы продуктов, которые связаны друг с другом по смыслу, но выполняют разные функции.
- Конкретные продукты — большой набор классов, которые относятся к различным абстрактным продуктам (кресло/столик), но имеют одни и те же вариации (Викторианский/Модерн).
- Абстрактная фабрика объявляет методы создания различных абстрактных продуктов (кресло/столик).
- Конкретные фабрики относятся каждая к своей вариации продуктов (Викторианский/Модерн) и реализуют методы абстрактной фабрики, позволяя создавать все продукты определённой вариации.
- Несмотря на то, что конкретные фабрики порождают конкретные продукты, сигнатуры их методов должны возвращать соответствующие абстрактные продукты. Это позволит клиентскому коду, использующему фабрику, не привязываться к конкретным классам продуктов. Клиент сможет работать с любыми вариациями продуктов через абстрактные интерфейсы.
Поведенческие
- Решают задачи эффективного и безопасного взаимодействия между объектами программы
Цепочка обязанностей
- позволяет передавать запросы последовательно по цепочке обработчиков. Каждый последующий обработчик решает, может ли он обработать запрос сам и стоит ли передавать запрос дальше по цепи.
:check: Уменьшает зависимость между клиентом и обработчиками.
:check: Реализует принцип единственной обязанности.
:check: Реализует принцип открытости/закрытости.
:red_cross: Запрос может остаться никем не обработанным.
- Обработчик определяет общий для всех конкретных обработчиков интерфейс. Обычно достаточно описать единственный метод обработки запросов, но иногда здесь может быть объявлен и метод выставления следующего обработчика.
- Базовый обработчик — опциональный класс, который позволяет избавиться от дублирования одного и того же кода во всех конкретных обработчиках.
Обычно этот класс имеет поле для хранения ссылки на следующий обработчик в цепочке. Клиент связывает обработчики в цепь, подавая ссылку на следующий обработчик через конструктор или сеттер поля. Также здесь можно реализовать базовый метод обработки, который бы просто перенаправлял запрос следующему обработчику, проверив его наличие.
- Конкретные обработчики содержат код обработки запросов. При получении запроса каждый обработчик решает, может ли он обработать запрос, а также стоит ли передать его следующему объекту.
В большинстве случаев обработчики могут работать сами по себе и быть неизменяемыми, получив все нужные детали через параметры конструктора.
- Клиент может либо сформировать цепочку обработчиков единожды, либо перестраивать её динамически, в зависимости от логики программы. Клиент может отправлять запросы любому из объектов цепочки, не обязательно первому из них.
Команда
- превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать их, а также поддерживать отмену операций.
:check: Убирает прямую зависимость между объектами, вызывающими операции, и объектами, которые их непосредственно выполняют.
:check: Позволяет реализовать простую отмену и повтор операций.
:check: Позволяет реализовать отложенный запуск операций.
:check: Позволяет собирать сложные команды из простых.
:check: Реализует принцип открытости/закрытости.
:red_cross: Усложняет код программы из-за введения множества дополнительных классов.
- Отправитель хранит ссылку на объект команды и обращается к нему, когда нужно выполнить какое-то действие. Отправитель работает с командами только через их общий интерфейс. Он не знает, какую конкретно команду использует, так как получает готовый объект команды от клиента.
- Команда описывает общий для всех конкретных команд интерфейс. Обычно здесь описан всего один метод для запуска команды.
- Конкретные команды реализуют различные запросы, следуя общему интерфейсу команд. Обычно команда не делает всю работу самостоятельно, а лишь передаёт вызов получателю, которым является один из объектов бизнес-логики.
Параметры, с которыми команда обращается к получателю, следует хранить в виде полей. В большинстве случаев объекты команд можно сделать неизменяемыми, передавая в них все необходимые параметры только через конструктор.
- Получатель содержит бизнес-логику программы. В этой роли может выступать практически любой объект. Обычно команды перенаправляют вызовы получателям. Но иногда, чтобы упростить программу, вы можете избавиться от получателей, «слив» их код в классы команд.
- Клиент создаёт объекты конкретных команд, передавая в них все необходимые параметры, среди которых могут быть и ссылки на объекты получателей. После этого клиент связывает объекты отправителей с созданными командами.
Итератор
- даёт возможность последовательно обходить элементы составных объектов, не раскрывая их внутреннего представления.
:check: Упрощает классы хранения данных.
:check: Позволяет реализовать различные способы обхода структуры данных.
:check: Позволяет одновременно перемещаться по структуре данных в разные стороны.
:red_cross: Не оправдан, если можно обойтись простым циклом.
- Итератор описывает интерфейс для доступа и обхода элементов коллекции.
- Конкретный итератор реализует алгоритм обхода какой-то конкретной коллекции. Объект итератора должен сам отслеживать текущую позицию при обходе коллекции, чтобы отдельные итераторы могли обходить одну и ту же коллекцию независимо.
- Коллекция описывает интерфейс получения итератора из коллекции. Как мы уже говорили, коллекции не всегда являются списком. Это может быть и база данных, и удалённое API, и даже дерево Компоновщика. Поэтому сама коллекция может создавать итераторы, так как она знает, какие именно итераторы способны с ней работать.
- Конкретная коллекция возвращает новый экземпляр определённого конкретного итератора, связав его с текущим объектом коллекции. Обратите внимание, что сигнатура метода возвращает интерфейс итератора. Это позволяет клиенту не зависеть от конкретных классов итераторов.
- Клиент работает со всеми объектами через интерфейсы коллекции и итератора. Так клиентский код не зависит от конкретных классов, что позволяет применять различные итераторы, не изменяя существующий код программы.
В общем случае клиенты не создают объекты итераторов, а получают их из коллекций. Тем не менее, если клиенту требуется специальный итератор, он всегда может создать его самостоятельно.
Посредник
- позволяет уменьшить связанность множества классов между собой, благодаря перемещению этих связей в один класс-посредник.
:check: Устраняет зависимости между компонентами, позволяя повторно их использовать.
:check: Упрощает взаимодействие между компонентами.
:check: Централизует управление в одном месте.
:red_cross: Посредник может сильно раздуться.
- Компоненты — это разнородные объекты, содержащие бизнес-логику программы. Каждый компонент хранит ссылку на объект посредника, но работает с ним только через абстрактный интерфейс посредников. Благодаря этому, компоненты можно повторно использовать в другой программе, связав их с посредником другого типа.
- Посредник определяет интерфейс для обмена информацией с компонентами. Обычно хватает одного метода, чтобы оповещать посредника о событиях, произошедших в компонентах. В параметрах этого метода можно передавать детали события: ссылку на компонент, в котором оно произошло, и любые другие данные.
- Конкретный посредник содержит код взаимодействия нескольких компонентов между собой. Зачастую этот объект не только хранит ссылки на все свои компоненты, но и сам их создаёт, управляя дальнейшим жизненным циклом.
- Компоненты не должны общаться друг с другом напрямую. Если в компоненте происходит важное событие, он должен оповестить своего посредника, а тот сам решит — касается ли событие других компонентов, и стоит ли их оповещать. При этом компонент-отправитель не знает, кто обработает его запрос, а компонент-получатель не знает, кто его прислал.
Снимок
- позволяет сохранять и восстанавливать прошлые состояния объектов, не раскрывая подробностей их реализации.
:check: Не нарушает инкапсуляции исходного объекта.
:check: Упрощает структуру исходного объекта. Ему не нужно хранить историю версий своего состояния.
:red_cross: Требует много памяти, если клиенты слишком часто создают снимки.
:red_cross: Может повлечь дополнительные издержки памяти, если объекты, хранящие историю, не освобождают ресурсы, занятые устаревшими снимками.
:red_cross: В некоторых языках (например, PHP, Python, JavaScript) сложно гарантировать, чтобы только исходный объект имел доступ к состоянию снимка.
Наблюдатель
- создаёт механизм подписки, позволяющий одним объектам следить и реагировать на события, происходящие в других объектах.
:check: Издатели не зависят от конкретных классов подписчиков и наоборот.
:check: Вы можете подписывать и отписывать получателей на лету.
:check: Реализует принцип открытости/закрытости.
:red_cross: Подписчики оповещаются в случайном порядке.
Состояние
- позволяет объектам менять поведение в зависимости от своего состояния. Извне создаётся впечатление, что изменился класс объекта.
:check: Избавляет от множества больших условных операторов машины состояний.
:check: Концентрирует в одном месте код, связанный с определённым состоянием.
:check: Упрощает код контекста.
:red_cross: Может неоправданно усложнить код, если состояний мало и они редко меняются.
Стратегия
- определяет семейство схожих алгоритмов и помещает каждый из них в собственный класс, после чего алгоритмы можно взаимозаменять прямо во время исполнения программы.
:check: Горячая замена алгоритмов на лету.
:check: Изолирует код и данные алгоритмов от остальных классов.
:check: Уход от наследования к делегированию.
:check: Реализует принцип открытости/закрытости.
:red_cross: Усложняет программу за счёт дополнительных классов.
:red_cross: Клиент должен знать, в чём состоит разница между стратегиями, чтобы выбрать подходящую.
Шаблонный метод
- определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги на подклассы. Паттерн позволяет подклассам переопределять шаги алгоритма, не меняя его общей структуры.
:check: Облегчает повторное использование кода.
:red_cross: Вы жёстко ограничены скелетом существующего алгоритма.
:red_cross: Вы можете нарушить принцип подстановки Барбары Лисков, изменяя базовое поведение одного из шагов алгоритма через подкласс.
:red_cross: С ростом количества шагов шаблонный метод становится слишком сложно поддерживать.
Посетитель
- позволяет добавлять в программу новые операции, не изменяя классы объектов, над которыми эти операции могут выполняться.
:check: Упрощает добавление операций, работающих со сложными структурами объектов.
:check: Объединяет родственные операции в одном классе.
:check: Посетитель может накапливать состояние при обходе структуры элементов.
:red_cross: Паттерн не оправдан, если иерархия элементов часто меняется.
:red_cross: Может привести к нарушению инкапсуляции элементов.
- What is it Abstaction?
Концепт ооп, заключается в определение ключевых свойст и способов поведения у объектов, для решения поставленной задачи
- Maintaining / Achieving abstaction in java, best practice
Выделение только существенных характеристик
OOP
- методология программирования, основанная на представлении программы в виде совокупности объектов
SOLID
- Single Responsibility - лишь одна причина изменить класс(одна ответсвенность)
- Open Closed - сущности должны быть открыты для расширение, но закрыты для модификации
- Liskov Substitution - наследующий класс должен дополнять, а не изменять функциол базового. Объекты подтипов полжны быть заменяемы их типом.
- Interface Segregation - много интерфейсов, специализированных для клиентов лучше, чем один общего назначения
- Dependency Inversion - зависимость на абстркация, вместо деталей. Детали зависят от абстракций, а абстракции не зависят от деталей(использовать интерфейсы и абстракции, необходимо работать с абстракциями)
YAGNI - You aren't gonna need it - принцип отказа от избыточной функциональностиDRY - Don’t repeat yourself - принцип нацеленный на снижение повторения кодаKISS - Keep it simple, stupid - принцип утверждающий, что системы работают лучше, если он простой, а не усложняется.GRASP - general responsibility assignment software patterns — общие шаблоны распределения ответственностей
- шаблоны, для решения общих задач по назначению ответственностей классам и объектам.
- Information Expert(Информационный эксперт) - Ответственность должна быть назначена тому, кто владеет максимумом необходимой информации для исполнения — информационному эксперту.
- Creator(Создатель ) - Класс должен создавать экземпляры тех классов, которые он может
- Controller(Контроллер ) - Не выполняет работу самостоятельно, а делегирует компетентным исполнителям
- Low Coupling( Слабое зацепление) - распределение ответственностей и данных, обеспечивающее взаимную независимость классов
- High Cohesion(Высокая связность) - это оценочная модель, направленная на удержание объектов должным образом сфокусированными, управляемыми и понятными.
(Связность класса — мера сфокусированности предметных областей его методов)
- Polymorphism(Полиморфизм) - Устройство и поведение системы: определяется данными, задано полиморфными операциями
- Pure Fabrication(Чистая выдумка)
- What is static import in Java?
-
- What advantege(disadvantege) to use static import?
- конфликт пространства имён
- хорошо в случае многократного использования
- Это упрощает и сокращает синтаксис, требующийся для работы со статическими членами.
- Final keyword
- Final class usage in java. Best practice.
- Final vs Abstract class.
- Final method rules, best practice.
- Abstract method vs final method
- Final variable.
- Does final variable requires initialization?
- Blank final field.
- Final parameters: when to use, best practice
- Final local variables rules, best practice
-
GENERAL
Типы отношений между классами:
- Наследование -
- Ассоциация(хранит класс как поле):
- Агрегация - класс можеть жить самостоятельно(передаётся в конструктор)
- Композиция - класс не саомстоятелен от родителя(создаётся в конструкторе)
Нормальные формы
1) Все атрибуты должны быть простые(в одной ячейке одно простое значение)
2) Каждый неключевой атрибут должен зависить от первичного ключа
3) каждый не ключевой атрибут нетранзитивно зависит от первичного ключа
БойсаКода)
-
-
JAVA MEMORY MODEL
- описывает когда изменения одним потоком в памяти будут видны другим потоком
Протокол MESI
- Visibility - когда изменения в одном потоке станут видны в другом потоке
- Atomicity - операции, выполняющие как единое целое, либо не выполняющиеся вовсе
(чтение и запись примитивов, кроме long)
- Oredering - с точки зрения наблюдающего(другого потока) инструкции могут идти в другом порядке, чем написано в коде
- Отношение Happens Before, в пределах одного потока все операции имеют HB
https://habr.com/ru/post/133981/http://www.javaspecialist.ru/2011/06/java-memory-model.html
SQL Transaction
Транзакция - последовательность операций, в виде единицы работы с базой данных
A - Atomicy - Атомарность - неделимость действий(избавляет от неконсистентного состояния)
C - Consitensy - Согласованность - (Целостность) Все данные таблицы соответствуют внутренне логики и структуре - Соблюдаем логические ограничение
I - Isolation - Изолированность - Паралельные транзакции не влияют друг на друга
D - Durability - Долговечность - изменения успешной транзакции будут сохраненыПроблемы изолированности:
- Dirty read - чтение данных, добавленных или изменённых транзакцией, которая впоследствии не подтвердится (откатится)
- Lost update - затираются данные одной транзакции данными другой
- Non-repeatable read - при повторном чтении изменились данные в рамках оджной транзакции
- Phantom reads - при повторном чтении изнелось количество строк
Уровни изоляции(решает проблемы паралельного доступа):
- Serializable (упорядочиваемость) - решает все проблемы - все транзакции выполняются поочереди
- Repeatable read (повторяемость чтения) - решает всё кроме фантомного чтения -
- Read committed - решает проблемы грязног чтения и потерянного обновления -
- Read uncommitted (чтение незафиксированных данных) - решает проблему потерянного обновления
Локи:
Optimistic lock - version - в версион хранитс версия изменний
Pessimistic lock - блокирует всё что используетУровень распространения транзакций(Spring, Propogation):
- REQUIRED - если текущая транзакция, то изменения буду происходить в ней, иначе будет сделана нова транзакция
- REQUIRES_NEW - если есть текущаю, то паузнуть её и создать новую
- MANDATORY - если есть транзакция то работаем в ней, иначе кидает эксепшн
- SUPPORTS - если транзакция открыта, работает с ней, иначе работаем без транзакции
- NOT_SUPPORTED - если есть транзакция, то остановит её и будет рабоать без транзакции, иначе просто без транзакции
- NEVER - работаем без транзакции, если она есть, то кидаем эксепшн
- NESTED - если нет транзакции, то работает с новой, а если была то вложется в неё
Timiout - если время вышло, то транзакция откатывается
NoRollBackFor - список эксепшенов которые не откатыают транзакцию
RollBackFor - список эксепшенов при которых откатыать транзакциюTransaction - Можно вешать на класс, интерфейс или метод. Но лучше не вешать на интерфейс