Sobes.tech
Senior

Μπορείτε να δώσετε ένα παράδειγμα χρήσης του μοτίβου 'θεός-αντικείμενο' στον σχεδιασμό λογισμικού;

sobes.tech AI

Απάντηση από AI

Το μοτίβο 'θεός-αντικείμενο' χαρακτηρίζεται από μια μονολιθική κλάση που περιέχει πάρα πολλές λειτουργίες και δεδομένα, διαχειρίζεται σχεδόν όλες τις πτυχές του συστήματος.

Παράδειγμα στο πλαίσιο της ανάπτυξης Android — η κλάση Activity ή Fragment, που χρησιμοποιείται για την εκτέλεση όλων των εργασιών:

  • Εμφάνιση UI.
  • Επεξεργασία εισόδου χρήστη.
  • Φόρτωση δεδομένων από το δίκτυο.
  • Αποθήκευση δεδομένων στη βάση δεδομένων.
  • Διαχείριση της κατάστασης της εφαρμογής.
  • Πλοήγηση μεταξύ οθονών.
// Παράδειγμα 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: " + 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 κ.ά.).