Executando verificação de segurança...
5

[DUVIDA] - Arquitetura e Designe - Case: Aluno_Aula

Estou criando um projeto simples de estudo em python utilizando FastAPI e me deparei com um problema.
O projeto consiste em um cadastro de alunos, classes(aulas) e professores.

Imaginando uma tela de um sistema, o usuario pode listar os alunos, ao clicar no aluno, ele lista as aulas, ao clicar na aula ele lista os alunos matriculados na aula.
O mesmo para o professor, ao clicar na aula, ele deve mostrar tbm o professor, e ao clicar no professor ele deve mostrar quais aulas aquele professor ministra.

A forma mais simples que me veio pra fazer me causa um erro de importacao circular.

# aluno.py
from app.aula import Aula

class Aluno:
    nome: str
    idade: int
    periodo: int
    aulas: [Aula]
# aula.py
from app.aluno import Aluno
from app.professor import Professor

class Aula:
    disciplina: str
    professor: Professor
    alunos: [Aluno]

Entao possuimos 2 modulos e nesse exemplo ja da pra entender que teremos um erro de importacao circular.
Pensei na possibilidade de criar uma outra classe para ter os dados tanto de aluno quanto de aula, assim como seria feito numa tabela N:N, mas por algum motivo essa solucao me incomoda um pouco pq algo me diz q n seria a melhor solucao.

# Solucao inviavel
# aluno_aula.py
from app.aluno import Aluno
from app.aula import Aula

class AlunoAula:
    alunos: [Aluno]
    aulas: [Aula]
    

Alguem poderia me ajudar com essa solucao ? ou filosofar comigo sobre o caso ?

Agradeco desde ja.

Carregando publicação patrocinada...
3

Python tem um probleminha com importação circular.
Você pode dar uma olhada na PEP 484, lá esse erro é discutido.

De grosso modo esse erro ocorre quando você tenta utilizar seus scripts todos no mesmo pacote
e realizar importações entre eles.

A solução é mudar a sintaxe da importação, mudar a sintaxe dos type hints, e o mais importante, se você for instanciar alguma das classes, essa classe deve ser instanciada em um módulo separado do pacote.

Veja abaixo:

estrutura

app
   __init__.py
   aluno_aula.py
   aluno.py
   aula.py
main.py

aluno.py

from app import aula

class Aluno:
    nome: str
    idade: int
    periodo: int
    aulas: list['aula.Aula']

aula.py

from app import aluno

class Aula:
    disciplina: str
    alunos: list['aluno.Aluno']

aluno_aula.py

from app import aluno, aula

class AlunoAula:
    alunos: list['aluno.Aluno']
    aulas: list['aula.Aula']

    def say_hello(self) -> None:
        print('hello')

init.py

# __init__.py
# flake8: noqa

from . aluno_aula import AlunoAula

main.py

from app import AlunoAula

aluno_aula = AlunoAula()
aluno_aula.say_hello()
1

Entendi, massa, mas acho q expressei mal a minha duvida, ateh alterei tanto o titulo quanto um pouco do contedo do post.
Meu problema real nao eh tanto a importacao circular em si, mas a arquitetura para q eu consiga manter o comportamento esperado sem ter o problema de importacao circular ou de espelhar as classes como se fossem tabelas do banco de dados.

2

Olá.
Acredito que você possa procurar no domínio alguma entidade que representante essa relação de forma mais sólida.
Algo como uma Turma ou uma Classe que (essas sim) possuem aulas e alunos. Dessa forma você consegue enriquecer o modelo futuramente em caso de necessidade, com horário por exemplo.

1

Soh pra ver se eu entendir, aii nesse caso entao eu teria uma Turma, essa turma teria uma lista de alunos e uma lista de disciplinas pra esses alunos ?

from app.aluno import Aluno
from app.aula import Aula

class Turma:
    alunos: [Aluno]
    disciplinas: [Aula]

Isso ?
Pensando nesse caso, eu acredito q mataria o problema da importacao circular.
Manteria o comportamento esperado do sistema.

Mas minha duvida nesse caso(falo como leigo msm, n to e nem tenho muita propriedade pra dizer q esta errado), mas ter uma classe Turma q faz o intermedio entre aluno e aula n seria o mesmo q ter uma tabela Aluno x Aula, digo em algum lugar eu li q nao eh mais usual desenvolver sistemas q espelhem a arquitetura de um banco de dados, ateh pq a forma de arquitetar um banco SQL seria diferente de um noSQL.
Sendo assim, eu to tentando entender uma forma q fuja da arquitetura do banco de dados em si.

Na vdd no fundo eu me pergunto se tem uma forma de fazer o desenvolvimento de forma concisa que n precise de uma classe Turma para unir aluno e aula.

Agradeco muito pela tua resposta, nesse primeiro momento eu vou desenvolver com a ideia q tu me passou, e como eh um caso apenas de estudo, eu vou alterando a medida q adquiro mais conhecimento.
Vlw guri =]

2

Você ter uma classe (ou conceito) de turma nao é espelhar o banco de dados, mas sim o dominio do negócio da aplicação.
Quando puder dá uma olhada em Domain Driven Design e linguagem ubiqua.
Pode te ajudar a tomar decisões de arquitetura.

1

Me incomoda pq essa solucao me parece muito com a forma ao qual seria feita em um banco de dados.

tabela aluno
tabela aula
tabela turma(aula x aluno)

Esse conceito do sistema ser construido semelhante ao banco de dados ta me pegando, digo n por estar errado ou gerar algum erro, ateh pq minhas experiencias com desenvolvimento visam o banco de dados como o alicerce e o sistema ser construido a partir da da base, tendo classes espelhadas com as tabelas do banco.
Mas recentemente li q essa abordagem de cosntrucao de sistemas nao eh mais tao usual, pq hj podemos ter sistemas com bancos SQL e noSQL sendo assim essa abordagem cai por terra.
Foi aii q comecei com esse projeto, algo simples mas q de alguma forma eu consiga entender esse novo conceito(novo pra mim na real).

Soh q faz um certo tempo q eu to empacado nisso, aii resolvi postar aqui.

2

Tranquilo.
Desculpe, acabei alterando minha resposta e a sua pareceu fora de contexto, mas entendi o que você disse.
Dependendo da aplicação modelar a aplicação baseado no banco de dados não é uma boa solução. Você criar classes artificiais (que não seguem o dominio) apenas para relacionar dados trás uma complexidade desnecessária.
Mas existem classes e classes.
Na dúvida revisita o domínio e verifica se ele já nao possui algo para identificar essa relação.

1
1

Hummmmm
Entendi, massa, vou dar uma olhada sim, pq agora q vc comentou sobre o dominio, pode ser q eu esteja confuso com o conceito de fato.
Nao qrendo abusar massss, tem algum material que vc indicaria ou algum livro q trate bem dos assuntos ?

1

Dá uma lida nesse artigo bem introdutório para te ajudar a entender os conceitos
https://www.locaweb.com.br/blog/temas/codigo-aberto/ddd-entenda-o-domain-driven-design/

Procura pelo Livro "Domain Driven Design - atacando a complexidade no coração do software". É a melhor fonte sobre o assunto, mas é bem..."denso" de informação o que torna a leitura um pouco cansativa, mas vale a pena.

Fiz uma pesquisa rapida e achei esse cara aqui https://dddinpython.com/ que oode ser útil baseado no seu exemplo.