Sobes.tech
Senior

Ar galite pateikti pavyzdį, kaip naudojamas 'Dievo objektas' programinės įrangos projektavime?

sobes.tech AI

Atsakymas iš AI

'Dievo objektų' šablonas pasižymi monolitiniu klasiu, kuris turi per daug funkcijų ir duomenų, valdydamas beveik visus sistemos aspektus.

Pavyzdys Android kūrime — klasė Activity arba Fragment, naudojama visų užduočių vykdymui:

  • Vartotojo sąsajos rodymas.
  • Vartotojo įvesties apdorojimas.
  • Duomenų įkėlimas iš tinklo.
  • Duomenų saugojimas duomenų bazėje.
  • Programos būsenos valdymas.
  • Tarp ekranų navigacija.
// Pavyzdys Activity, įgyvendinančios "Dievo objekto" šabloną
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);

        // Priklausomybių inicijavimas čia
        appDatabase = AppDatabase.getInstance(this);
        networkService = new NetworkService();

        loadDataButton.setOnClickListener(v -> {
            // Duomenų įkėlimas iš tinklo
            networkService.fetchData(new NetworkService.DataCallback() {
                @Override
                public void onSuccess(String data) {
                    // Saugojimas duomenų bazėje
                    appDatabase.dataDao().insertData(new DataEntity(data));
                    // Vartotojo sąsajos atnaujinimas
                    runOnUiThread(() -> dataTextView.setText(data));
                }

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

        // Kiti logikos blokai, susiję su UI, verslo logika ir duomenimis, gali būti čia
        setupRecyclerView();
        handleUserAuthentication();
        manageAppPermissions();
    }

    // Metodas RecyclerView konfigūravimui (gali būti čia)
    private void setupRecyclerView() {
       // RecyclerView konfigūracijos logika...
    }

    // Metodas vartotojo autentifikacijai apdoroti (gali būti čia)
    private void handleUserAuthentication() {
       // Autentifikacijos logika...
    }

     // Metodas leidimų valdymui (gali būti čia)
     private void manageAppPermissions() {
        // Leidimų valdymo logika...
     }

    // Kiti metodai įvairių įvykių ir logikos apdorojimui...
}

Toks klasės modelis pažeidžia SOLID principus, ypač vienos atsakomybės principą (Single Responsibility Principle), kas sukelia šias problemas:

  • Mažas skaitomumas ir palaikymas: kodas tampa didelis ir sudėtingas suprasti.
  • Aukšta susietumas: pakeitimai vienoje dalyje gali paveikti kitus.
  • Testavimo sudėtingumas: sunku rašyti vienetinius testus tokiam klasei.
  • Mažas kodo pakartotinio naudojimo potencialas: logika glaudžiai susijusi su konkrečiu Activity/Fragment.

Android kūrime 'Dievo objekto' šablono išvengti naudojamos architektūrinės schemos, tokios kaip MVVM, MVP, MVI, Clean Architecture, kurios skiria atsakomybę tarp skirtingų komponentų (ViewModel, Presenter, Interactor ir kt.).