Sobes.tech
Senior

Môžeš uviesť príklad použitia vzoru 'boh-objekt' v návrhu softvéru?

sobes.tech AI

Odpoveď od AI

Vzorec 'boh-objekt' je charakterizovaný monolitickou triedou, ktorá obsahuje príliš veľa funkcií a dát a spravuje takmer všetky aspekty systému.

Príklad v kontexte vývoja pre Android — trieda Activity alebo Fragment, ktorá sa používa na vykonávanie všetkých úloh:

  • Zobrazenie používateľského rozhrania.
  • Spracovanie používateľského vstupu.
  • Načítanie dát zo siete.
  • Ukladanie dát do databázy.
  • Správa stavu aplikácie.
  • Navigácia medzi obrazovkami.
// Príklad Activity, ktorá implementuje vzor "boh-objekt"
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);

        // Inicializácia závislostí priamo tu
        appDatabase = AppDatabase.getInstance(this);
        networkService = new NetworkService();

        loadDataButton.setOnClickListener(v -> {
            // Načítanie dát zo siete
            networkService.fetchData(new NetworkService.DataCallback() {
                @Override
                public void onSuccess(String data) {
                    // Uloženie do databázy
                    appDatabase.dataDao().insertData(new DataEntity(data));
                    // Aktualizácia UI
                    runOnUiThread(() -> dataTextView.setText(data));
                }

                @Override
                public void onError(String error) {
                    // Spracovanie chýb
                    runOnUiThread(() -> dataTextView.setText("Chyba: " + error));
                }
            });
        });

        // Ďalšie logické bloky súvisiace s UI, biznis logikou a dátami môžu byť tu
        setupRecyclerView();
        handleUserAuthentication();
        manageAppPermissions();
    }

    // Metóda na nastavenie RecyclerView
    private void setupRecyclerView() {
       // Logika nastavenia RecyclerView...
    }

    // Metóda na spracovanie autentifikácie používateľa
    private void handleUserAuthentication() {
       // Logika autentifikácie...
    }

     // Metóda na správu povolení
     private void manageAppPermissions() {
        // Logika správy povolení...
     }

    // Ďalšie metódy na spracovanie rôznych udalostí a logiky...
}

Takáto trieda porušuje princípy SOLID, najmä princíp jednotnej zodpovednosti (Single Responsibility Principle), a vedie k nasledujúcim problémom:

  • Nízka čitateľnosť a údržba: Kód je objemný a ťažko zrozumiteľný.
  • Vysoká väzba: Zmeny v jednej časti triedy môžu ovplyvniť iné časti.
  • Ťažkosti pri testovaní: Je ťažké písať jednotkové testy pre takúto triedu.
  • Nízka opakovateľnosť kódu: Logika je úzko spojená s konkrétnym Activity/Fragmentom.

Na vyhnutie sa 'boh-objektu' v Android vývoji sa používajú architektonické vzory ako MVVM, MVP, MVI, Clean Architecture, ktoré rozdeľujú zodpovednosti medzi rôzne komponenty (ViewModel, Presenter, Interactor a pod.).