2009-10-26 12 views
14

Recentemente ho installato un modulo da CPAN e ho notato che una delle sue dipendenze era common::sense, un modulo che offre di abilitare tutti gli avvisi desiderati e nessuno che non lo sia. Dalla sinossi del modulo:Devo usare common :: sense o semplicemente usare `use strict` e` use warnings`?

use common::sense; 

# supposed to be the same, with much lower memory usage, as: 
# 
# use strict qw(vars subs); 
# use feature qw(say state switch); 
# no warnings; 
# use warnings qw(FATAL closed threads internal debugging pack substr malloc 
#     unopened portable prototype inplace io pipe unpack regexp 
#     deprecated exiting glob digit printf utf8 layer 
#     reserved parenthesis taint closure semicolon); 
# no warnings qw(exec newline); 

Salva per undef avvertimenti a volte di essere una seccatura, ho trovato di solito le avvertenze standard per essere buono. Vale la pena passare a common::sense invece del mio normale use strict; use warnings;?

+5

'comune :: sense' sarebbe un'idea molto migliore se vissuta in/home/mlehmann/perl5/lib e non CPAN. – hobbs

risposta

23

Mentre mi piace l'idea di ridurre il codice della caldaia-piastra, sono profondamente sospettoso di strumenti come Moderna :: Perl e comune ::senso.

Il problema che ho con i moduli di questo tipo è che raggruppano un gruppo di comportamenti e nascondono nomi di lob con significati mutevoli.

Ad esempio, Modern::Perl oggi consiste nell'abilitare alcune funzioni di perl 5.10 e l'utilizzo di stringhe e avvisi. Ma cosa succede quando Perl 5.12 o 5.14 o 5.24 escono con grandi novità, e la community scopre che dobbiamo usare il pragma frobnitz ovunque? Will Modern :: Perl fornisce un insieme coerente di comportamenti o rimarrà "Moderno". Se MP si tiene al passo con i tempi, interromperà i sistemi esistenti che non mantengono il blocco dei requisiti del compilatore. Aggiunge test di compatibilità extra per l'aggiornamento. Almeno questa è la mia reazione a MP. Sarò il primo ad ammettere che il cromatico è circa 10 volte più intelligente di me e un programmatore migliore, ma non sono ancora d'accordo con il suo giudizio su questo problema.

common::sense ha anche un problema di nome. Di chi è l'idea del buon senso? Cambierà nel tempo?

La mia preferenza sarebbe per un modulo che mi faciliti la creazione di un mio insieme di moduli standard e persino la creazione di gruppi di moduli/direttive correlati per attività specifiche (come la manipolazione di data, l'interazione con il database, l'analisi HTML, eccetera).

Mi piace l'idea di Toolkit, ma fa schifo per diversi motivi: utilizza i filtri di origine e il sistema macro è eccessivamente complesso e fragile. Ho il massimo rispetto per Damian Conway, e produce codice brillante, ma a volte va un po 'troppo lontano (almeno per uso di produzione, la sperimentazione è buona).

Non ho perso abbastanza tempo a digitare use strict; use warnings; per sentire la necessità di creare il mio modulo di importazione standard. Se ho sentito un forte bisogno di caricare automaticamente un insieme di moduli/pragma, qualcosa di simile a toolkit che permette di creare gruppi di serie sarebbe l'ideale:

use My::Tools qw(standard datetime SQLite); 

o

use My::Tools; 
use My::Tools::DateTime; 
use My::Tools::SQLite; 

Toolkit viene molto vicino al mio ideale I suoi difetti fatali sono un fiasco.

Per quanto riguarda la scelta della direttiva, è una questione di gusti. Preferisco usare l'occasionale no strict 'foo' o no warnings 'bar' in un blocco in cui ho bisogno della possibilità di fare qualcosa che lo richiede, piuttosto che disabilitare i controlli sul mio intero file. Inoltre, IMO, il consumo di memoria è una falsa pista. YMMV.

