2009-04-01 4 views
5

Sicuramente alcuni di voi hanno affrontato questo. Tende ad accadere quando i programmatori sono un po 'troppo presi da OO e si dimenticano delle prestazioni e di avere un database.Qual è il nome di questo anti-pattern?

Per un esempio, diciamo che abbiamo una tabella di posta elettronica e che devono essere inviati da questo programma. All'avvio, sembra per tutto ciò che ha bisogno di essere inviato come segue:

Emails = find_every_damn_email_in_the_database(); 
FOR Email in Emails 
    IF !Email.IsSent() THEN Email.Send() 

Questa è una buona da a-non-repeat-te do punto di vista, ma a volte è inevitabile e che dovrebbe essere:

Emails = find_unsent_emails(); 
FOR Email in Emails 
    Email.Send() 

C'è un nome di questo?

+1

Sono sicuro che riceverai molte risposte che ti dicono che comunque le prestazioni non sono più importanti. :) – BobbyShaftoe

+0

Non sono sicuro di cosa esagerare con OO? –

+0

@ MB: Credo che chiedere a E-mail se è stato inviato è OO, mentre l'approccio non OO riguarderebbe direttamente le colonne. –

risposta

9

Ci provo e conio il nome "il filtro pigro (anti) pattern".

+0

Contrassegnato come risposta accettata dal popolare voto –

0

Stoopid Amateurs.

Seriamente, ho visto solo questo in persone con laurea in Informatica e nessuna esperienza professionale. Quando stavo insegnando alla Duke, il mio consulente e io guidavamo una lezione di "Programmazione su larga scala" in cui facevamo vedere alla gente esattamente questo tipo di errori.

1

Non sono sicuro che questo sia necessariamente correlato al database, dal momento che è possibile avere una procedura complessa e costosa (ad es. Più di un flag) per applicare un filtro per un gruppo.

Non penso che ci sia un nome, dal momento che il primo progetto non è semplicemente buono, e viola il principio della sola responsabilità. Se cerchi, filtri e stampi il filtro, stai facendo più cose, quindi devi refactoring in "cercato filtrato" e stampato.

L'unica cosa diversa da un semplice refactoring è che influisce anche sulle prestazioni, nello stesso modo in cui i loop interni possono essere progettati in modo da danneggiare le prestazioni.

0

Le prestazioni del primo possono effettivamente andare bene, a seconda del tipo di Emails. Se si tratta solo di un iteratore (si pensi a std::vector::begin() in C++), allora va bene e meglio che archiviare prima tutte le e-mail non inviate in qualche contenitore.

+0

Nel qual caso 1800 il nome delle informazioni è ancora corretto. I filtri pigri efficienti sono efficienti! –

+0

Il mio punto era che tutti i record venivano trascinati nell'app dal db per nessuna buona ragione. –

+0

È sciocco recuperare tutte le e-mail dal database quando la maggior parte è stata inviata quando il DBMS può fare il filtro e trasferire solo quelli che non sono stati inviati. -1. –

5

L'ho visto una volta. Quel programmatore non era in giro troppo a lungo.

Abbiamo chiamato il metodo "firehose" .

0

Questo antipattern ha diversi nomi possibili.

  • "non-so-SQL" antipattern
  • "fascista-DBA" antipattern
  • "What-fa-'latency'-media?" antipattern
2

Per me è Joel Spolsky leaky abstraction.

Non è esattamente un anti-pattern, ma chiunque abbia scritto questo codice, non ha veramente capito dove si trova l'astrazione del pattern Active Record.

+0

Questo codice mi ha fatto pensare anche ad ActiveRecord, ma lo pseudo-codice non è rubino (avrebbero avuto "Email.send tranne Email.sent" per esempio). Come aggirare la perdita di astrazione di ActiveRecord per l'iterazione? –

+0

Lo pseudocodice non è pensato per essere qualcosa in particolare.La prima volta che l'ho visto era in C++ –

+0

Sì, Active Record è un modello generico che può essere implementato in qualsiasi lingua. Ruby on Rails capita di avere un'implementazione ben nota. A volte è anche chiamato "Entity Class". –

1

sembrano essere derivati ​​dai seguenti anti-pattern:

Lo sviluppatore originale sarebbe forse non stato permesso di scrivere i find_unsent_emails() l'attuazione, e avrebbe quindi riutilizzato la funzione midget. E poi, perché cambiarlo dopo lo sviluppo e il test?

2

Io chiamo "L'approccio Shotgun".

1

Ciò è spesso dovuto al fatto che è molto più semplice utilizzare una query esistente e quindi filtrare il codice piuttosto che ottenere una nuova query SQL aggiunta. Forse perché gli amministratori di database controllano tutte le query e ottenere una nuova query approvata richiede giorni, o forse perché lo strumento ORM che stai utilizzando rende molto difficile definire le tue query personalizzate.

Se dovessi nominarlo, lo chiamerei modello "Easy Way Out" (anti). Che si tratti di un antipattern o non dipende realmente dalla situazione individuale. Se sarà sempre un numero abbastanza piccolo di elementi da recuperare, fare il filtraggio del codice non è un grosso problema. Ma se il numero di articoli è grande e ha il potenziale per crescere continuamente, ovviamente il filtro dovrebbe essere fatto sul server.

1

Ho visto problemi simili altrove, dove invece di una semplice serie di cose da fare, c'era un "cluster di transazione" basato su un "elenco di cluster" basato su un "cluster di raccolta" basato su un "cluster di memoria" ". Inutile dire che la cosa più semplice si è trasformata in un grande affare.

L'ho chiamato al galoppo generalità.

0

Ispirato in parte al 1800 "il modello di filtro pigro (anti)", che ne dite di "programmazione disfunzionale" (cioè l'opposto della programmazione funzionale)?