Sobes.tech
Senior

Можеш ли да наведеш пример коришћења патерна 'бог-објекат' у дизајну софтвера?

sobes.tech АИ

Одговор од АИ

Модел 'бог-објекат' карактерише монолитна класа која садржи превише функција и података, управљајући скоро свим аспектима система.

Пример у контексту Android развоја — класа Activity или Fragment, која се користи за извршавање свих задатака:

  • Приказ корисничког интерфејса.
  • Обрада корисничког уноса.
  • Учитавање података са мреже.
  • Складиштење података у базу података.
  • Управљање стањем апликације.
  • Навигација између екрана.
// Пример Activity који реализује модел "бог-објекат"
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);

        // Инициализација зависности директно овде
        appDatabase = AppDatabase.getInstance(this);
        networkService = new NetworkService();

        loadDataButton.setOnClickListener(v -> {
            // Учитавање података са мреже
            networkService.fetchData(new NetworkService.DataCallback() {
                @Override
                public void onSuccess(String data) {
                    // Складиштење у базу података
                    appDatabase.dataDao().insertData(new DataEntity(data));
                    // Ажурирање UI
                    runOnUiThread(() -> dataTextView.setText(data));
                }

                @Override
                public void onError(String error) {
                    // Обрада грешака
                    runOnUiThread(() -> dataTextView.setText("Грешка: " + error));
                }
            });
        });

        // Други логички блокови, повезани са UI, бизнис логиком и подацима могу бити овде
        setupRecyclerView();
        handleUserAuthentication();
        manageAppPermissions();
    }

    // Метод за подешавање RecyclerView
    private void setupRecyclerView() {
       // Логика подешавања RecyclerView...
    }

    // Метод за обраду аутентификације корисника
    private void handleUserAuthentication() {
       // Логика аутентификације...
    }

     // Метод за управљање дозволама
     private void manageAppPermissions() {
        // Логика управљања дозволама...
     }

    // Други методи за обраду различитих догађаја и логике...
}

Такав клас нарушава принципе SOLID, посебно принцип једне одговорности (Single Responsibility Principle), и доводи до следећих проблема:

  • Ниска читљивост и одрживост: Код постаје обиман и тешко разумљив.
  • Висока повезаност: Промене у једном делу класе могу утицати на друге делове.
  • Тешкоће у тестирању: Тешко је писати јединичне тестове за такву класу.
  • Ниска поновна употребљивост кода: Логика је тесно повезана са конкретним Activity/Fragment-ом.

Да би се избегла 'бог-објекат' у Android развоју, користе се архитектонски модели као што су MVVM, MVP, MVI, Clean Architecture, који раздвајају одговорности између различитих компоненти (ViewModel, Presenter, Interactor и др.).