aggiornamento

Sembra che ci sono molti (quanti?) Diversi moduli di questo tipo galleggiando CPAN.

  • C'è latest, che non è più l'ultimo. Dimostra parte del problema di denominazione.
  • Inoltre, uni::perl che aggiunge l'attivazione della parte unicode del mix.
  • ToolSet offre un sottoinsieme delle capacità di Toolkit, ma senza filtri di origine.
  • Includerò Moose qui, poiché aggiunge automaticamente strict e warnings al pacchetto chiamante.
  • Infine Acme::Very::Modern::Perl

La proliferazione di questi moduli e il potenziale di requisiti sovrapposti, aggiunge un altro problema.

Che cosa succede se si scrive codice come:

use Moose; 
use common::sense; 

Cosa pragma sono abilitati con quali opzioni?

+7

Modern :: Perl ti consentirà di rendere esplicito quale versione di "moderno" stai acquistando. Qualcosa come "use Modern :: Perl '2009" "o alcuni di questi. – mpeters

+7

Bel dolore! Più documentazione da leggere quando tutto ciò che stavo cercando di dire un paio di anni fa era "usare rigorosamente, usare avvertenze"? – innaM

+5

@mpeters, quindi per capire una determinata chiamata MP, dovrò essere uno storico Perl? No grazie. ++ per le informazioni, comunque. – daotoad

6

Non tutti hanno idea del senso comune, sono uguali: sotto questo aspetto è tutto fuorché comune.

Vai con quello che sai. Se ricevi gli avvertimenti undef, è probabile che il tuo programma o il suo inserimento non siano corretti.

Le avvertenze ci sono per un motivo. Tutto ciò che li riduce non può essere utile. (Compilavo sempre con gcc -Wall troppo ...)

+0

Non dimenticare di usare anche -Wextra: D –

+3

Gli avvertimenti di Undef in genere significano solo che ho dimenticato di confrontare alcune stringhe con 'defined $ foo && ..' ..;) – Dan

+4

O hai sbagliato una chiave hash , o una funzione che pensavi * non potesse * restituire undef ha restituito undef, o hai un buco nel tuo flusso di controllo ... Il controllo esplicito della definizione in alcuni prezzi è un prezzo accettabile da pagare per un piccolo aiuto nel rilevare quelli * altri * errori :) – hobbs

5

Non ho mai avuto un avviso che non fosse qualcosa di losco/semplicemente sbagliato nel mio codice. Per me, è sempre qualcosa tecnicamente permesso che quasi certamente non voglio fare. Penso che la serie completa di avvertimenti sia inestimabile. Se si trova use strict + use warnings adeguata per il momento, non vedo perché ci si vuole passare ad utilizzare un modulo non standard, che è poi una dipendenza per ogni pezzo di codice scritto da qui in avanti ...

3

Quando si tratta di avvertimenti, mi supportano l'utilizzo di un modulo o una caratteristica del linguaggio built-in che ti dà il livello delle avvertenze che ti aiuta a rendere il vostro codice come solido e affidabile come si può eventualmente essere. Un avviso ignorato non è utile a nessuno.

Ma se siete accogliente con le avvertenze standard, bastone con esso. Programmare uno standard più severo è fantastico se ci sei abituato! Non consiglierei di cambiare solo per i risparmi di memoria. Passa solo se il modulo ti aiuta a trasformare il tuo codice più velocemente e con più sicurezza.

7

L ' "utilizzo della memoria inferiore" funziona solo se si utilizza non moduli che caricano rigorosa, caratteristica, avvisi, ecc e la parte "molto" è ... non più di tanto.

+2

Un paio di centinaia di kB, che è onestamente più di alcune persone probabilmente * si aspettano *, ma è ancora una goccia nel secchio. È anche quasi tutto memoria condivisibile. Non "condivisi" come le sezioni di testo delle librerie, ma se qualcosa usa avvertimenti e quindi biforcazioni, in pratica nessuno di questi 400kB o così verrà mai messo in pausa. – hobbs

+0

(leggi come "non verrà scritto e quindi non verrà copiato", ovvero i dati * sono * COW :) – hobbs

14

direi bastone con warnings e strict per due motivi principali.

  1. Se altre persone stanno andando a utilizzare o lavorare con il tuo codice, sono (quasi certamente) utilizzato per warnings e strict e le loro regole. Quelli rappresentano una norma comunitaria a cui tu e le altre persone con cui lavori possono contare.
  2. Anche se questo o che parte specifica di codice è solo per voi, probabilmente non si vuole preoccupare di ricordare "E 'questo il progetto in cui io aderisco a warnings e strict o quello in cui ho Hew a common::sense? " Spostarsi avanti e indietro tra le due modalità ti confonderà.
+2

+1, per ridurre il carico cognitivo quando possibile. Inoltre, se c'è una particolare avvertenza/violazione severa che ti infastidisce ma sai che il codice sta facendo la cosa giusta, isola il più piccolo pezzo di codice che lo innesca all'interno di un blocco e metti "nessun avvertimento"; o "no strict"; dentro in alto. –

8

Io ovviamente non ho buon senso perché ho intenzione di più per Modern::Perl ;-)

+2

+1 per la tua follia. – innaM

+1

@EvanCarroll Leggere attentamente le risposte prima di votare per il down. La mia risposta è stata la prima a menzionare il modulo Modern :: Perl CPAN (per un'alternativa a common :: sense). – draegtun

14

C'è qualcos'altro che nessun altro sembra aver rilevato, e questo è FATAL nell'elenco warnings.

Quindi, come di 2.0, use common::sense è più simile a:

use strict; 
use warnings FATAL => 'all'; # but with the specific list of fatals instead of 'all' that is 

Questa è una caratteristica abbastanza importante e spesso trascurato di avvertimenti che le rampe il rigore suo complesso più alto grado. Invece di un'interpolazione di stringhe undef, o di una ricorsione infinita, ti avverto e prosegui nonostante il problema, in realtà si ferma.

Per me questo è utile, perché in molti casi, l'interpolazione di stringhe undef porta a ulteriori errori più pericolosi, che possono passare silenziosamente inosservati, e il fallimento e il bailing è una buona cosa.

1

Molti dei popoli sostengono in un commento con e se il MP cambia, si romperà il codice. Anche se questa può essere una vera minaccia, ecco già MOLTE cose che cambiano nel tempo e infrangono il codice (a volte dopo un ciclo di deprecazione, a volte no ...).

Alcuni altri moduli hanno cambiato l'API, quindi rompe le cose e nessuno si preoccupa di loro. Per esempio. Moose ha almeno due cose che ora sono deprecate e probabilmente saranno proibite in alcune versioni future.

un altro esempio, anni fa, è stato permesso di scrivere

for $i qw(some words) 

ora, si è deprecato. E molti altri ... E questa è una sintassi della lingua CORE.

Ognuno è sopravvissuto. Quindi, non capisco perché molte persone discutono moduli helper di supporto. Quando hanno intenzione di cambiare, (probabilmente) qui sarà una sorta di ciclo deprecazione ... Quindi, il mio punto di vista è:

  • se si scrivono programmi a te stesso, utilizzare qualsiasi modulo che si desidera;)
  • se scrivi un programma a qualcuno, dove qualcuno che sta per farlo, usa moduli "pragma-like" standard non standard (common :: sense, modern :: perl, uni :: perl ecc ...)
  • in le domande StackOverflow, è possibile utilizzare in modo sicuro common::sense o Modern::Perl ecc. - La maggior parte degli utenti che risponderà , le vostre domande, li conosce. Ognuno capire quello che è più facile scrivere use 5.010; per consentire strict, warnings and fearures con 10 caratteri come con 3 linee ...
Problemi correlati