Programação Orientada a Objetos (OOP)

A Programação Orientada a Objetos (OOP) é um paradigma de programação que utiliza "objetos" – instâncias de classes – para criar modelos baseados no mundo real. Este projeto faz uso extensivo dos conceitos de OOP, como encapsulamento, herança e polimorfismo, para garantir modularidade, reutilização de código e manutenção facilitada.

Encapsulamento

O encapsulamento é utilizado para proteger os dados das classes, permitindo que apenas métodos específicos possam acessar ou modificar esses dados. No projeto, os modificadores de acesso private, protected e public são usados para controlar a visibilidade dos atributos e métodos das classes, o signal faz parte do sistema de sinais e slots do Qt e é um mecanismo que permite a comunicação entre objetos do Qt. Ele é usado para notificar outros objetos quando um evento específico ocorre e está descrito com mais detalhes na página Implementação e Recursos Específicos do Qt.

Exemplo:

pessoa.h
class Pessoa : public QObject 
{
    Q_OBJECT
    public:
        explicit Pessoa(const QString& nome, const QString& cpf, const QString& contato,
        const QString& email, const QDate& dataNascimento);
        ~Pessoa();
        QString getNome() const;
        QString getCpf() const;
        QString getContato() const;
        QString getEmail() const;
        QDate getDataDeNascimento() const;
    
    protected:
        QString nome;
        QString cpf;
        QString contato;
        QString email;
        QDate dataNascimento;
};

Neste exemplo, os atributos da classe Pessoa são protegidos (protected), permitindo que apenas a própria classe e suas subclasses possam acessá-los diretamente. Os métodos getNome, getCpf, etc., são públicos (public), permitindo acesso controlado aos atributos.

Herança

A herança permite que uma classe (subclasse) herde atributos e métodos de outra classe (superclasse). No projeto, a classe Pessoa é a superclasse para as classes Paciente e Colaborador.

Exemplo:

pessoa.h
class Paciente : public Pessoa 
{
Q_OBJECT
    public:
        explicit Paciente(const QString& nome, const QString& cpf, const QString& contato,
        const QString& email, const QDate& dataNascimento,
        const QString& convenio, const QString& diagnostico);
        ~Paciente();
        bool salvarNoBanco();
        
    signals:
        void pacienteCadastrado(int id);
    
    private:
        QString convenio;
        QString diagnostico;
};

A classe Paciente herda os atributos e métodos da classe Pessoa, adicionando novos atributos (convenio e diagnostico) e métodos específicos.

Modularidade e Reutilização de Código

O design do projeto foi pensado para ser modular e permitir a reutilização de código. As classes são organizadas em módulos, cada um responsável por uma funcionalidade específica, como gestão de pacientes, colaboradores, agendamentos e estoque. Isso facilita a manutenção e a expansão do sistema.

Diagrama de Classes

Atualizado