Forse un po ironico, ma poiché “non riesco a trovare questa risposta da nessuna parte tramite Google, per assicurarmi che Software Engineering abbia la risposta:

Che cosè un helper?

Ho visto il nome usato ovunque (nomi di moduli, nomi di classi, nomi di metodi), come se la semantica fosse profonda e significativa, ma nel contesto dellinformatica (anche se non ho una laurea), non ho mai visto una descrizione o definizione da nessuna parte !

È un modello di progettazione? È un algoritmo? Una volta ho lavorato a un programma in cui il modulo e la classe erano entrambi chiamati qualcosa qualcosa che aiuta (dove qualcosa qualcosa era anche abbastanza generico) e lho prontamente rinominato in qualcosa che aveva senso per me, ma mi sembra che “mi manchi qualcosa qui!

Commenti

  • Helper è ciò che chiami qualcosa quando ‘ non sai come chiamarlo ma y conosci uno dei suoi amici. Un po come chiamarti ‘ amico di Zack ‘ invece che di Aaron. Doppio più cattivo.
  • Un aiutante è qualsiasi membro privato, fino allisomorfismo.
  • @ThomasEding mi dispiace tornare 3 anni dopo, ma io ‘ ho visto molti membri ” pubblici ” chiamati ” helper “, comprese le interfacce. ‘ vorrei una fonte sulla tua definizione (maggiore è la qualità, migliore è) perché questo mi darebbe sicuramente unidea di più odori di codice.

Risposta

Una classe Helper è un odore di codice meno conosciuto in cui un programmatore ha identificato alcune operazioni varie, comunemente usate e ha tentato di renderle riutilizzabili raggruppandole insieme in un raggruppamento innaturale. Gli sviluppatori successivi sono quindi entrati nel progetto e non si sono resi conto che la classe helper esiste, e di conseguenza hanno riscritto le stesse operazioni comuni, o addirittura creato più classi Helper.

Ma seriamente, il problema principale con le classi Helper è che di solito sono operazioni che agiscono su una classe specifica, il che ovviamente significa in termini OO che soffrono di un caso acuto di Feature Envy . Questo fallimento nel confezionare il comportamento con i dati su cui agisce è il motivo per cui gli sviluppatori così spesso (nella mia esperienza) non riescono a trovarlo.

Oltre a questo, poiché hai già identificato SomethingSomethingHelper è in realtà un nome terribile . Non è descrittivo e non ti dà alcuna idea di quale tipo di operazioni fa la classe (aiuta?), Il che significa anche che non è ovvio quando si aggiungono nuovi comportamenti se appartengono o meno alla classe Helper. creare tali classi sulla falsariga di comportamenti correlati che raggruppano logicamente insieme, quindi rinominare le nuove classi per riflettere ciò che fa.

Commenti

  • Pretty assicurati che SomethingSomethingHelper non sia il nome effettivo della classe. Che si tratti di ‘ odore di codice o meno dipenderà da quanto specifico la classe helper è, poiché le classi helper come Math non sono affatto un odore di codice.
  • @RobertHarvey – Enh, la maggior parte di quelle che ho ‘ ho visto essere chiamato SomethingSomethingHelper. Diavolo, io ‘ sto guardando una classe in questo momento chiamata HelperMethods nello spazio dei nomi <company>.Helpers. Per me, un la classe è nello stesso bucket di *Manager.
  • @Telastyn: Forse ‘ div Allora è unesperienza. Ho ‘ ho esaminato le classi di supporto nel mio progetto corrente (ce ne sono diverse) e tutte hanno nomi significativi. Ce nè ‘ solo uno che ‘ è suffisso con Helper e penso che ‘ s per disambiguarlo da una classe in .NET Framework con lo stesso nome. ‘ considero *Helper accettabile se * fosse qualcosa di significativo. HelperMethods è solo un fallimento dellimmaginazione; dovrebbero esserci almeno dei bucket concettuali specifici.
  • @RobertHarvey – ‘ probabilmente hai ragione. Tutta la mia carriera nellusare le lingue moderne è stata quella di ripulire i relitti dei treni.
  • Cè un sottoinsieme di questi, chiamato ” funzioni di supporto “, che sono effettivamente utili e un buon modello.Ad esempio, un insieme comune di righe che altrimenti dovrebbe essere ripetuto allinterno di una funzione: un esempio di dove vengono visualizzate è quando è necessario un ciclo do..while in Python, che il linguaggio ‘ t supporta (vedi il secondo esempio qui ). Unaltra potrebbe essere una struttura if / elif /…/ else, ma è necessario ripetere un caso in alto e in basso. Se possibile, tuttavia, dovrebbero essere localizzati rispetto a quella funzione e generalmente non chiamati ” helper “.

