Sobes.tech
Senior

Kun je een voorbeeld geven van het gebruik van het 'god-object' patroon in softwareontwerp?

sobes.tech AI

Antwoord van AI

Het 'god-object' patroon wordt gekenmerkt door een monolithische klasse die te veel functies en gegevens bevat, en bijna alle aspecten van het systeem beheert.

Een voorbeeld in de context van Android-ontwikkeling is de klasse Activity of Fragment, die wordt gebruikt om alle taken uit te voeren:

  • UI weergeven.
  • Gebruikersinvoer verwerken.
  • Gegevens laden vanaf het netwerk.
  • Gegevens opslaan in de database.
  • De status van de app beheren.
  • Navigatie tussen schermen.
// Voorbeeld van een Activity die het 'god-object' patroon implementeert
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);

        // Dependencies direct hier initialiseren
        appDatabase = AppDatabase.getInstance(this);
        networkService = new NetworkService();

        loadDataButton.setOnClickListener(v -> {
            // Gegevens laden vanaf het netwerk
            networkService.fetchData(new NetworkService.DataCallback() {
                @Override
                public void onSuccess(String data) {
                    // Opslaan in de database
                    appDatabase.dataDao().insertData(new DataEntity(data));
                    // UI bijwerken
                    runOnUiThread(() -> dataTextView.setText(data));
                }

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

        // Andere logische blokken gerelateerd aan UI, bedrijfslogica en gegevens kunnen hier zijn
        setupRecyclerView();
        handleUserAuthentication();
        manageAppPermissions();
    }

    // Methode voor het instellen van RecyclerView (kan hier)
    private void setupRecyclerView() {
       // Logica voor RecyclerView-instelling...
    }

    // Methode voor het afhandelen van gebruikersauthenticatie (kan hier)
    private void handleUserAuthentication() {
       // Authenticatielogica...
    }

     // Methode voor het beheren van app-machtigingen (kan hier)
     private void manageAppPermissions() {
        // Logica voor machtigingsbeheer...
     }

    // Andere methoden voor het afhandelen van verschillende gebeurtenissen en logica...
}

Zo'n klasse schendt de SOLID-principes, vooral het Single Responsibility Principle, en leidt tot:

  • Lage leesbaarheid en onderhoudbaarheid: De code wordt omvangrijk en moeilijk te begrijpen.
  • Hoge samenhang: Wijzigingen in een deel van de klasse kunnen andere delen beïnvloeden.
  • Moeilijkheid bij testen: Het is moeilijk om unittests te schrijven voor zo'n klasse.
  • Lage herbruikbaarheid van code: De logica is nauw verbonden met een specifieke Activity/Fragment.

Om het 'god-object' in Android-ontwikkeling te voorkomen, worden architecturale patronen zoals MVVM, MVP, MVI, Clean Architecture gebruikt, die de verantwoordelijkheid verdelen over verschillende componenten (ViewModel, Presenter, Interactor, enz.).