Senior
Czy możesz podać przykład użycia wzorca 'bóg-obiekt' w projektowaniu oprogramowania?
sobes.tech AI
Odpowiedź od AI
Wzorzec 'bóg-obiekt' charakteryzuje się monolityczną klasą, która zawiera zbyt wiele funkcji i danych, zarządzając niemal wszystkimi aspektami systemu.
Przykład w kontekście rozwoju Androida to klasa Activity lub Fragment, używana do wykonywania wszystkich zadań:
- Wyświetlanie interfejsu użytkownika.
- Obsługa wejścia użytkownika.
- Ładowanie danych z sieci.
- Zapisywanie danych w bazie danych.
- Zarządzanie stanem aplikacji.
- Nawigacja między ekranami.
// Przykład Activity implementującej wzorzec "bóg-obiekt"
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);
// Inicjalizacja zależności bezpośrednio tutaj
appDatabase = AppDatabase.getInstance(this);
networkService = new NetworkService();
loadDataButton.setOnClickListener(v -> {
// Ładowanie danych z sieci
networkService.fetchData(new NetworkService.DataCallback() {
@Override
public void onSuccess(String data) {
// Zapis do bazy danych
appDatabase.dataDao().insertData(new DataEntity(data));
// Aktualizacja UI
runOnUiThread(() -> dataTextView.setText(data));
}
@Override
public void onError(String error) {
// Obsługa błędów
runOnUiThread(() -> dataTextView.setText("Error: " + error));
}
});
});
// Inne bloki logiczne związane z UI, logiką biznesową i danymi mogą być tutaj
setupRecyclerView();
handleUserAuthentication();
manageAppPermissions();
}
// Metoda do konfiguracji RecyclerView (może być tutaj)
private void setupRecyclerView() {
// Logika konfiguracji RecyclerView...
}
// Metoda do obsługi uwierzytelniania użytkownika (może być tutaj)
private void handleUserAuthentication() {
// Logika uwierzytelniania...
}
// Metoda do zarządzania uprawnieniami (może być tutaj)
private void manageAppPermissions() {
// Logika zarządzania uprawnieniami...
}
// Inne metody do obsługi różnych zdarzeń i logiki...
}
Taka klasa narusza zasady SOLID, szczególnie zasadę pojedynczej odpowiedzialności (Single Responsibility Principle), co prowadzi do:
- Niskiej czytelności i łatwości utrzymania: Kod staje się obszerny i trudny do zrozumienia.
- Wysokiej spójności: Zmiany w jednej części klasy mogą wpłynąć na inne.
- Trudności w testowaniu: Trudno napisać testy jednostkowe dla takiej klasy.
- Niskiej ponownej użyteczności kodu: Logika jest ściśle powiązana z konkretnym Activity/Fragmentem.
Aby uniknąć 'boga-obiektu' w rozwoju Androida, stosuje się wzorce architektoniczne takie jak MVVM, MVP, MVI, Clean Architecture, które dzielą odpowiedzialność między różne komponenty (ViewModel, Presenter, Interactor itd.).