Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6b3a417

Browse files
Added DOC folder in the MVCPractice section of a small course on Java EE
1 parent 921593c commit 6b3a417

15 files changed

+821
-0
lines changed

‎MVCPractice/DOC/Attributes.jpg‎

106 KB
Loading[フレーム]

‎MVCPractice/DOC/DAO.txt‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
****** DAO - Data Access Object ******
2+
3+
В программном обеспечении data access object (DAO) — абстрактный интерфейс к какому-либо
4+
типу базы данных или механизму хранения. Определённые возможности предоставляются независимо
5+
от того, какой механизм хранения используется и без необходимости специальным образом
6+
соответствовать этому механизму хранения. Этот шаблон проектирования применим ко множеству
7+
языков программирования, большей части программного обеспечения, нуждающемуся в хранении
8+
информации, и к большей части баз данных. Но традиционно этот шаблон связывают с приложениями
9+
на платформе Java Enterprise Edition, взаимодействующими с реляционными базами данных через
10+
интерфейс JDBC, потому что он появился в рекомендациях от фирмы Sun Microsystems.
11+
12+
В общем случае, определение Data Access Object описывает его как прослойку между БД и системой.
13+
DAO абстрагирует сущности системы и делает их отображение на БД, определяет общие методы
14+
использования соединения, его получение, закрытие и (или) возвращение в Connection Pool.
15+
16+
Вершиной иерархии DAO является абстрактный класс или интерфейс с описанием общих методов,
17+
которые будут использоваться при взаимодействии с базой данных. Как правило, это методы поиска,
18+
удаление по ключу, обновление и т.д.
19+
20+
**************************************************************************************************
21+
public abstract class AbstractController <K, E> {
22+
public abstract List<E> getAll();
23+
public abstract E getEntityById(K id);
24+
public abstract E update(E entity);
25+
public abstract boolean delete(K id);
26+
public abstract boolean create(E entity);
27+
}
28+
**************************************************************************************************
29+
30+
Набор методов не является завершённым, он зависит от конкретной системы. Фиктивный тип 'K' является
31+
ключом сущности, редкая таблица, описывающая сущность, не имеет первичного ключа.

‎MVCPractice/DOC/DTO.txt‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
****** Data Transfer Object ******
2+
3+
Data Transfer Object (DTO) — один из шаблонов проектирования, используется для передачи
4+
данных между подсистемами приложения.
5+
6+
Data Transfer Object, в отличие от business object или data access object не должен содержать
7+
какого-либо поведения.
8+
9+
Зачастую, в клиент-серверных приложениях, данные на клиенте (слой представления) и на сервере
10+
(слой предметной области) структурируются по-разному. На стороне сервера это дает нам возможность
11+
комфортно хранить данные в базе данных или оптимизировать использование данных в угоду
12+
производительности, в то же время заниматься "user-friendly" отображением данных на клиенте, и,
13+
для серверной части, нужно найти способ как переводить данные из одного формата в другой.
14+
15+
Конечно, существуют и другие архитектуры приложений, но мы остановимся на текущей в качестве
16+
упрощения. DTO-подобные объекты могут использоваться между любыми двумя слоями представления
17+
данных (см. DTO_example.png).
18+
19+
DTO — это так называемый value-object на стороне сервера, который хранит данные, используемые в
20+
слое представления. DTO можно разделить на те, что мы используем при запросе (Request) и на те,
21+
что мы возвращаем в качестве ответа сервера (Response).
22+
23+
Хорошие DTO помогают создавать API согласно лучшим практикам и в соответствие с принципом чистого кода.
24+
25+
DTO должны позволять разработчикам писать API, которое внутренне согласовано. Описание параметра на
26+
одной из конечных точек (endpoint) должно применяться и к параметрам с тем же именем на всех связанных
27+
точках. В качестве примера, если поле price при запросе определено как "цена с НДС", то и в ответе
28+
определение поля price не должно измениться. Согласованное API предотвращает ошибки, которые могли
29+
возникнуть из-за различий между конечными точками.
30+
31+
DTO должны быть надёжными и сводить к минимуму необходимость в написании шаблонного кода. Если при
32+
написании DTO легко допустить ошибку, то вам нужно прилагать дополнительные усилия, чтобы ваше API
33+
оставалось согласованным. DTO должны "легко читаться", ведь даже если у нас есть хорошее описание
34+
данных из слоя представления — оно будет бесполезно, если его тяжело найти.

‎MVCPractice/DOC/DTO_example.png‎

66.5 KB
Loading[フレーム]
15.4 KB
Loading[フレーム]
11.7 KB
Loading[フレーム]
86.8 KB
Loading[フレーム]
20.2 KB
Loading[フレーム]

