Sobes.tech
Senior

Podes dar um exemplo do uso do padrão 'objeto deus' no design de software?

sobes.tech IA

Resposta da IA

O padrão 'objeto deus' é caracterizado por uma classe monolítica que contém funções e dados demais, gerindo quase todos os aspetos do sistema.

Um exemplo no contexto do desenvolvimento Android é a classe Activity ou Fragment, usada para realizar todas as tarefas:

  • Exibir a interface de utilizador.
  • Processar a entrada do utilizador.
  • Carregar dados da rede.
  • Guardar dados na base de dados.
  • Gerir o estado da aplicação.
  • Navegar entre telas.
// Exemplo de Activity que implementa o padrão "objeto deus"
public class GodObjectActivity extends AppCompatActivity {

    private TextView dataTextView;
    private Button loadDataButton;
    private AppDatabase appDatabase;
    private NetworkService networkService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_god_object);

        dataTextView = findViewById(R.id.data_text_view);
        loadDataButton = findViewById(R.id.load_data_button);

        // Inicialização de dependências aqui mesmo
        appDatabase = AppDatabase.getInstance(this);
        networkService = new NetworkService();

        loadDataButton.setOnClickListener(v -> {
            // Carregar dados da rede
            networkService.fetchData(new NetworkService.DataCallback() {
                @Override
                public void onSuccess(String data) {
                    // Guardar na base de dados
                    appDatabase.dataDao().insertData(new DataEntity(data));
                    // Atualizar UI
                    runOnUiThread(() -> dataTextView.setText(data));
                }

                @Override
                public void onError(String error) {
                    // Lidar com erros
                    runOnUiThread(() -> dataTextView.setText("Error: " + error));
                }
            });
        });

        // Outros blocos lógicos relacionados com UI, lógica de negócio e dados podem estar aqui
        setupRecyclerView();
        handleUserAuthentication();
        manageAppPermissions();
    }

    // Método para configurar RecyclerView (pode estar aqui)
    private void setupRecyclerView() {
       // Lógica de configuração do RecyclerView...
    }

    // Método para lidar com autenticação de utilizador (pode estar aqui)
    private void handleUserAuthentication() {
       // Lógica de autenticação...
    }

     // Método para gerir permissões (pode estar aqui)
     private void manageAppPermissions() {
        // Lógica de gestão de permissões...
     }

    // Outros métodos para lidar com eventos e lógica...
}

Este tipo de classe viola os princípios SOLID, especialmente o princípio de responsabilidade única (Single Responsibility Principle), levando a:

  • Baixa legibilidade e manutenção: O código torna-se extenso e difícil de entender.
  • Alta coesão: Alterações numa parte da classe podem afetar outras.
  • Dificuldade de testar: É difícil escrever testes unitários para tal classe.
  • Baixa reutilização de código: A lógica está fortemente ligada a um Activity/Fragment específico.

Para evitar o 'objeto deus' no desenvolvimento Android, usam-se padrões arquiteturais como MVVM, MVP, MVI, Clean Architecture, que dividem a responsabilidade entre diferentes componentes (ViewModel, Presenter, Interactor, etc.).