{"id":15175183,"url":"https://github.com/benevanio/exception","last_synced_at":"2026-02-25T21:35:45.900Z","repository":{"id":257793604,"uuid":"815132169","full_name":"Benevanio/exception","owner":"Benevanio","description":"O Next Reservation é um aplicativo Java simples que gerencia reservas de quartos de hotel. Ele demonstra a aplicação dos princípios SOLID para melhorar a estrutura, manutenibilidade e extensibilidade do código.","archived":false,"fork":false,"pushed_at":"2024-06-14T12:23:42.000Z","size":9,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-21T18:13:51.172Z","etag":null,"topics":["backend-api","backend-service","backend-services-sample","ddd-architecture","java","javafx","javafx-application","solid","solidity-contracts"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Benevanio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-06-14T12:23:26.000Z","updated_at":"2024-06-14T12:26:37.000Z","dependencies_parsed_at":"2024-10-04T01:45:10.112Z","dependency_job_id":null,"html_url":"https://github.com/Benevanio/exception","commit_stats":null,"previous_names":["benevanio/exception"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Benevanio%2Fexception","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Benevanio%2Fexception/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Benevanio%2Fexception/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Benevanio%2Fexception/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Benevanio","download_url":"https://codeload.github.com/Benevanio/exception/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240063929,"owners_count":19742227,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend-api","backend-service","backend-services-sample","ddd-architecture","java","javafx","javafx-application","solid","solidity-contracts"],"created_at":"2024-09-27T12:04:38.869Z","updated_at":"2026-02-25T21:35:45.868Z","avatar_url":"https://github.com/Benevanio.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Next Reservation\n\nEste projeto é um sistema simples de gerenciamento de reservas de quartos de hotel. Ele demonstra o uso dos princípios SOLID na refatoração de um código Java, focando especialmente no tratamento de erros e na separação de responsabilidades.\n\n## Estrutura do Projeto\n\nO projeto está dividido nas seguintes partes principais:\n\n1. **Entities**: Contém a classe `Reservation` que representa uma reserva de quarto.\n2. **Exceptions**: Contém a classe `DomainException` para tratamento de exceções específicas do domínio.\n3. **Services**: Contém as interfaces e implementações para formatação de datas e leitura de entrada.\n4. **App**: Classe principal que integra todos os componentes para executar a aplicação.\n\n### Classes Principais\n\n#### Reservation\n\nA classe `Reservation` representa uma reserva de um quarto de hotel. Ela inclui métodos para obter e atualizar datas de check-in e check-out, bem como calcular a duração da estadia.\n\n```java\npackage model.entities;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.concurrent.TimeUnit;\n\nimport model.exceptions.DomainException;\n\npublic class Reservation {\n    private Integer roomNumber;\n    private Date checkIn;\n    private Date checkOut;\n\n    private static SimpleDateFormat sdf = new SimpleDateFormat(\"dd/MM/yyyy\");\n\n    public Reservation(Integer roomNumber, Date checkIn, Date checkOut) {\n        if (!checkOut.after(checkIn)) {\n            throw new DomainException(\"Check-out date must be after check-in date\");\n        }\n        this.roomNumber = roomNumber;\n        this.checkIn = checkIn;\n        this.checkOut = checkOut;\n    }\n\n    public Integer getRoomNumber() {\n        return this.roomNumber;\n    }\n\n    public void setRoomNumber(Integer roomNumber) {\n        this.roomNumber = roomNumber;\n    }\n\n    public Date getCheckIn() {\n        return this.checkIn;\n    }\n\n    public Date getCheckOut() {\n        return this.checkOut;\n    }\n\n    public long duration() {\n        long diff = this.checkOut.getTime() - this.checkIn.getTime();\n        return TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);\n    }\n\n    public void updateDates(Date checkIn, Date checkOut) throws DomainException {\n        Date now = new Date();\n        if (checkIn.before(now) || checkOut.before(now)) {\n            throw new DomainException(\"Reservation dates for update must be future dates\");\n        }\n        if (!checkOut.after(checkIn)) {\n            throw new DomainException(\"Check-out date must be after check-in date\");\n        }\n        this.checkIn = checkIn;\n        this.checkOut = checkOut;\n    }\n\n    @Override\n    public String toString() {\n        return \"Room \" + this.roomNumber + \", check-in: \" + sdf.format(this.checkIn) + \", check-out: \"\n                + sdf.format(this.checkOut) + \", \" + this.duration() + \" nights\";\n    }\n}\n```\n\n#### DomainException\n\nA classe `DomainException` é usada para lançar exceções específicas do domínio, garantindo que as regras de negócios sejam respeitadas.\n\n```java\npackage model.exceptions;\n\npublic class DomainException extends RuntimeException {\n    private static final long serialVersionUID = 1L;\n\n    public DomainException(String message) {\n        super(message);\n    }\n}\n```\n\n#### DateFormatter Interface\n\nA interface `DateFormatter` define métodos para formatação e análise de datas.\n\n```java\npackage model.services;\n\nimport java.util.Date;\n\npublic interface DateFormatter {\n    Date parse(String dateStr) throws Exception;\n    String format(Date date);\n}\n```\n\n#### SimpleDateFormatter\n\nA classe `SimpleDateFormatter` implementa a interface `DateFormatter` usando `SimpleDateFormat`.\n\n```java\npackage model.services;\n\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\npublic class SimpleDateFormatter implements DateFormatter {\n    private SimpleDateFormat sdf = new SimpleDateFormat(\"dd/MM/yyyy\");\n\n    @Override\n    public Date parse(String dateStr) throws Exception {\n        return sdf.parse(dateStr);\n    }\n\n    @Override\n    public String format(Date date) {\n        return sdf.format(date);\n    }\n}\n```\n\n#### InputReader Interface\n\nA interface `InputReader` define métodos para leitura de entradas.\n\n```java\npackage model.services;\n\npublic interface InputReader {\n    int readInt(String prompt);\n    String readString(String prompt);\n}\n```\n\n#### ConsoleInputReader\n\nA classe `ConsoleInputReader` implementa a interface `InputReader` usando `Scanner` para ler entradas do console.\n\n```java\npackage model.services;\n\nimport java.util.Scanner;\n\npublic class ConsoleInputReader implements InputReader {\n    private Scanner sc;\n\n    public ConsoleInputReader() {\n        sc = new Scanner(System.in);\n    }\n\n    @Override\n    public int readInt(String prompt) {\n        System.out.print(prompt);\n        return sc.nextInt();\n    }\n\n    @Override\n    public String readString(String prompt) {\n        System.out.print(prompt);\n        return sc.next();\n    }\n\n    public void close() {\n        sc.close();\n    }\n}\n```\n\n#### App\n\nA classe principal que integra todos os componentes e executa a aplicação.\n\n```java\nimport java.util.Date;\nimport java.util.Locale;\n\nimport model.entities.Reservation;\nimport model.exceptions.DomainException;\nimport model.services.ConsoleInputReader;\nimport model.services.DateFormatter;\nimport model.services.InputReader;\nimport model.services.SimpleDateFormatter;\n\npublic class App {\n    public static void main(String[] args) {\n        Locale.setDefault(Locale.US);\n        \n        InputReader inputReader = new ConsoleInputReader();\n        DateFormatter dateFormatter = new SimpleDateFormatter();\n\n        try {\n            int number = inputReader.readInt(\"Enter room number: \");\n            Date checkIn = dateFormatter.parse(inputReader.readString(\"Check-in date (dd/MM/yyyy): \"));\n            Date checkOut = dateFormatter.parse(inputReader.readString(\"Check-out date (dd/MM/yyyy): \"));\n\n            Reservation reservation = new Reservation(number, checkIn, checkOut);\n            System.out.println(\"Reservation: \" + reservation);\n            System.out.println();\n\n            System.out.println(\"Enter data to update the reservation:\");\n            checkIn = dateFormatter.parse(inputReader.readString(\"Check-in date (dd/MM/yyyy): \"));\n            checkOut = dateFormatter.parse(inputReader.readString(\"Check-out date (dd/MM/yyyy): \"));\n            reservation.updateDates(checkIn, checkOut);\n            System.out.println(\"Reservation: \" + reservation);\n        } catch (IllegalArgumentException e) {\n            System.out.println(\"Error in reservation: \" + e.getMessage());\n        } catch (DomainException e) {\n            e.printStackTrace();\n        } catch (Exception e) {\n            e.printStackTrace();\n        } finally {\n            ((ConsoleInputReader) inputReader).close();\n            System.out.println(\"End of program\");\n        }\n    }\n}\n```\n\n## Princípios SOLID Aplicados\n\n1. **Single Responsibility Principle (SRP)**: Cada classe tem uma única responsabilidade.\n2. **Open/Closed Principle (OCP)**: As classes podem ser estendidas sem serem modificadas.\n3. **Liskov Substitution Principle (LSP)**: As subclasses podem substituir suas superclasses.\n4. **Interface Segregation Principle (ISP)**: Interfaces específicas foram criadas para diferentes responsabilidades.\n5. **Dependency Inversion Principle (DIP)**: Dependência em abstrações (interfaces) ao invés de implementações concretas.\n\n## Como Executar\n\n1. Compile todas as classes Java.\n2. Execute a classe `App`.\n3. Siga as instruções para inserir os dados de entrada.\n\n## Tratamento de Erros\n\nO sistema trata erros de entrada de dados e regras de negócio usando exceções, garantindo que as datas de check-in e check-out sejam válidas e consistentes com as regras do domínio.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenevanio%2Fexception","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbenevanio%2Fexception","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbenevanio%2Fexception/lists"}