Salta al contenuto principale

17 - Java nel Mondo Reale

Java nel Mondo Reale Passare dalla teoria alla pratica richiede conoscere le best practices per strutturare progetti professionali: logging,...

Cosa ne pensi di questo articolo?

17 - Java nel Mondo Reale
JavaFoto:Godfrey AtimaPexels

In Breve

Java nel Mondo Reale Passare dalla teoria alla pratica richiede conoscere le best practices per strutturare progetti professionali: logging,...

Risposta diretta

La struttura di un progetto Java professionale prevede la separazione delle logiche in moduli distinti per facilitare la manutenzione e l'aggiornamento, con una configurazione centralizzata tramite file o database e il logging dei messaggi critici per monitorare l'esecuzione del sistema.

Java nel Mondo Reale

Passare dalla teoria alla pratica richiede conoscere le best practices per strutturare progetti professionali: logging, configurazione, gestione ambienti.

Cosa Imparerai

  • Struttura progetto professionale
  • Logging con SLF4J e Logback
  • Configurazione esternalizzata
  • Gestione ambienti (dev, test, prod)

Struttura Progetto

Layout Standard Maven/Gradle
my-project/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/
│   │   │       ├── Application.java
│   │   │       ├── config/
│   │   │       ├── controller/
│   │   │       ├── service/
│   │   │       ├── repository/
│   │   │       ├── model/
│   │   │       └── util/
│   │   └── resources/
│   │       ├── application.properties
│   │       ├── application-dev.properties
│   │       ├── application-prod.properties
│   │       └── logback.xml
│   └── test/
│       ├── java/
│       └── resources/
├── pom.xml (o build.gradle)
└── README.md

Logging

SLF4J con Logback
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class UserService {
    private static final Logger logger = LoggerFactory.getLogger(UserService.class);

    public User findUser(Long id) {
        logger.debug("Cercando utente con ID: {}", id);

        try {
            User user = repository.findById(id);
            logger.info("Utente trovato: {}", user.getName());
            return user;
        } catch (UserNotFoundException e) {
            logger.warn("Utente non trovato: {}", id);
            throw e;
        } catch (Exception e) {
            logger.error("Errore durante ricerca utente", e);
            throw new ServiceException("Errore interno", e);
        }
    }
}
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d [%thread] %-5level %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
    </root>

    <logger name="com.example" level="DEBUG" />
</configuration>

Configurazione

application.properties
# Database
db.url=jdbc:postgresql://localhost:5432/mydb
db.username=user
db.password=password
db.pool.size=10

# API
api.timeout.ms=5000
api.retry.count=3

# Feature flags
feature.newUi.enabled=true
Configuration Loader
import java.io.*;
import java.util.Properties;

public class ConfigurationManager {
    private static final Properties props = new Properties();

    static {
        String env = System.getProperty("app.env", "dev");
        String filename = "application-" + env + ".properties";

        try (InputStream is = ConfigurationManager.class
                .getClassLoader().getResourceAsStream(filename)) {
            if (is != null) {
                props.load(is);
            }
        } catch (IOException e) {
            throw new RuntimeException("Impossibile caricare configurazione", e);
        }
    }

    public static String get(String key) {
        return props.getProperty(key);
    }

    public static int getInt(String key, int defaultValue) {
        String value = props.getProperty(key);
        return value != null ? Integer.parseInt(value) : defaultValue;
    }

    public static boolean getBoolean(String key) {
        return Boolean.parseBoolean(props.getProperty(key));
    }
}

// Uso
String dbUrl = ConfigurationManager.get("db.url");
int timeout = ConfigurationManager.getInt("api.timeout.ms", 3000);

Best Practices

Regole per Progetti Professionali

  • Separa configurazione dal codice: file properties, variabili d'ambiente
  • Logga in modo strutturato: livelli appropriati, niente System.out
  • Usa layer architetturali: controller, service, repository
  • Test automatizzati: unit, integration, e2e
  • Documenta: README, Javadoc per API pubbliche
  • Gestisci eccezioni: centralizzato, con logging

Domande frequenti

Quali sono le best practice per strutturare un progetto Java professionale?

Le best practice includono la gestione dei log, la configurazione e la gestione degli ambienti.

Perché è importante implementare una buona gestione dei log in un progetto Java?

La gestione dei log consente di monitorare e risolvere problemi nel codice, migliorando la stabilità e la scalabilità del sistema.

Come posso configurare correttamente il mio progetto Java per garantire una facile gestione degli ambienti?

Utilizzare un approccio modulare e separato tra codice di business e configurazione, ad esempio utilizzando file di proprietà o database.

Quali sono le principali aree da considerare quando si parla di best practices per la struttura dei progetti Java?

Le principali aree da considerare includono logging, configurazione e gestione degli ambienti.

Fonti e approfondimenti

Prova Questi Strumenti

Strumenti gratuiti correlati a questo argomento.

Commenti

Caricamento commenti...

Accedi per commentare

Discuti questo articolo nella community

Unisciti al gruppo Telegram per discutere con altri sviluppatori, fare domande e condividere le tue esperienze.

Ti è piaciuto questo articolo?

Esplora altri contenuti sul blog o scopri i miei progetti