Wiki for common java theme.

1. Code Convention

Рассмотрим предназначение и использование Code Convention на примере Java.

1.1. Зачем нужно Соглашения по оформлению кода

Соглашения по оформлению кода важны для программистов по ряду причин:

  • 80% от стоимости программного обеспечения приходится на его обслуживание

  • программное обеспечение не всегда поддерживается инженером, который его разработал

  • исходный код программ становится более удобочитаемым, позволяя инженерам более быстро и тщательно понимать код

На данный момент существует большое количество custom code convention, но обычно в их основе лежит одна из приведенных ниже:

Для повседневного использования рекомендуется использовать Google Java Style, потому что она развивается совместно с Java, в отличии от Code Conventions for the Java™ Programming Language, которая последний раз изменялась 20 апреля 1999.

Едиственное что стоит изменить, это:

  • разрешенная ширина строки кода: 100120

  • отступы: 4 whitespaces → 1 tab

1.2. Основные выдержки

1.2.1. WHITESPACE

Пустая строка используется между:

  • членами класса

  • методами

  • логическими секциями в методе

Пробел используется:

  • между keyword и скобкой

  • после запятой

  • вокруг бинарных операторов

  • выражения в цикле for

1.2.2. LINE FEED

Перенос строки используется:

  • после точки с запятой (исключение оператор for)

  • после запятой

  • перед операцией

1.3. Examples

1.3.1. Форматирование троичного оператора

Bad:

alpha=aLongBooleanExpression?beta:gamma;

Well:

alpha = (aLongBooleanExpression) ? beta
                                 : gamma;
alpha = (aLongBooleanExpression) ? beta : gamma;
alpha = (aLongBooleanExpression)
    ? beta
    : gamma;

1.3.2. Объявление переменных

Bad:

int foo, fooarray[];
int level; //indentation level
int size; //size of table
Object currentEntry; //table entry

Well:

int foo;
int[] fooarray;
int level; // indentation level
int size; // size of table
Object currentEntry; // table entry

1.3.3. if, if …​ else, if …​ else if

Bad:

if(condition)
{
statements;
}
if(condition){
statements;
}
else
{
statements;
}
if(condition){
statements;
}else if(condition){
statements;
}else{
statements;
}

Well:

if (condition) {
    statements;
}
if (condition) {
    statements;
} else {
    statements;
}
if (condition) {
    statements;
} else if (condition) {
    statements;
} else {
    statements;
}

1.3.4. while, do …​ while, for, foreach

Bad:

for(initialization;condition;update)
{
statements;
}
for(initialization;condition;update);
for(initialization:list){
statements;
}
while(condition)
{
statements;
}
while(condition);
do{
statements;
}while(condition);

Well:

for (initialization; condition; update) {
    statements;
}
for (initialization; condition; update);
for (initialization : list) {
    statements;
}
while (condition) {
    statements;
}
while(condition);
do {
    statements;
} while (condition);

1.3.5. switch

Bad:

switch(n){
case 1:
statements1;
/* falls through */
case 2:
statements2;
break;
case 3:
statements2;
break;
default:
statements;
break;
}

Well:

switch (n) {
    case 1:
        statements1;
        break;
    case 2:
    case 3:
        statements2;
        break;
    default:
        statements;
}

2. JavaEE vs Spring Framework

2.1. Архитектура Java Enterprise Edition (JavaEE)

Java Enterprise Edition Architecture - это спецификация архитектуры программного обеспечения для корпоративного использования. Поэтому фокус идет на следующие функции:

  • Веб-приложения

  • Безопасность транзакций

  • Администрирование пользователей и данных

  • Высокая доступность

  • Безопасность ресурсов

  • Коррупционной безопасности

  • Масштабируемость

  • Четко определенные интерфейсы

  • Модульные компоненты

Эта функциональность повышает запрос функциональных и нефункциональных требований обязательных для предприятий. Ранее улучшения в Java Enterprise Edition рассматривались в рамках JCP (Java Community Process) и приводят к JSR (Java Specification Request), которые публикуются совместно с эталонной реализацией. Сейчас

Для приложений JavaEE требуется совместимый сервер приложений (Appliacation Server), который должен предоставлять все контейнеры и службы JavaEE спецификации. Обязательными контейнерами могут быть Web-контейнер, содержащий среду выполнения для Servlet и JSP, и EJB-контейнер, содержащий среду выполнения для Enterprise JavaBeans. Эти серверы приложений предоставляют следующие функциональные возможности:

  • Безопасность

  • Управление транзакциями

  • ORM сервисы

  • Службы имен и каталогов (JNDI)

  • Связь между компонентами

  • Внедрение зависимостей (CDI)

  • Поддержка развертывания

Поскольку приложения, как правило, следуют архитектурным шаблонам, приложения JavaEE разрабатываются в соответствии с 3-уровневой архитектурой приложений:

  1. Клиентский уровень. Содержит внешние элементы, использующие Java-компоненты (JSP, JSF) или фреймворки других языков программирования, например AngularJS. Этот уровень подключается к бизнес-уровню с использованием JSP (Java Server Pages), технологии JSF (Java Server Faces), Web-service и Servlet.

  2. Бизнес-уровень. Содержит бизнес-логику, которая реализована в EJB (Enterprise Java Beans). Соединяется с уровнем данных с использованием JPA (Java Persistence API), JMS (Java Message Service) и JTA (Java Transaction API) или Java-фреймворков, таких как Hibernate,

  3. Уровень данных. Хранит данные. Хранилища данных могут быть in-memory, SQL, NoSQL и многих других форматах (XML, JSON, постоянные POJO и т.д.).

Межуровневые компоненты включают в себя JTA (Java Transaction API) для управления транзакциями, JNDI (Java Naming and Directory Interface) и CDI (Contexts and Dependency Injection).

Jakarta Enterprise Edition Architecture

2.2. Spring архитектура

Spring - это Java Framework с открытым исходным кодом. Spring сам по себе является базовым фреймворком или полным набором компонентов фреймворков на основе контекста. В большинстве случаев экосистема Spring выглядит следующим образом:

Spring Architecture

Spring был представлен версией 1.0 в 2003 году для решения ненужных сложностей в архитектурах JavaEE. В качестве альтернативы для JavaEE Spring 2.0 выиграл премию JAX Innovation Award как легковесную систему, которая приносит новшества в экосистему Java. Spring - это модель, основанная на POJO (Plain Old Java Object), которая активно использует интерфейсы и внедрение зависимостей (DI - Dependency Injection). В его рамках, ресурсы, контролируемые с помощью Spring, называются Spring Beans. Spring модули используют модульность, чтобы уменьшить зависимости между модулями. Наиболее известные модули:

  • Spring DAO. используется для JDBC баз данных и управления транзакциями.

  • Spring ORM. интегрирует популярные фреймворки для объектно-реляционных отображений (ORM - Object Relation Mapping), например Hibernate.

  • Spring Web. реализует базовую функциональность веб-приложений.

  • Spring Web MVC. расширяет Spring Web возможностями архитектуры MVC Model-View-Controller и поддерживает REST-Webservices.