Chiamando un metodo con parametri diversi e iterare

1

Ho un metodo che inserisce nel calendario Android un evento. Puoi vedere uno snippet semplificato in due passaggi: 1) dichiarare le variabili 2) I put in un tipo di matrice che alla fine sarà insert nel calendario e funziona flawlessy:

    private void InsertCalendarEvent() {

     //1)here I declare the variables startMills and endMills
    Calendar beginTime = Calendar.getInstance();
    beginTime.set(2018, 9, 11, 8, 30);
    startMillis = beginTime.getTimeInMillis();
    Calendar endTime = Calendar.getInstance();
    endTime.set(2018, 9, 11, 10, 30);
    endMillis = endTime.getTimeInMillis();

    //2)here insert the values in the db with put(to buid the array)
    // and then finalizing with insert
    cr = this.getContentResolver();
    ContentValues values = new ContentValues();
    values.put(CalendarContract.Events.DTSTART, startMillis);
    values.put(CalendarContract.Events.DTEND, endMillis);
    values.put(CalendarContract.Events.TITLE, editTextValue);
    values.put(CalendarContract.Events.DESCRIPTION, "Time to Run!");
    Uri uri = cr.insert(CalendarContract.Events.CONTENT_URI, values);
    }//end of the method

Ora il mio caso d'uso è che ho bisogno di inserire lo stesso evento in momenti diversi. Quindi mi chiedo quale schema di progettazione dovrei usare per evitare duplicazioni. Fondamentalmente ho bisogno di cambiare il punto "1)" le 2 variabili del tempo startMillis e endMillis , e mantenere iterando immagino il punto "2)" in modo che le due diverse variabili temporali vai al punto "2" e inserisci diversi eventi

Ho pensato approcci diversi 1) DAVVERO CATTIVO. Ripeti tutto il codice ogni volta scrivendo metodi consecutivi come

insertCalendarEventNow();
insertCalendarEventAfterFifteenHours();
insertCalendarEventAfterTweentyEightHours();
//TODO and so on

2) Dividere insertCalendarEvent in due metodi, in qualche modo refactoring il codice in un'altra classe, magari usando un POJO, ArrayList con Map < & gt ;, ma non sono sicuro di come implementare

3) Crea più classi per mantenere la Single Responsibility ma non so come farlo

In che modo un buon architetto potrebbe procedere con questo caso d'uso?

EDIT:

La seconda soluzione sarebbe la strada da percorrere, evitando ArrayList e POJO ?

1) Più semplice ma cattivo La soluzione più semplice duplica molto codice:

 //just pass equal methods with different settings
 addEventAfterOneHour();
 addEventAfterSixHours();
 addEventAfterEightHours();
 addEventAfterThirtyHours();

2) Meglio nella stessa classe senza usare POJO:

 addEvent(startTimeOneHour,EndTimeOneHour);
 addEvent(startTimeSixhours,endTimeSixHours);
 addEvent(startTimeEighthours,endTimeEightHours);
 addEvent(startTimeThirtyhours,endTimeThirtyHours);
//with an addEvent(Long startTime,Long endTime)
    
posta trocchietto 15.08.2018 - 11:25
fonte

2 risposte

3

Il modo più semplice: lascia che il calendario si ripeta per te

Elaborando la risposta di Bart, secondo la documentazione dell'API puoi inserire un evento ricorrente fornire una regola di ricorrenza ( RRULE ). Questa regola è espressa come String quale sintassi e semantica è descritta in RFC 2445 sezione 4.3.10. Puoi trovare un esempio interessante qui .

Iterazione per la creazione di eventi non ricorrenti

Ma potrebbe essere il tuo caso d'uso richiede la creazione di eventi indipendenti. O forse pensi di passare in seguito all'intento di creazione che non consente eventi ricorrenti. Oppure la regola di ricorrenza è troppo complessa per adattarsi ai vincoli di RFC 2445.

In questo caso, la tua opzione 2 sarebbe la strada da percorrere. Ad esempio:

  1. Crea una classe MyEvent per rappresentare il sottoinsieme di eventi che desideri creare ( ad esempio anno, mese, giorno, inizio, inizio, fine, finemin, titolo, ecc.).
  2. Cambia il tuo InsertCalendarEvent() per prendere un MyEvent come argomento: quindi questa funzione diventa generale.
  3. Crea un metodo InsertCalendarEvents() con un Collection di MyEvents come argomento. Questo metodo dovrebbe solo scorrere la collezione (usando un iteratore ) e chiama InsertCalendarEvent() .
  4. Quando devi inserire gli eventi, devi solo generare una raccolta di MyEvents (ad esempio un ArrayList ) e invoca InsertCalendarEvents() .

Ora, non sapendo di più sulla tua applicazione, è difficile dire se è l'approccio migliore. Qui, MyEvent riproduce un passivo ruolo DTO . Ma potresti anche optare per un approccio record attivo e lasciare che MyEvent si salvi sul calendario (in questo caso si dovrebbe eliminare l'ID restituito nell'URI nel caso in cui l'evento debba essere modificato in seguito).

La tua modifica sull'evitare i POJO

L'uso di una classe MyEvent ha il vantaggio di essere riusabile ed evitare di avere metodi con troppi argomenti.

Tuttavia, se pensi che sia un eccesso e in realtà solo il tempo che varia tra gli eventi ripetuti successivi, puoi ovviamente optare per un approccio più semplice e invocare un metodo con la data e l'ora come parametri, esattamente come te immaginalo.

Tra le due alternative, preferirei raccomandare la seconda, per evitare di ripetere codice molto simile con metodi molto simili. Ma farlo richiede alcuni calcoli orari, per preparare i parametri per la chiamata (ad esempio 30 ore dopo potrebbe essere un altro mese di un altro anno). Pertanto suggerirei di considerare il seguente metodo:

    addEventWithOffset(startTime,EndTime, 1) ;
    addEventWithOffset(startTime,EndTime, 6) ;
    addEventWithOffset(startTime,EndTime, 8) ;
    addEventWithOffset(startTime,EndTime, 30) ;
  //with an addEventWithOffset(Long startTime,Long endTime, int offsetInHours)
    
risposta data 15.08.2018 - 15:57
fonte
1

Prima di procedere con questo caso d'uso, vorrei prima controllare alcune condizioni.

  1. Abbiamo davvero bisogno di più copie della stessa voce del calendario con date / orari diversi o vogliamo effettivamente una voce ripetuta?
  2. Il nostro calendario di destinazione supporta la nozione di ripetere le voci del calendario?

Se la risposta è sì per entrambi, allora aggiornerei la funzione InsertCalendarEvent in modo tale che possa anche inserire voci di calendario ripetute.

Se la risposta a entrambe le domande è no, allora cambierei la funzione InsertCalendarEvent per prendere almeno l'ora di inizio come parametro. L'ora di fine potrebbe essere calcolata dalla durata dell'evento. Facoltativamente, puoi anche passare le altre informazioni richieste dalla funzione (tempo di fine / durata, titolo, descrizione) come parametri.
Quindi puoi chiamare la funzione InsertCalendarEvent per tutti gli orari di inizio rilevanti.

Quando si passa l'ora di inizio alla funzione, farlo come oggetto Calendar (o un altro oggetto che rappresenta un punto nel tempo ed è conveniente per il chiamante). La conversione in millisecondi è un dettaglio interno di InsertCalendarEvent di cui i chiamanti non dovrebbero essere disturbati.

    
risposta data 15.08.2018 - 13:27
fonte

Leggi altre domande sui tag