Attualmente ho un codice come questo per visualizzare alcuni oggetti che soddisfano alcuni criteri in una griglia:
// simplified
void MyDialog::OnTimer()
{
UpdateDisplay();
}
void MyDialog::UpdateDisplay()
{
std::list<MyClass *> objects;
someService_->GetObjectsMeetingCriteria(objects, sortField, sortDirection);
for(std::list<MyClass *>::iterator it = objects.begin();
it != objects.end() ; it ++)
{
AddObjectToGrid(*it);
}
}
Funziona bene. Ora il requisito è arrivato per elaborare questi oggetti quando soddisfano alcuni criteri. Le informazioni sugli oggetti possono cambiare rapidamente, quindi sarebbe più opportuno verificare se un oggetto soddisfa i criteri e poi elaborarlo immediatamente e continuare così.
La mia domanda è come miglior architetto per gestire la visualizzazione e l'elaborazione. Potrei semplicemente aggiungere un metodo per elaborare l'oggetto, ad esempio:
for(std::list<MyClass *>::iterator it = objects.begin();
it != objects.end() ; it ++)
{
ProcessObject(*it);
AddObjectToGrid(*it);
}
Comunque idealmente verificherei se un oggetto soddisfa i criteri immediatamente prima di elaborarlo per garantire che agisca sulle informazioni più recenti. In questo esempio, tutti gli oggetti vengono controllati per vedere se corrispondono ai criteri e poi in seguito vengono elaborati.
Inoltre sono preoccupato che questo accoppi il codice di elaborazione con il codice di visualizzazione anche se non sono sicuro di come separarli o se è addirittura necessario. Potrei risolvere il problema in questo modo:
void MyDialog::OnTimer()
{
ProcessObjects();
UpdateDisplay();
}
Ma poi sto ripetendo l'elenco degli oggetti due volte, una volta da elaborare e una volta da visualizzare.
Finalmente ho potuto fare qualcosa di simile:
// simplified
void MyDialog::OnTimer()
{
ProcessAndDisplayObjects();
}
void MyDialog::ProcessAndDisplayObjects()
{
std::list<MyClass *> objects;
someService_->GetAll(objects, sortField, sortDirection);
for(std::list<MyClass *>::iterator it = objects.begin();
it != objects.end() ; it ++)
{
if(someService->MeetsCriteria(*it))
{
ProcessObject(*it);
AddObjectToGrid(*it);
}
}
}
Nel complesso ciò che mi trattiene è che sono preoccupato di collegare insieme il codice di visualizzazione e elaborazione e che il codice funzioni in modo efficiente perché l'elaborazione tempestiva è fondamentale. Come posso strutturare meglio questo codice?