Risposta

Un helper è una classe o un metodo aggiuntivo innocuo, purché integri un componente esterno. Quando fa il contrario, indica una cattiva progettazione perché il codice è stato escluso dalla sua autorità, ammesso che vi sia alcuna autorità.

Ecco un esempio di un helper innocuo, io uso un metodo chiamato FindRep che conta il numero di zeri iniziali.

 digits = digits.Remove(0, TextHelper.FindRep("0", digits, 0, digits.Length - 2));  

Il metodo helper è molto semplice, ma molto scomodo da copiare e incollare e il framework non fornisce alcuna soluzione.

 public static int FindRep(char chr, string str, int beginPos, int endPos) { int pos; for (pos = beginPos; pos <= endPos; pos++) { if (str[pos] != chr) { break; } } return pos - beginPos; }  

Ed ecco un esempio di cattivo aiuto:

 public static class DutchZipcodeHelper { public static bool Validate(string s) { return Regex.IsMatch(s, @"^[1-9][0-9]{3}[A-Z]{2}$", RegexOptions.IgnoreCase); } } public class DutchZipcode { private string value; public DutchZipcode(string value) { if (!DutchZipcodeHelper.Validate(value)) { throw new ArgumentException(); } this.value = value; } public string Value { get { return value; } } }  

Commenti

  • Allora mostrami come dovrebbe essere fatto DutchZipcodeHelper?
  • @ powder366 Validate è un privato metodo su DutchZipcode

Answer

Helper è unappendice del nome comunemente usata.

Tuttavia , comunica molto poco a su quello che fa. Ogni volta che lho visto usato ho scoperto che era un nome non ottimale.

In effetti lo considero un odore di codice che indica più problemi sottostanti.

Esempio

Supponiamo di vedere il nome ” WidgetHelper ” (qui ” widget ” è un nome sostitutivo per qualsiasi tipo di funzionalità programmabile e non necessariamente un widget dellinterfaccia utente):

 class WidgetHelper: ...  

Cosa impariamo dal nome? Sappiamo che loggetto o la funzione svolge un tipo di lavoro secondario rispetto al widget. Secondo la mia esperienza, questo potrebbe anche non essere vero e si potrebbe eliminare ” helper ” dal nome e migliorare la comunicazione.

Per unaltra possibilità, ” WidgetHelper ” potrebbe avvolgere il widget, in modo tale che il codice del widget stesso possa sapere niente sullaiutante. Limplicazione è che WidgetHelper in questo esempio di pseudocodice fa parte dellAPI pubblica:

 class WidgetHelper: def __init__(self): self.widget = Widget() ...  

In questo caso, qualcosa come ” WidgetAPI ” sarebbe un nome migliore, perché questo, almeno, informa lutente della sua relazione con la classe Widget. O forse eliminiamo ” Helper ” dal nome e inoltre rinominiamo Widget in qualcosa di simile WidgetImplementation.

In alternativa, potrebbe essere inserito e richiamato dal widget, il che implica che non fa parte dellAPI pubblica, ma piuttosto parte dei dettagli di implementazione.

 class Widget: def __init__(self): self.widget_helper = WidgetHelper() ...  

Anche in questo caso, con questo piccola quantità di informazioni, abbiamo un miglioramento su ” helper. ” Sarebbe più descrittivo chiamarlo con un nome generico come ” WidgetImplementation. ”

” Implementazione ” potrebbe essere corretto in quanto limplementazione potrebbe fare troppo per dargli un nome più preciso. Oppure potrebbe essere troppo vago – questo è a discrezione del nome.

