Sobes.tech
Senior

Můžeš uvést příklad použití vzoru 'božský objekt' v návrhu softwaru?

sobes.tech AI

Odpověď od AI

Vzorec 'bůh-objekt' je charakterizován monolitickou třídou, která obsahuje příliš mnoho funkcí a dat a spravuje téměř všechny aspekty systému.

Příklad v kontextu vývoje pro Android — třída Activity nebo Fragment, která je používána k vykonávání všech úkolů:

  • Zobrazení uživatelského rozhraní.
  • Zpracování uživatelského vstupu.
  • Načítání dat ze sítě.
  • Ukládání dat do databáze.
  • Správa stavu aplikace.
  • Navigace mezi obrazovkami.
// Příklad Activity implementující vzor "bůh-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);

        // Inicializace závislostí přímo zde
        appDatabase = AppDatabase.getInstance(this);
        networkService = new NetworkService();

        loadDataButton.setOnClickListener(v -> {
            // Načtení dat ze sítě
            networkService.fetchData(new NetworkService.DataCallback() {
                @Override
                public void onSuccess(String data) {
                    // Uložení do databáze
                    appDatabase.dataDao().insertData(new DataEntity(data));
                    // Aktualizace UI
                    runOnUiThread(() -> dataTextView.setText(data));
                }

                @Override
                public void onError(String error) {
                    // Zpracování chyb
                    runOnUiThread(() -> dataTextView.setText("Chyba: " + error));
                }
            });
        });

        // Další logické bloky související s UI, business logikou a daty mohou být zde
        setupRecyclerView();
        handleUserAuthentication();
        manageAppPermissions();
    }

    // Metoda pro nastavení RecyclerView
    private void setupRecyclerView() {
       // Logika nastavení RecyclerView...
    }

    // Metoda pro zpracování autentizace uživatele
    private void handleUserAuthentication() {
       // Logika autentizace...
    }

     // Metoda pro správu oprávnění
     private void manageAppPermissions() {
        // Logika správy oprávnění...
     }

    // Další metody pro zpracování různých událostí a logiky...
}

Taková třída porušuje princip SOLID, zejména princip jediné odpovědnosti (Single Responsibility Principle), což vede k následujícím problémům:

  • Nízká čitelnost a udržovatelnost: Kód je objemný a složitý na pochopení.
  • Vysoká vazba: Změny v jedné části třídy mohou ovlivnit jiné části.
  • Obtížnost testování: Je těžké psát jednotkové testy pro takovou třídu.
  • Nízká znovu použitelnosť kódu: Logika je úzce svázána s konkrétním Activity/Fragmentem.

Pro vyhnutí se "božímu objektu" v Android vývoji se používají architektonické vzory jako MVVM, MVP, MVI, Clean Architecture, které rozdělují odpovědnosti mezi různé komponenty (ViewModel, Presenter, Interactor atd.).