Sobes.tech
Senior

Poți oferi un exemplu de utilizare a pattern-ului 'obiect-zeu' în proiectarea software?

sobes.tech AI

Răspuns de la AI

Pattern-ul 'obiectul-zeu' se caracterizează printr-o clasă monolitică care conține prea multe funcții și date, gestionând aproape toate aspectele sistemului.

Un exemplu în contextul dezvoltării Android este clasa Activity sau Fragment, utilizată pentru a realiza toate sarcinile:

  • Afișarea UI.
  • Procesarea inputului utilizatorului.
  • Încărcarea datelor din rețea.
  • Salvarea datelor în baza de date.
  • Gestionarea stării aplicației.
  • Navigarea între ecrane.
// Exemplu de Activity care implementează pattern-ul "obiectul-zeu"
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);

        // Inițializarea dependențelor direct aici
        appDatabase = AppDatabase.getInstance(this);
        networkService = new NetworkService();

        loadDataButton.setOnClickListener(v -> {
            // Încărcarea datelor din rețea
            networkService.fetchData(new NetworkService.DataCallback() {
                @Override
                public void onSuccess(String data) {
                    // Salvare în bază de date
                    appDatabase.dataDao().insertData(new DataEntity(data));
                    // Actualizare UI
                    runOnUiThread(() -> dataTextView.setText(data));
                }

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

        // Alte blocuri logice legate de UI, logică de business și date pot fi aici
        setupRecyclerView();
        handleUserAuthentication();
        manageAppPermissions();
    }

    // Metodă pentru configurarea RecyclerView (poate fi aici)
    private void setupRecyclerView() {
       // Logica de configurare a RecyclerView...
    }

    // Metodă pentru gestionarea autentificării utilizatorului (poate fi aici)
    private void handleUserAuthentication() {
       // Logica de autentificare...
    }

     // Metodă pentru gestionarea permisiunilor (poate fi aici)
     private void manageAppPermissions() {
        // Logica de gestionare a permisiunilor...
     }

    // Alte metode pentru gestionarea diferitelor evenimente și logici...
}

O astfel de clasă încalcă principiile SOLID, în special principiul responsabilității unice (Single Responsibility Principle), și duce la:

  • Lipsa de lizibilitate și întreținere: Codul devine voluminos și dificil de înțeles.
  • Cohesiune ridicată: Modificările într-o parte a clasei pot afecta alte părți.
  • Dificultăți în testare: Este dificil să scrii teste unitare pentru o astfel de clasă.
  • Reutilizare scăzută a codului: Logica este strâns legată de un anumit Activity/Fragment.

Pentru a evita 'obiectul-zeu' în dezvoltarea Android, se folosesc modele arhitecturale precum MVVM, MVP, MVI, Clean Architecture, care împart responsabilitatea între diferiți componenți (ViewModel, Presenter, Interactor etc.).