‎MVCPractice/DOC/Fast_Lombok.txt‎

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
****** Аннотации в Lombok ******
2+
3+
Наиболее полезные аннотации в библиотеке:
4+
5+
- @Getter и @Setter — предоставляют геттеры и сеттеры для поля. Могут использоваться как
6+
на уровне поля, так и на уровне класса.
7+
- @NoArgsConstructor — используется для создания конструктора без аргументов.
8+
- @AllArgsConstructor — генерирует параметризованный конструктор, который принимает один
9+
параметр для каждого поля и инициализирует их с его помощью. Аннотация
10+
необходима, если нужно создать объект класса, передав начальные
11+
значения полей в конструктор.
12+
- @ToString — переопределяет метод toString() и создает для него реализацию по умолчанию.
13+
Она выводит имя класса и поля по порядку, разделяя их запятыми. Можно пропустить
14+
отдельные поля, если аннотировать их с помощью @ToString.Exclude.
15+
- @EqualsAndHashCode — применяется для переопределения методов equals() и hashCode().
16+
- @Data — объединяет аннотации @ToString, @Getter, @Setter, @EqualsAndHashCode и
17+
@RequiredArgsConstructor в одну. Предоставляет весь код, который обычно используется в
18+
классах моделей, например, геттеры для всех полей, сеттеры для всех нефинальных полей,
19+
реализацию по умолчанию для toString(), equals() и hashCode(), а также конструктор,
20+
который инициализирует все поля класса.
21+
- @NonNull - обработка переменных, которые не должны получать null.
22+
- @Value - создание неизменяемых классов, аналог Data, но для неизменяемых классов.
23+
- @Builder - реализация паттерна bulder, @Singular – используется для объектов в единственном
24+
экземпляре (добавления элемента в коллекции и т.п.).
25+
ПРИМЕР:
26+
**********************************************************************************************
27+
@Builder
28+
public class Example {
29+
private String name;
30+
private int age;
31+
@Singular
32+
private Set<String> occupations;
33+
}
34+
**********************************************************************************************
35+
36+
- @SneakyThrows - обертка проверяемых исключений.
37+
38+
ПРИМЕР С АННОТАЦИЕЙ:
39+
**********************************************************************************************
40+
@SneakyThrows(UnsupportedEncodingException.class)
41+
public String utf8ToString(byte[] bytes) {
42+
return new String(bytes, «UTF-8»);
43+
}
44+
**********************************************************************************************
45+
46+
ПРИМЕР БЕЗ АННОТАЦИИ:
47+
**********************************************************************************************
48+
public String utf8ToString(byte[] bytes) {
49+
try {
50+
return new String(bytes, "UTF-8");
51+
} catch (UnsupportedEncodingException e) {
52+
throw Lombok.sneakyThrow(e);
53+
}
54+
}
55+
**********************************************************************************************
56+
57+
- @Synchronized - аннотирование synchronized блоков.
58+
59+
ПРИМЕР С АННОТАЦИЕЙ:
60+
**********************************************************************************************
61+
private final Object readLock = new Object();
62+
63+
@Synchronized
64+
public static void hello() {
65+
мой код ...;
66+
}
67+
68+
@Synchronized
69+
public int answerToLife() {
70+
мой код ...;
71+
}
72+
73+
@Synchronized("readLock")
74+
public void foo() {
75+
мой код ...;
76+
}
77+
**********************************************************************************************
78+
79+
ПРИМЕР БЕЗ АННОТАЦИИ:
80+
**********************************************************************************************
81+
private static final Object $LOCK = new Object[0];
82+
private final Object $lock = new Object[0];
83+
private final Object readLock = new Object();
84+
85+
public static void hello() {
86+
synchronized($LOCK) {
87+
...;
88+
}
89+
}
90+
91+
public int answerToLife() {
92+
synchronized($lock) {
93+
...;
94+
}
95+
}
96+
97+
public void foo() {
98+
synchronized(readLock) {
99+
...;
100+
}
101+
}
102+
**********************************************************************************************
103+
104+
- @Cleanup - простое определение ресурсов, так чтобы они автоматически закрывались после
105+
окончания работы кода. Альтернатива try-with-resources.
106+
107+
ПРИМЕР С АННОТАЦИЕЙ:
108+
**********************************************************************************************
109+
@Cleanup InputStream in = new FileInputStream(args[0]);
110+
@Cleanup OutputStream out = new FileOutputStream(args[1]);
111+
...;
112+
**********************************************************************************************
113+
114+
ПРИМЕР БЕЗ АННОТАЦИИ:
115+
**********************************************************************************************
116+
InputStream in = new FileInputStream(args[0]);
117+
try {
118+
OutputStream out = new FileOutputStream(args[1]);
119+
try {
120+
...;
121+
} finally {
122+
if (out != null) {
123+
out.close();
124+
}
125+
}
126+
} finally {
127+
if (in != null) {
128+
in.close();
129+
}
130+
}
131+
**********************************************************************************************

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /