Sobes.tech
Senior

Can you give an example of using the 'god object' pattern in software design?

sobes.tech AI

Answer from AI

The 'God Object' pattern is characterized by a monolithic class that contains too many functions and data, managing almost all aspects of the system.

An example in the context of Android development is the Activity or Fragment class used to perform all tasks:

  • Displaying UI.
  • Handling user input.
  • Loading data from the network.
  • Saving data to a database.
  • Managing application state.
  • Navigating between screens.
// Example of an Activity implementing the "God Object" pattern
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);

        // Initializing dependencies right here
        appDatabase = AppDatabase.getInstance(this);
        networkService = new NetworkService();

        loadDataButton.setOnClickListener(v -> {
            // Load data from network
            networkService.fetchData(new NetworkService.DataCallback() {
                @Override
                public void onSuccess(String data) {
                    // Save to database
                    appDatabase.dataDao().insertData(new DataEntity(data));
                    // Update UI
                    runOnUiThread(() -> dataTextView.setText(data));
                }

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

        // Other logical blocks related to UI, business logic, and data can be here
        setupRecyclerView();
        handleUserAuthentication();
        manageAppPermissions();
    }

    // Method to set up RecyclerView (can be here)
    private void setupRecyclerView() {
       // RecyclerView setup logic...
    }

    // Method to handle authentication (can be here)
    private void handleUserAuthentication() {
       // Authentication logic...
    }

     // Method to manage permissions (can be here)
     private void manageAppPermissions() {
        // Permissions management logic...
     }

    // Other methods for handling various events and logic...
}

Such a class violates SOLID principles, especially the Single Responsibility Principle, leading to:

  • Low readability and maintainability: The code becomes voluminous and hard to understand.
  • High coupling: Changes in one part of the class can affect others.
  • Testing complexity: Difficult to write unit tests for such a class.
  • Low code reusability: Logic is tightly coupled with a specific Activity/Fragment.

To avoid the 'God Object' in Android development, architectural patterns like MVVM, MVP, MVI, Clean Architecture are used, which divide responsibilities among different components (ViewModel, Presenter, Interactor, etc.).