Sobes.tech
Senior

Tudsz példát mondani a 'isten-objektum' mintázat használatára szoftvertervezésben?

sobes.tech MI

Válasz az MI-től

Az 'isten-objektum' minta egy monolitikus osztály jellemzője, amely túl sok funkciót és adatot tartalmaz, és szinte minden rendszer szempontját irányítja.

Android fejlesztés kontextusában például az Activity vagy Fragment osztály, amelyet minden feladat végrehajtására használnak:

  • Felhasználói felület megjelenítése.
  • Felhasználói bemenet kezelése.
  • Adatok betöltése hálózatról.
  • Adatok mentése adatbázisba.
  • Az alkalmazás állapotának kezelése.
  • Navigáció az egyes képernyők között.
// Példa egy Activity-re, amely megvalósítja az "isten-objektum" mintát
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);

        // Függőségek közvetlen inicializálása
        appDatabase = AppDatabase.getInstance(this);
        networkService = new NetworkService();

        loadDataButton.setOnClickListener(v -> {
            // Adatok betöltése hálózatról
            networkService.fetchData(new NetworkService.DataCallback() {
                @Override
                public void onSuccess(String data) {
                    // Adatok mentése adatbázisba
                    appDatabase.dataDao().insertData(new DataEntity(data));
                    // UI frissítése
                    runOnUiThread(() -> dataTextView.setText(data));
                }

                @Override
                public void onError(String error) {
                    // Hibakezelés
                    runOnUiThread(() -> dataTextView.setText("Hiba: " + error));
                }
            });
        });

        // Egyéb logikai blokkok, amelyek UI-hoz, üzleti logikához és adatokhoz kapcsolódnak
        setupRecyclerView();
        handleUserAuthentication();
        manageAppPermissions();
    }

    // A RecyclerView beállításához
    private void setupRecyclerView() {
       // RecyclerView beállítási logika...
    }

    // A felhasználói hitelesítés kezelése
    private void handleUserAuthentication() {
       // Hitelesítési logika...
    }

     // Engedélyek kezelése
     private void manageAppPermissions() {
        // Engedélyek kezelése...
     }

    // Egyéb események és logika kezelése
}

Ez az osztály sérti a SOLID elveket, különösen az egységes felelősség elvét (Single Responsibility Principle), és a következő problémákhoz vezet:

  • Alacsony olvashatóság és karbantarthatóság: A kód nagy és nehezen érthető.
  • Magas kapcsolódás: Egy változtatás az egyik részen befolyásolhat más részeket.
  • Tesztelés nehézsége: Nehéz egységteszteket írni ilyen osztályokhoz.
  • Az újrahasznosítás alacsony lehetősége: A logika szorosan kötött egy adott Activity/Fragment-hez.

Az Android fejlesztésben a 'isten-objektum' problémájának elkerülésére architekturális mintákat, például MVVM, MVP, MVI, Clean Architecture alkalmaznak, amelyek szétválasztják a felelősségeket külön komponensek között (ViewModel, Presenter, Interactor stb.).