Ma come abbiamo visto, il nome, ” helper, ” non aiuta a capire cosa sta succedendo nel codice, a parte il fatto che è accessorio alloggetto di interesse principale. ” Helper, ” potrebbe significare molti tipi di relazioni. Pertanto, è eccessivamente vago e nebuloso e non adatto allo scopo di informare lutente su cosa fa loggetto.

Conclusione

Dare un nome alle cose è uno dei problemi più difficili dellinformatica.

Ciò che è desiderabile in un nome è che informi lutente che cosa dovrebbe fare la cosa nominata.

Ma in ogni caso immaginabile, sarebbe più descrittivo utilizzare un nome diverso da ” helper ” o semplicemente rimuoverlo del tutto.

A corollario della mia esperienza e di questa discussione, la scelta di ” helper ” in un nome segnala anche poco sforzo o raffinatezza da parte del nominativo (correttamente o no). È, in effetti, un odore di codice.

Non chiamare nulla un ” helper. ”

Risposta

In realtà non è né luno né laltro.

” Helper ” è un nome collettivo per un gruppo di funzioni.

Un helper è qualcosa che funziona in tutto il progetto e fa una piccola cosa. Questi ragazzi spesso non sono nemmeno organizzati in una classe, estendono semplicemente le funzionalità o le capacità del linguaggio stesso. Ecco quello che considero un ottimo esempio di aiuto:

 function linesOf($mls) { return preg_split("/\s*\n\s*/",trim($mls)); }  

Questa minuscola funzione può avere un grande impatto su come organizzi il tuo codice (ti piacerà mettere le tue liste letterali in stringhe multilinea) ma di per sé non significa quasi nulla. È “uno schema regex glorificato. Tuttavia, rende il tuo codice molto più leggibile quando dici

 $a = linesOf(" apples bananas cherries ");  

invece del suo puro equivalente regex.

Quindi questo è ciò che sono gli helper. Piccoli strumenti per lavori generici, non appartenenti a una classe specifica. Puoi forzarli in uno (linesOf potrebbe essere un metodo di una classe di stringhe) ma dove realmente appartengono è lo spazio dei nomi globale o una raccolta statica di tali strumenti.

Regola empirica: se è utile ma non sembra appartenere a nessun posto, probabilmente è un aiuto.

Risposta

Ovviamente ” questa è unarea grigia, ” ma la mia esperienza pragmatica è stata che le persone inventano ” helper ” quando hanno identificato un insieme di codice comune utile per loro “Voglio reimplementare. (Alcune lingue si riferiscono a questi come ” mixins. “)

Il problema è che il codice comune è tangentalmente correlato a ciascuna delle altre classi che potrebbe ” aiutare. ” Invece di far parte di una rigida gerarchia di classi, semplicemente ” aiuta ” [tutti …] loro. Questa strategia evita la duplicazione del codice sorgente ma non è priva di pericoli.

Risposta

La mia azienda utilizzava la Base classe / metodologia della classe Helper in cui ogni oggetto avrebbe due classi. Avresti una classe Person che conteneva tutte le proprietà e definizioni della classe e una classe PersonHelper che conteneva tutti i metodi, le istruzioni SQL e la logica che manipolava la classe Person. Questo ha funzionato bene per noi perché tutte le nostre applicazioni utilizzano istruzioni SQL per manipolare i dati ed è stato molto facile per noi trovare e modificare le istruzioni SQL secondo necessità.

Da allora siamo andati avanti e ora abbiamo inserito tutto nella classe Persona / Base. Abbiamo smesso di usare la convenzione di denominazione Helper perché volevamo avere meno file nei nostri progetti. Inoltre, la lunghezza di alcuni nomi di classi stava sfuggendo al controllo. lol.

Non è un ottimo esempio, ma hai capito.

s = CompanyName.PersonHelper.GetPerson() s = CompanyName.Person.GetPerson() 

Non sto dicendo che utilizzare la convenzione di denominazione dellhelper sia la soluzione perfetta soluzione ma ha funzionato per noi per alcuni anni.

Commenti

  • Non hai ‘ t spiega perché.
  • Sì, anche a me ‘ piacerebbe questa spiegazione.
  • @AaronHall Considera una cosa positiva che non capisci la loro scelta.
  • La solita ragione è ” Qualcuno ha pensato che fosse una buona idea “.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *