Sobes.tech
Senior

Kas saaks anda näite 'jumal-objekti' mustri kasutamisest tarkvaraarenduses?

sobes.tech AI

Vastus AI-lt

'Jumala objekt' muster on iseloomustatud monoliitse klassiga, mis sisaldab liiga palju funktsioone ja andmeid, juhtides peaaegu kõiki süsteemi aspekte.

Näide Androidi arenduses — klass Activity või Fragment, mida kasutatakse kõigi ülesannete täitmiseks:

  • Kasutajaliidese kuvamine.
  • Kasutaja sisendi töötlemine.
  • Andmete laadimine võrgust.
  • Andmete salvestamine andmebaasi.
  • Rakenduse oleku haldamine.
  • Ekraanide vahel navigeerimine.
// Näide Activity-st, mis rakendab "Jumala objekti" mustrit
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);

        // Sõltuvuste initsialiseerimine siin
        appDatabase = AppDatabase.getInstance(this);
        networkService = new NetworkService();

        loadDataButton.setOnClickListener(v -> {
            // Andmete laadimine võrgust
            networkService.fetchData(new NetworkService.DataCallback() {
                @Override
                public void onSuccess(String data) {
                    // Salvestamine andmebaasi
                    appDatabase.dataDao().insertData(new DataEntity(data));
                    // Kasutajaliidese uuendamine
                    runOnUiThread(() -> dataTextView.setText(data));
                }

                @Override
                public void onError(String error) {
                    // Vigade töötlemine
                    runOnUiThread(() -> dataTextView.setText("Error: " + error));
                }
            });
        });

        // Muud loogikablokid, mis on seotud UI, äriloogika ja andmetega, võivad olla siin
        setupRecyclerView();
        handleUserAuthentication();
        manageAppPermissions();
    }

    // Meetod RecyclerView seadistamiseks (võib olla siin)
    private void setupRecyclerView() {
       // RecyclerView seadistamise loogika...
    }

    // Meetod kasutaja autentimise töötlemiseks (võib olla siin)
    private void handleUserAuthentication() {
       // Autentimise loogika...
    }

     // Meetod õiguste haldamiseks (võib olla siin)
     private void manageAppPermissions() {
        // Õiguste haldamise loogika...
     }

    // Teised meetodid erinevate sündmuste ja loogika töötlemiseks...
}

Selline klass rikub SOLID põhimõtteid, eriti ühel vastutusel põhinevat põhimõtet (Single Responsibility Principle), mis põhjustab järgmisi probleeme:

  • Madal loetavus ja hooldatavus: kood muutub mahukaks ja keeruliseks mõista.
  • Kõrge sidusus: muudatused ühes osas võivad mõjutada teisi.
  • Testimise keerukus: sellise klassi üksustestide kirjutamine on keeruline.
  • Madal koodi taaskasutusvõimalus: loogika on tihedalt seotud konkreetse Activity/Fragment-ga.

Androidi arenduses kasutatakse arhitektuurilisi mustreid, nagu MVVM, MVP, MVI, Clean Architecture, mis jagavad vastutust erinevate komponentide vahel (ViewModel, Presenter, Interactor jne.), et vältida 'Jumala objekti' mustrit.