Quali modelli di architettura vengono utilizzati su Android? [chiuso]


268

Sto facendo una piccola ricerca di piattaforme mobili e vorrei sapere quali schemi di progettazione sono utilizzati in Android?

ad es. in iOS Model-view-controller è molto usato insieme a deleghe e altri schemi.

Quali modelli e dove in particolare utilizza Android?

MODIFICARE

Non sto chiedendo modelli di progettazione usati nel profondo del kernel, dalvik e così via, ma di schemi che uno sviluppatore di applicazioni incontrerà durante lo sviluppo di un'applicazione.


2
Dato che la piattaforma Android incorpora un kernel Linux, è troppo ampia una suite di software per rispondere a questa domanda oltre a "tutti i modelli nominati finora, e probabilmente alcuni nuovi se guardi abbastanza attentamente"
Pete Kirkham,

5
@Pete, Ok, probabilmente hai ragione, ma allo stesso tempo non sto andando così in profondità come il kernel, sono interessato alla superficie dell'applicazione, ad es. In iOS UIViewControllerimplementato usando MVC ( UIViewControllerè un controller e la sua radice UIViewè vista) , UIApplicationutilizza la delega con delegato applicazione come delegato e così via ...
Burjua,

4
Penso che dovresti davvero imparare Android dal basso verso l'alto e non provare a "portare" le tue conoscenze da iOS ad Android. Ci sono molti grandi libri là fuori. Apress fa un sacco. Se capisci il ciclo di vita delle app e dei servizi in Android, dovresti essere in grado di capire come progettare correttamente le app.
cieco


Questo potrebbe aiutare: stackoverflow.com/a/49694378
Ali Nem

Risposte:


324

Ho provato a utilizzare sia i modelli architetturali modello – view – controller (MVC) sia modelli – view – presenter per fare sviluppo Android. Le mie scoperte sono che il controller modello-vista funziona bene, ma ci sono un paio di "problemi". Tutto dipende da come percepisci la Activityclasse Android . È un controller o è una vista?

La Activityclasse effettiva non estende la Viewclasse di Android , ma gestisce comunque la visualizzazione di una finestra per l'utente e gestisce anche gli eventi di quella finestra (onCreate, onPause, ecc.).

Ciò significa che quando si utilizza un modello MVC, il controller sarà effettivamente un pseudo view-controller. Dal momento che sta gestendo la visualizzazione di una finestra per l'utente, con i componenti di visualizzazione aggiuntivi aggiunti ad essa con setContentView, e anche la gestione di eventi per almeno i vari eventi del ciclo di vita delle attività.

In MVC, il controller dovrebbe essere il punto di ingresso principale. Il che è un po 'discutibile se questo è il caso quando lo si applica allo sviluppo Android, poiché l'attività è il punto di ingresso naturale della maggior parte delle applicazioni.

Per questo motivo , trovo personalmente che il modello di visualizzazione del modello è perfetto per lo sviluppo di Android. Poiché il ruolo della vista in questo modello è:

  • Serve come punto di ingresso
  • Componenti di rendering
  • Instradamento degli eventi utente al presentatore

Ciò ti consente di implementare il tuo modello in questo modo:

Visualizza : contiene i componenti dell'interfaccia utente e gestisce gli eventi per essi.

Presentatore : questo gestirà la comunicazione tra il tuo modello e la tua vista, guardandola come un gateway per il tuo modello. In altre parole, se hai un modello di dominio complesso che rappresenta, Dio sa cosa, e la tua vista necessita solo di un sottoinsieme molto piccolo di questo modello, il compito dei presentatori è di interrogare il modello e quindi aggiornare la vista. Ad esempio, se si dispone di un modello contenente un paragrafo di testo, un titolo e un conteggio parole. Ma in una determinata vista, devi solo visualizzare il titolo nella vista. Quindi il relatore leggerà i dati necessari dal modello e aggiornerà la vista di conseguenza.

Modello : questo dovrebbe fondamentalmente essere il tuo modello di dominio completo. Speriamo che possa aiutare a rendere il tuo modello di dominio più "stretto", dal momento che non avrai bisogno di metodi speciali per gestire i casi di cui sopra.

Disaccoppiando il modello dalla vista tutti insieme (attraverso l'uso del presentatore), diventa anche molto più intuitivo testare il modello. Puoi avere unit test per il tuo modello di dominio e unit test per i tuoi presentatori.

Provalo. Personalmente lo trovo perfetto per lo sviluppo di Android.


14
Bella risposta! Ho delle domande però: 1. Attività = Visualizza, ho capito bene? 2. Intendi implementare il presentatore come propria classe pubblica o come classe interna dell'Attività? O un frammento (anche classe interiore)? 3. Vuoi dire che le classi di trasferimento devono essere utilizzate al posto delle classi di modello effettive nell'Attività (vista)?
manmal

14
1. Sì, li utilizzo come viste all'interno del modello MVP. 2. personalmente, li segmento in singole classi pubbliche, ma questa è una questione di gusti suppongo :) 3. L'ho spiegato abbastanza male, la frase "inoltra le lezioni necessarie" è fuorviante. Ciò che intendo è che il presentatore si trova tra la vista e il modello, legge il modello e quindi aggiorna la vista. Aggiornerò la mia risposta per essere un po 'più chiara :)
JustDanyul il

grazie per aver
dedicato

11
In realtà adoro lo sviluppo di Android perché è altamente disaccoppiato. Come utilizzo MVC: utilizzare le attività esclusivamente per l'IO utente e utilizzare un servizio locale per tutte le elaborazioni. Quando il servizio vuole mostrare qualcosa, trasmettilo alle tue attività! Lo odio davvero quando altri sviluppatori hanno messo troppa elaborazione in attività.
Qualcuno da qualche parte il

8
@SomeoneSomewhere perché non avere una classe che gestisce queste cose in thread separati / AsyncTasks, perché un servizio?
Ragazzo,

87

Aggiornamento novembre 2018

Dopo aver lavorato e blog su MVC e MVP in Android per diversi anni (vedi il corpo della risposta di seguito), ho deciso di acquisire le mie conoscenze e la comprensione in una forma più completa e facilmente digeribile.

Quindi, ho pubblicato un corso video completo sull'architettura delle applicazioni Android. Quindi, se sei interessato a padroneggiare i modelli architettonici più avanzati nello sviluppo di Android, dai un'occhiata a questo corso completo qui .

Questa risposta è stata aggiornata per rimanere pertinente a novembre 2016


Sembra che tu stia cercando modelli architettonici piuttosto che modelli di design .

I modelli di progettazione mirano a descrivere un "trucco" generale che il programmatore potrebbe implementare per gestire un determinato insieme di attività software ricorrenti. Ad esempio: in OOP, quando è necessario che un oggetto informi una serie di altri oggetti su alcuni eventi, è possibile utilizzare il modello di progettazione dell'osservatore .

Poiché le applicazioni Android (e la maggior parte di AOSP) sono scritte in Java, che è orientato agli oggetti, penso che avrai difficoltà a cercare un singolo modello di progettazione OOP che NON viene utilizzato su Android.

I modelli architettonici , d'altra parte, non affrontano particolari attività del software, ma mirano a fornire modelli per l'organizzazione del software basati sui casi d'uso del componente software in questione.

Sembra un po 'complicato, ma spero che un esempio chiarisca: se qualche applicazione verrà utilizzata per recuperare i dati da un server remoto e presentarli all'utente in modo strutturato, MVC potrebbe essere un buon candidato per la considerazione. Si noti che non ho detto nulla sulle attività del software e sul flusso del programma dell'applicazione: l'ho appena descritto dal punto di vista dell'utente ed è emerso un candidato per un modello architettonico.

Da quando hai citato MVC nella tua domanda, immagino che i motivi architettonici siano ciò che stai cercando.

Inserisci qui la descrizione dell'immagine


Storicamente, non c'erano linee guida ufficiali da parte di Google sulle architetture delle applicazioni, che (tra le altre ragioni) hanno portato a un disordine totale nel codice sorgente delle app Android. In effetti, anche oggi la maggior parte delle applicazioni che vedo non seguono ancora le migliori pratiche di OOP e non mostrano una chiara organizzazione logica del codice.

Ma oggi la situazione è diversa: Google ha recentemente rilasciato la libreria Data Binding , che è completamente integrata con Android Studio e, persino, ha lanciato una serie di progetti di architettura per applicazioni Android .

Due anni fa è stato molto difficile trovare informazioni su MVC o MVP su Android. Oggi, MVC, MVP e MVVM sono diventati "parole d'ordine" nella comunità Android e siamo circondati da innumerevoli esperti che cercano costantemente di convincerci che MVx è migliore di MVy. A mio avviso, discutere se MVx sia migliore di MVy è totalmente inutile perché i termini stessi sono molto ambigui - basta guardare le risposte a questa domanda e capirai che persone diverse possono associare queste abbreviazioni a costrutti completamente diversi.

A causa del fatto che è stata ufficialmente avviata la ricerca del miglior modello architettonico per Android, penso che stiamo per vedere diverse altre idee venire alla luce. A questo punto, è davvero impossibile prevedere quale modello (o modelli) diventeranno standard di settore in futuro - dovremo aspettare e vedere (immagino che si tratti di un anno o due).

Tuttavia, c'è una previsione che posso fare con un alto grado di confidenza: l'uso della libreria Data Binding non diventerà uno standard del settore. Sono fiducioso di dirlo perché la libreria Data Binding (nella sua attuale implementazione) fornisce guadagni di produttività a breve termine e una sorta di linea guida per l'architettura, ma renderà il codice non mantenibile a lungo termine. Una volta che affioreranno gli effetti a lungo termine di questa biblioteca, questa verrà abbandonata.


Ora, anche se oggi abbiamo una sorta di linee guida e strumenti ufficiali, personalmente, non penso che queste linee guida e strumenti siano le migliori opzioni disponibili (e sicuramente non sono le uniche). Nelle mie applicazioni utilizzo la mia implementazione di un'architettura MVC. È semplice, pulito, leggibile e testabile e non richiede librerie aggiuntive.

Questo MVC non è solo esteticamente diverso dagli altri, si basa su una teoria secondo cui le attività in Android non sono elementi dell'interfaccia utente , che ha enormi implicazioni sull'organizzazione del codice.

Quindi, se stai cercando un buon modello architettonico per applicazioni Android che segua i principi SOLID , puoi trovare una descrizione di uno nel mio post sui modelli architettonici MVC e MVP in Android .


2
Ben fatto per fornire tali risorse! Grazie!
Aleksandar,

1
Link molto utili!
Semafora,

Mi piace il tuo video corso! Grazie
Viktor Apoyan

79

inserisci qui la descrizione dell'immagine

Quando raggiungo questo post mi aiuta davvero a capire i modelli con l'esempio, quindi ho fatto la tabella seguente per vedere chiaramente i modelli di progettazione e il loro esempio in Android Framework

Spero che lo troverai utile.


4
Si prega di modificare il tuo post e mostrare il contenuto effettivo come testo invece di screenshot. Altri non possono copiare e incollare dalle tue immagini o aiutarti a correggere i tuoi errori di battitura. Vedi qui per i dettagli. Grazie.
Pang


1
Grazie per questa risposta Ero così confuso tra schemi architettonici e motivi di design, ho ancora una domanda su cosa sia oo-design e sviluppo !? @Peter Walter
Rucha Bhatt Joshi,

Voto a favore questa risposta perché, sebbene la domanda di @Burjua menzioni i modelli di progettazione facendo riferimento alle architetture, ma non sono uguali. Considero questa risposta molto istruttiva e complementare alla domanda originale
Xaren,

Il bus degli eventi utilizza il modello di progettazione dell'editore e dell'abbonato
Devrath,

48

Esistono vari modelli utilizzati nel framework Android come:

  • Il ricevitore di trasmissione utilizza il modello Observer
  • L'invocazione del servizio remoto utilizza il modello proxy
  • Visualizza e visualizza gruppo utilizza il modello composito
  • Media framework utilizza il modello Facciata

5
per favore, per favore, condividi i link (riferimenti)
shanraisshan

si prega di condividere i riferimenti in modo che io possa trovare di più al riguardo. Grazie
Syed Hamza Hassan,

27

Ecco un ottimo articolo su Common Design Patterns per Android :

Modelli creativi:

  • Builder (ad es. AlertDialog.Builder )
  • Iniezione delle dipendenze (ad es. Pugnale 2 )
  • Singleton

Schemi strutturali:

  • Adattatore (ad es. RecyclerView.Adapter )
  • Facciata (ad es. Retrofit )

Modelli comportamentali:

  • Comando (ad es. EventBus )
  • Osservatore (ad es. RxAndroid )
  • Model View Controller
  • Model View ViewModel ( simile al modello MVC sopra )

1
I punti chiave dell'articolo sarebbero belli.
Maxim G,

Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento.
Bhargav Rao

Il bus degli eventi utilizza il modello di progettazione dell'editore e dell'abbonato
Devrath,

16

Le seguenti classi Android utilizzano modelli di progettazione

1) Visualizza titolare utilizza Singleton Design Pattern

2) Intent utilizza il modello di progettazione in fabbrica

3) L'adattatore utilizza il modello di progettazione dell'adattatore

4) Il ricevitore Broadcast utilizza il modello di progettazione Observer

5) La vista utilizza il modello di disegno composito

6) Media FrameWork utilizza il modello di progettazione della facciata


11

Nel caso Notifiche , NotificationCompat.Builderutilizza il Builder Pattern

piace,

mBuilder = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_stat_notification)
                    .setContentTitle(getString(R.string.notification))
                    .setContentText(getString(R.string.ping))
                    .setDefaults(Notification.DEFAULT_ALL);

3
Questo è in realtà il modello Builder.
Piovezan,

@Piovezan mi sbaglio. Grazie per avermi corretto. Ho pensato che fosse una versione semplice di Decorator Pattern.
Jeff T.

6

Android utilizza anche il modello di progettazione di ViewHolder.

Viene utilizzato per migliorare le prestazioni di un ListView durante lo scorrimento.

Il modello di progettazione ViewHolder consente di accedere a ciascuna vista dell'elenco senza la necessità di cercare, risparmiando preziosi cicli del processore. In particolare, evita le chiamate frequenti di findViewById () durante lo scorrimento di ListView e ciò renderà più agevole.


5

Tutti questi modelli, MVC, MVVM , MVP e modello di presentazione , possono essere applicati alle app Android, ma senza un framework di terze parti, non è facile ottenere una struttura ben organizzata e un codice pulito.

MVVM è originato da PresentationModel. Quando applichiamo MVC, MVVM e il modello di presentazione a un'app Android, ciò che vogliamo davvero è avere un progetto chiaro e strutturato e, soprattutto, più semplice per i test unitari.

Al momento, senza un framework di terze parti, di solito hai un sacco di codice (come addXXListener (), findViewById (), ecc.), Che non aggiunge alcun valore aziendale. Inoltre, devi eseguire i test unitari Android anziché i normali test JUnit, che richiedono anni per essere eseguiti e rendere i test unitari piuttosto impraticabili.

Per questi motivi, alcuni anni fa abbiamo avviato un progetto open source, RoboBinding - Un framework per modelli di presentazione vincolante i dati per la piattaforma Android. RoboBinding ti aiuta a scrivere codice UI che è più facile da leggere, testare e gestire. RoboBinding elimina la necessità di codice non necessario come addXXListener o giù di lì , e sposta la logica dell'interfaccia utente al modello di presentazione, che è un POJO e può essere testato tramite normali test JUnit . RoboBinding stesso viene fornito con oltre 300 test JUnit per garantirne la qualità.



1

In Android il modello "processore della coda di lavoro" viene comunemente utilizzato per scaricare le attività dal thread principale di un'applicazione.

Esempio: il design della classe IntentService.

IntentService riceve gli Intenti, avvia un thread di lavoro e interrompe il servizio nel modo appropriato. Tutte le richieste vengono gestite su un singolo thread di lavoro.


0

Binder utilizza "Observer Pattern" per le notifiche dei Destinatari della morte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.