2010-07-27 12 views
54

Io generalmente vivo secondo la regola che le variabili/funzioni globali sono malvagie e che ogni pezzo di codice dovrebbe vivere nella classe a cui appartiene.Se una classe "Utilità" è malvagia, dove inserisco il mio codice generico?

Questa è una regola molto semplice da seguire, e credo di non aver mai incontrato un problema con questa regola fino ad ora.

Oggi, tuttavia, ho bisogno di aggiungere una funzione al mio assembly piuttosto che a una classe specifica. Cioè, quasi tutte le mie classi potrebbero utilizzare per questa particolare funzione.

Dove devo inserire questa funzione (sovraccarico +1)?

Se lo inserisco in una classe "Utilità", mi sento sporco. Se lo affronterò in una classe semi-correlata e lascerò che altre classi lo chiamino direttamente, mi sento peggio.

Questo particolare pezzo di codice riduce un IList<PointF> in un elenco normalizzato. Ritengo che aggiungerlo come metodo di estensione su IList<PointF> potrebbe essere la soluzione migliore ...

+1

Sono d'accordo, le variabili globali sono malvagie. Sembrano avere le menti di loro dedicate a minare il tuo codice. –

+19

Lo stato globale è problematico, ma le funzioni globali sono solo una logica che è riutilizzabile con troppo pochi dettagli per essere degni di incapsulamento in una classe. Non vedo alcun problema con i metodi Helper o Utility raggruppati in classi statiche Helper o Utility appropriatamente denominate. –

+0

Preferisco usare "Pull Up Method" invece della classe Utility/Helper - [Pull Up Method] (https: // refactoring.guru/pull-up-method) –

risposta

26

Se questa è un'operazione su un IList<PointF>, dovrebbe essere un metodo di estensione su IList<PointF>.

Generalmente, le classi di tipo Utils e Helper devono essere evitate. Più spesso, troverai che quello che puoi pensare che sia un metodo di utilità, in realtà è un metodo piuttosto specifico che probabilmente appartiene a una classe a sé stante (proprio come dici tu). Tuttavia, ci saranno casi specifici del dominio in cui le classi Util -like (classi che raggruppano i metodi utili correlati) sono entità valide.

+3

+1 I metodi di estensione sono perfetti per questo tipo di problema – Diadistis

+1

Sì, ma la mia prenotazione qui è che se si tratta di un'estensione, allora deve avere un nome dal suono fluente ... qualcosa come ' points.NormalizeIntoSegments (50) ', invece del mio preferito' Utilities.Segment (points, 50) '. –

+0

che dire della classe NormalizedIList estende IList? – atk

4

Si consiglia di inserirlo in una classe "ListUtilities" o PointListUtilities, naturalmente. Quindi non stai infrangendo il principio della responsabilità unica, che è il problema principale con una classe 'Utilità' di tutti i tipi.

9

Non c'è niente di sbagliato nelle variabili e nei metodi "globali". Li usi sempre. Il framework ama chiamarli classi "statiche" o metodi "statici".

Raramente ho bisogno di, ma di solito aggiungo una classe statica interna Util nel namespace che il metodo/variabile è necessaria per C# e un modulo per VB.NET.

I campioni di .NET Framework

  • System.Collections.Specialized.CollectionsUtil
  • System.Net.WebUtility
  • verificare il codice sorgente di Microsoft per .NET Framework. Troverete numerose classi di utilità interne.
+1

Si noti che tutti gli esempi del BCL sono raggruppati attorno a una particolare responsabilità. Non esiste una classe generica di 'Utils' ovunque. –

+0

Cos'è il BCL? Intendi le librerie di classi base (BCL)? – AMissico

+1

Apri *. NET Reflector *. Cerca "util". Esistono 256 esempi che utilizzano gli assembly di default (BCL) 4.0 caricati da * .NET Reflector *. – AMissico

Problemi correlati