Descrivere un modello di progettazione per la clonazione di un'istanza del record

0

Sto cercando di implementare un'applicazione ma non ho voluto reinventare la ruota. Ho cercato un modello di progettazione più vicino a questa applicazione, ma senza alcun risultato.

  1. All'avvio, l'applicazione chiederà all'amministratore di scegliere da un elenco di attività e di copiare l'attività selezionata nelle attività di quest'anno.

  2. Durante l'anno, un utente normale sarà in grado di controllare le attività completate.

  3. Alla fine dell'anno, l'amministratore indicherà le attività dell'anno come chiuse. Ciò significa che le attività non possono essere cancellate, modificate e non è possibile aggiungere nuove attività.

  4. L'amministratore copia i compiti dell'anno completato nelle attività dell'anno successivo.

Qualcuno sa se sono disponibili uno schema di progettazione o un codice di esempio (o uno pseudo-codice) che corrisponde a questo?

    
posta Snail 10.04.2017 - 05:13
fonte

2 risposte

1

Suggerirei di non aver bisogno di "spostare" gli elenchi. Hai solo bisogno di attribuire le attività.

Potresti avere una singola tabella e / o entità che contiene / aggrega tutte le attività indipendentemente dallo stato o dall'anno. Passiamo attraverso il flusso di lavoro dato questo disegno:

All'avvio

On startup, the application will prompt the administrator to choose from a list of tasks and copy the selected task into this year's tasks.

Il sistema recupera un elenco di tutte le attività che si trovano in uno stato "non assegnato" e le visualizza all'amministratore. L'amministratore controlla alcune delle attività e il sistema cambia lo stato in "assegnato".

Qualsiasi attività non assegnata rimanente può essere lasciata così com'è (ovvero l'amministratore verrà richiamato con loro la prossima volta che accede al sistema) oppure potrebbero essere spostati su uno stato "differito".

Gli utenti normali controllano le attività

Throughout the year, a normal user will be able to check off the completed tasks.

Il sistema recupera e visualizza tutte le attività con stato "assegnato". L'utente può controllarli. Mentre lo fa, il sistema cambia lo stato in "completato".

Chiusura di fine anno

At the end of the year, the administrator will indicate the year's tasks as closed. This means the tasks cannot be deleted, amended and no new tasks can be added.

Il sistema recupera tutte le attività con stato "completato". Dopo l'approvazione dell'amministratore, lo stato di queste attività viene modificato in "chiuso".

Il sistema consente solo l'accesso in sola lettura alle attività contrassegnate come chiuse.

Spostamento delle attività per l'anno successivo

The administrator will copy the completed year's tasks into the next year's tasks.

Qualsiasi attività che rimane in uno stato "assegnato" viene portata avanti.

Si noti che questo design non ha alcuna nozione di "anno". Mi sembra che ci sia sempre un solo anno attivo in qualsiasi momento, quindi non è davvero necessario; hai solo bisogno di sapere quali compiti sono assegnati o completati. Se hai bisogno che abbiano un "anno" a loro assegnato, ad es. per i rapporti o le metriche, è possibile memorizzare un DateAssigned , DateCompleted e DateClosed per ciascuna attività ed eseguire report per anno, o in un altro periodo di tempo se la tua organizzazione si sposta mai in trimestri o anni fiscali o whathaveyou.

Se "anno" è davvero un concetto mission-critical nel tuo modello dati, puoi ovviamente aggiungere un'altra colonna per "anno". L'atto di "spostare" i compiti da un anno all'altro significa semplicemente aggiornare quella colonna. Non devi spostare nulla.

    
risposta data 09.08.2017 - 05:36
fonte
0

Forse ti stai ponendo la domanda sbagliata, in questo momento potrebbe sembrare semplice copiare il record, ma in futuro, e anche adesso, non lo è. Per lo meno, devi attivare la proprietà completata. Dovrai anche verificare l'accesso per vedere se l'utente ha il permesso di farlo.

Esecuzione:

var task = repository.GetTask(id);
if (!currentUser.CanTransfer(task))
{
    throw new ApplicationException(" Sorry, I can't let you do that :( ");
}
var newTask = task.TransferToNextYear();
repository.Save(newTask);

Class Def:

public class Task : ITransferable
{
   string Key;
   DateTime? CompletedDate;
   DateTime CreateDate;
   string AssignedUser;
   // Lots of other fields

   public Task TransferToNextYear()
   {
       var newTask = new Task();
       newTask.CreateDate = DateTime.Now;
       newTask.CompletedDate = null;
       newTask.AssignedUser = null;
       newTask.string Key = GetNewKey();
       //Copy other fields
       return newTask;
   }
}
    
risposta data 10.04.2017 - 22:26
fonte

Leggi altre domande sui tag