Classe diventando Dio Oggetto quale modello usare

3

Sto sviluppando un'app per Android e il mio MainActivity sta diventando God Object .
Dal modo in cui l'implementazione della classe Activity nativa è già una sorta di God Object .
Il problema è che la mia classe di attività sta crescendo e crescendo.
Permettetemi di spiegare le responsabilità della classe, per coloro che non hanno familiarità con Android.
L'attività è come una schermata con la sua interfaccia utente, ciclo di vita, funzionalità per comunicare con il sistema operativo.
Il cassetto fa parte dell'interfaccia utente che porta al menu laterale delle attività per la navigazione nell'app. Qual è il problema.

public abstract class MainActivity extends SingleFragmentToolBarActivity<T> implements Drawer.OnDrawerItemClickListener {
    private static final int PROFILE_HEADER_IDENTIFIER = 200;
    private float mDisplayDpWidth;
    private float mDisplayDpHeight;
    private Drawer.Result mNavigationDrawer;
    private AccountHeader.Result mAccountHeader;
    private double mDrawerWidthFactor = 0.9;
    private double mDrawerHeaderHeightFactor = 0.3;
    private IProfile<ProfileDrawerItem> mGuestProfile;
    private IProfile<ProfileDrawerItem> mLoggedInProfile;
    private boolean userIsLogged = false;
    public Drawer.Result getNavigationDrawer() {
        return this.mNavigationDrawer;
    }
    private AccountHeader.Result geAccountHeader() {
        return this.mAccountHeader;
    }
    private static final int PROFILE_SETTING = 1;
    private final AccountHeader.OnAccountHeaderSelectionViewClickListener mHeaderSelectionViewClickListener = new AccountHeader.OnAccountHeaderSelectionViewClickListener(.....);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setUpNavigationDrawer(savedInstanceState);
    }

    private void setUpNavigationDrawer(Bundle savedInstanceState) {
        DrawerImageLoader.init(new DrawerImageLoader.IDrawerImageLoader() {
            @Override
            public void set(ImageView imageView, Uri uri, Drawable placeholder) {
                Picasso.with(imageView.getContext()).load(uri).placeholder(placeholder).into(imageView);
            }

            @Override
            public void cancel(ImageView imageView) {
                Picasso.with(imageView.getContext()).cancelRequest(imageView);
            }

            @Override
            public Drawable placeholder(Context ctx) {
                return null;
            }
        });
        getDisplayMetrics();
        mGuestProfile = buildGuestProfile();
        mAccountHeader = buildNavigationHeader(savedInstanceState);
        mNavigationDrawer = buildDrawer(savedInstanceState);
    }
    protected Drawer.Result buildDrawer(Bundle savedInstanceState) {
     Drawer drawer =  new Drawer(this)
            .withActivity(this);
    ........
    }
    protected List<IProfile> getProfileItemList() {
    ......        
    }
    protected AccountHeader.Result buildNavigationHeader(Bundle savedInstanceState) {
    ......
    }
    private ProfileDrawerItem buildGuestProfile() {
        .......
    }
    private ProfileDrawerItem buildLoggedInProfile(UserBean userBean) {
        .......
    }
    private void getDisplayMetrics() {
       .....
    }
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l, IDrawerItem iDrawerItem) {
     ......
    }

    protected Drawer addItemsIntoDrawer(Drawer buildDrawer) {
        ......
    }
    public void setDrawerWidthFactor(double factor) {
      ......
    }
    public void setDrawerHeaderHeightFactor(double factor) {
      ......
    }

Questa è solo la dichiarazione di alcuni metodi e membri della classe.
Questo codice sopra è SOLO per impostare il cassetto di navigazione nel mio MainActivity, ci sarà molto più codice in futuro qui per comunicare con i servizi e così via, se lasciare questo così com'è, presto otterrò classe con milioni di linee di codice, tonnellate di membri della classe e tonnellate di metodi.

Ho per risolvere questo problema, quale modello può essere accettabile in questo modo.
Il cassetto delle impostazioni richiede un riferimento all'Attività.
Ho alcune idee su come risolvere questo problema.
Usa l'interfaccia di creazione del modello di strategia con tutti questi metodi responsabili per l'impostazione del cassetto di navigazione, ma come posso passare il riferimento all'attività nell'implementazione dell'interfaccia in questo caso non devo creare un'interfaccia ma una classe astratta e passare il riferimento all'attività nel suo costruttore.
 Questo funzionerà, ma continuo a pensare che non sia la soluzione perfetta e pulita.

Si prega di suggerire cosa posso fare per fermare la crescita della classe.

Modifica

C'è solo una piccola responsabilità della mia attività, ci saranno responsabilità più importanti in futuro, quindi devo liberarmi di scrivere molto codice di inizializzazione. Non ho pubblicato il corpo dei metodi (300 righe di codice). Ho trovato un modo possibile qui per creare una classe astratta con metodi di base e creare un'implementazione e usarla nella mia attività solo quando ne ho bisogno. E in questo caso sarà possibile cambiarla in runtime (prima che la vista sia stata gonfiato).

    
posta CROSP 01.06.2015 - 13:24
fonte

2 risposte

2

È possibile creare un elenco di classi responsabili per ciascuna operazione, dove e quando ha senso, ad esempio,

public abstract class MainActivity extends SingleFragmentToolBarActivity<T> implements Drawer.OnDrawerItemClickListener {
    ....

    private void setUpNavigationDrawer(Bundle savedInstanceState) {
        NavigationDrawer drawer = new NavigationDrawer(this,savedInstanceState);  
        drawer.setup();
    }
}

Qui puoi spostare la logica per ogni operazione (in questo esempio è NavigationDrawer) per possedere la classe in cui si prende cura dell'operazione.

    
risposta data 01.06.2015 - 15:29
fonte
1

Per prima cosa lo suddivido in un numero di classi con le proprie responsabilità SINGLE.

Prima dovresti applicare i principal GRASP. GRASP

In secondo luogo, vorrei esaminare il modello di progettazione della strategia. Modello di design della strategia

    
risposta data 23.06.2015 - 01:12
fonte