Newsgroup: it.lavoro.informatica
Titolo: Spunto di discussione: qual e' il problema?

Letta su IRC, probabilmente presa dal daily-wtf.
// is value negative?
if("-" == value.toString().substr(0,1))
{
    // value is negative
}
La mia reazione immediata e' stata "WTF?!". Dopodiche' ho iniziato a
pormi delle domande. Cosa c'e' che non va? Programmare non e' cosi'
difficile, almeno al livello di queste piccole cose. Come si fa ad avere
una mente tanto contorta?
Non voglio lanciare il solito flame sull'universita' e gli autodidatti,
ma a me chi ha scritto quel codice sembra un caso perso.
Un mio amico ha commentato: "People are retards". A me non piace essere
cosi' drastico... ma in questo caso pare ci voglia.
Questo spiega il perche' ci sia tanto software di qualita' scadente in
giro: il codice viene scritto ormai da cani e porci.
Ovviamente questo e' un caso decisamente estremo, ma fa pensare...
-- 
Salvatore Iovene
http://www.iovene.com/

 Letta su IRC, probabilmente presa dal daily-wtf.
[cut]
A rischio di passare da idiota (sarà che ho dormito poco...) quale è il 
problema?
Ciao,
Giulio


Ammesso che value sia sul serio solo un numero, un if su value < 0 non era
più ovvio?
Ciao, Alessandro
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 problema?
Non conosco Java, ma a vedere così, sembra che volessero valutare 
l'esistenza di un valore negativo trattandolo come stringa e 
controllando la presenza del "meno".
:D


E anche se non fosse un numero ma un oggetto vero e proprio, chi ha
realizzato la classe l'avrà pur overloadato l'operatore < per rilevare in
modo facile quel tipo di condizione, o almeno lo spero... ;-)



AleTV ti ha risposto correttamente. Mi sa che hai dormito meno di 30
minuti ieri notte :-) perche' dagli altri tuoi commenti sul NG non mi
sei mai passato per idiota!


Giulio Petrucci ha scritto:

che vengono allocati 2 o 3 nuovi oggetti, più una comparazione tra
stringhe anziché un'unica un'operazione su interi 
ciao, U.

 Ovviamente questo e' un caso decisamente estremo, ma fa pensare...
I casi estremi non sono inicativi di nulla, altrimenti non sarebbero
estremi. Certo, la persona che ha scritto quel codice era con ogni
probabilità completamente estraneo a ciò che stava facendo (fra
l'altro se si tratta i java quel test oltre ad essere perverso è anche
privo di cases in cui funziona, essendo sbagliato anche il confronto
fra stringhe...) ma proprio per questo un "programmatore" come quello
difficilmente avrà avuto occasione di scrivere tanto altro codice
oltre a quello.


Lascia stare, io ne vedo di tutti i colori quasi ogni giorno, certo non
cosi' gravi e certo non cosi' idioti, ma vedo tante cose che richiedono
una mente completamente contorta per essere concepite. Di codice
scadente in giro ce n'e' parecchio.


 fra stringhe...)
Non credo sia java, "substr" non esiste.
Tra l'altro prima di java 1.5 c'era un metodo per ottimizzare l'equals
tra stringhe usando == e intern(). Poi hanno risolto a livello di
compilatore.
ciao, U.

 modo facile quel tipo di condizione, o almeno lo spero... ;-)
Dalla sintassi si suppone sia java, e in java l'overload degli
operatori non esiste.
In compenso in java 5 c'è la conversione implicita degli oggetti
wrapper per cui si possono confrontare e/o assegnare come i rispettivi
tipi nativi.


Mai usato java, io avrei detto che fosse C#.


 Non credo sia java, "substr" non esiste.
è JavaScript in effetti.
-- 
Lawrence - 
http://www.oluyede.org/blog
http://www.neropercaso.it
"Nothing is more dangerous than an idea
if it's the only one you have" - E. A. Chartier

 Mai usato java, io avrei detto che fosse C#.
substr esiste solo in JavaScript con quel tipo di sintassi AFAIK



giá, tipo:
  String  x=  (j%2==0) ? ((j<0) ? "pari-neg" : ((j==0) ? "zero" :
"pari-pos")) : ((j<0) ? "disp-neg" : ((j==0) ? "zero" : "disp-pos"));
 
ciao, U.

 una mente tanto contorta?
Senza considerare che, nella sua logica perversa, avrebbe anche dovuto 
fare un trim degli spazi bianchi all'inizio della stringa per essere 
proprio sicuro ;)
Ciao,
Alessio (a.k.a. Kinglion Il Meticcio)
-- 
11:15, restate my assumptions: 1. Mathematics is the language of 
nature. 2. Everything around us can be represented and understood 
through numbers. 3. If you graph these numbers, patterns emerge. 
Therefore: There are patterns everywhere in nature.
(Maximilian Cohen, Pi)


Scherzi? Questo codice e' perfetto.


 Lascia stare, io ne vedo di tutti i colori quasi ogni giorno,
Io, che pure ho l'umiltà di pensarmi come occasionale produttore di
porcherie, una volta sono stato interpellato - si parlava di JavaScript - su
"come eseguire un'operazione in ritardo di qualche secondo, per dare il
tempo ad altri eventi di venire scatenati".
La soluzione su cui mi chiedevano un parere era un lunghissimo ciclo for con
dentro niente o quasi, per ingannare il tempo: "ma quanto lo devo fare
lungo, che ho bisogno di cinque secondi perchè l'onload del body tanto
impiega ad essere triggerato? E poi su quell'altro computer, che è più
nuovo, ci mette la metà... tu che faresti?"
O_o
F.B.
(è stato anni fa, ma me lo ricordo ancora... stavano lavorando in "AJAX
prima dell'AJAX")

 non era più ovvio?
Sai, dovrei vedere il codice, perché se value è di tipo object quella
forse è la strada piu' corta.
O no?
-- 
Ciao!
Luca

 è JavaScript in effetti.
aaahhhh allora si spiega tutto!
Non ho mai visto scrivere codice javascript con un obiettivo finale
diverso da "stó accrocchio alla fine deve più o meno funzioná" :)
E poi almeno col javascript le inefficienze le fai pappare al client,
so 'azzi loro :)
ciao, U.

 stringhe anziché un'unica un'operazione su interi 
Rifo (ricordo francamente poco Java): e se quel value non è una
variabile numerica?
-- 
Ciao!
Luca

 substr esiste solo in JavaScript con quel tipo di sintassi AFAIK
mmmm.... allora lo comprendo un po' più di prima. Sempre stupido, ma
un po' più comprensibile :-)

Salvatore Iovene ha scritto:

Forse sopra il 60 parallelo, è perfetto :)
ciao, U.

 diverso da "stó accrocchio alla fine deve più o meno funzioná" :)
Beh io di codice Javascript scritto bene ne ho visto. Guarda il codice
di Mochikit ad esempio


 variabile numerica?
Non è una giustificazione a cercare il meno in una variabile dai. Se
devi controllare che un numero sia negativo controlli che il numero sia
negativo, punto e basta.


 proprio sicuro ;)
Beh, no. E' perverso ma corretto. Ci mancherebbe solo trimmare, visto che la 
.toString() sicuramente non inserisce spazi a caso... ;)
Comunque ogni tanto queste cose si vedono... :( 
-- 
__________________________________________________
Luc (33, CO)
MS Visual Studio developer - Programmer since 1985
__________________________________________________

Luca Menegotto ha scritto:

E chi lo sa? Effettivamente senza vedere il codice non si può dire.
Anche se mi sembra strano che, ipotizzando che value sia un oggetto, non
ci siano altri metodi più comodi per ricavare la stessa informazione.
Per quello che sappiamo il ToString potrebbe restituire una stringa da
30000 caratteri con dentro chi sa cosa ma con un - in testa se quel
qualcosa rappresenta il concetto di negativo. Trovo strano che non esista
almeno un metodo tipo IsNeg per arrivare alla stessa conclusione senza
scomodare la creazione di una stringa ad hoc.



Che qualcuno abbia scritto buon codice Javascript non lo metto in
dubbio. Io personalemente non ho mai visto alcun sviluppatore
Javascript farlo (e ne ho visti parecchi). E tra quelli mi ci metto
anch'io, le poche volte in cui anni fa mi ci sono trovato (poi ho
sempre cercato di evitarlo come la peste).
ciao, U.

Luca Menegotto ha scritto:

Tutti gli oggetti wrapper di tipi primitivi hanno il relativo valore
primitivo al loro interno, per cui intObject.intValue()<0 è uguale a
i<0 in termini di performance.
Da java 1.5 poi è stato introdotto il cosidetto "Boxing" e puoi anche
assegnare direttamente un int a un Integer (tipo Integer i = 10;).
ciao, U.

 stringa ad hoc.  Ciao, Alessandro
Tento un triplo carpiato con doppio avvitamento. ToString a memoria č
un metodo comune, e se io so che l'oggetto č un valore numerico...
No, troppo difficile, farei un cast. Cancella. ;-)
-- 
Ciao!
Luca

 > diverso da "stó accrocchio alla fine deve più o meno funzioná" :)
Lawrence, come dicevamo in altro thread, non esiste uno strumento che
costringa a fare le cose per bene. E' vero anche il contrario!! :D
-- 
Ciao!
Luca


In realta' scherzavo :) Io sono per la leggibilita' del codice in primo
luogo: il codice non e' scritto solo per il compilatore. Quel codice si
capisce eccome, ma si puo' scrivere in 10 righe e renderlo molto piu'
semplice da comprendere.


 sei mai passato per idiota!
Grazie per la stima. E comunque: si, ho dormito veramente poco: sono 
stato a suonare fino a tardi e poi...maledetto Faletti (sto leggendo il 
secondo romanzo).
Ciao,
Giulio

 sempre cercato di evitarlo come la peste)
Anche io, ma recentemente ho scoperto che alla fine è un linguaggio di
programmazione fatto e finito. Non mi esalta ma non è cosi malvagio.
Comunque non lo uso mai e tendo a dimenticarlo.


 una mente tanto contorta?
[SNIP]
Se quella ti sembra "tanto contorta" allora spiegami perche'
nella applicazione a cui ho lavorato fino alla settimana
scorsa e alla quale forse lavorero' ancora per qualche mese
a-> per andare a prendere uno (o piu') file in ftp da un indirizzo
    remoto viene creato un comando che prima di arrivare al punto in
    cui si prende il file attraversa 7 JMS queue, vengono utilizzati
    9/10 di EJB (tra MDB e Session Bean)
    e poi, nella fase di ritorno attraversa altrettante code e 
    altrettanti java bean.
b-> per quale motivo si usa un carrozzone come BEA weblogic se poi
    si scrive un algoritmo del tipo seguente nella onMessage di un
    EJB (che chiamero EJB1)
    EJB1-1 -> leggi un messaggio m dalla JMS queue q1. Sia "vecchioId"
        l'identificatore del messaggio...
    EJB1-2 -> nuovoId = oggettoDiClasseX.send(m) //vedi sotto
    EJB1-3 -> metti l'oggetto m (compresi il nuovo e 
                        il vecchio identificatore)
       in una tabella del database, chiamiamola T
 
   dove il metodo send della classe X e' del tipo:
       s1->crea un nuovo identificatore (nuovoId) per il messaggio m
       s2-> copia m in un messaggio m1 che e' uguale ad m salvo che
           per l'identificatore che e' uguale a "nuovoId"
           inserisci il messaggio m1
           in una cosa JMS q2, all'uscita dalla quale ci sara 
           un EJB, chiamiamolo EJB2
           che provvedera' a rintracciare il file e mandare
           indietro (mediante una coda q3) un messaggio con 
           identificatore=nuovoId contente i dati provenienti dal file.
           Poi ci sara' un EJB, chiamiamolo
           EJB3 all'uscita di q3.
       s3->restituisci nuovoId
e il codice della onMessage dell'EJB3 e' del tipo:
     EJB3-1 -> prendi il messaggio r1 da q3, contenente i dati del file,
               avente "nuovoId" come identificatore
 
     EJB3-2 -> vai in T e cerca un record con chiave primaria 
               "nuovoId"
     EJB3-3  -> nella riga rintracciata prendi il campo "vecchioId",
               crea un nuovo messaggio r uguale ad r1 salvo che
               r ha identificatore "vecchioId",
               spedisci il messaggio r cosi' ottenuto in una JMS queue
               q4 in modo che il messaggio possa proseguire verso
               il punto in cui era stato originato m (attraversando
               tutte le innumerevoli code e EJB) (praticamente r
               e' un acknowledgement di m)
 
 
Ora, dico io...
non viene il ragionevole dubbio che, poiche' gli EJB possono girare
in thread diversi, quando viene eseguito EJB3->2, ancora EJB1->3 
potrebbe ancora non essere stata completata (ma, casualmente potrebbe
anche esserlo stata) e che quindi il sistema qualche volta funziona
e qualche volta no a seconda delle velocita' relative della rete
e delle varie parti dell'applicazione ?
 
Ma tanto c'e' weblogic che sincronizza tutto da solo...
e quindi qualcuno obiettera' che si potrebbe configurare weblogic
in modo tale che l'inserimento nella coda q2 di cui al punto s2
e l'inserimento nel database di cui al punto EJB1->3 potrebbero stare
in una singola transazione per cui l'Application Server non dovrebbe
sentirsi autorizzato a "chiamare" la onMessage dell'EJB2 prima
che sia avvenuto l'inserimento del punto EJB1->3. Peccato che
il flag che andrebbe messo a "true" per fare questa cosa (non me lo
ricordo a memoria quale e', dovrei andare a rivedere i descrittori
degli EJB) puo' essere messo a true *solo se* le transazioni sono
gestite manualmente dagli utenti *e non* automaticamente dall'AS,
come dice chiaramente la documentazione di weblogic. Peccato anche
che negli attraversamenti delle code suddette ci siano, oltre ai
gia' citati MDB e session bean, non so quanti Entity Bean  e che
tutto sia rigorosamente impostato in modo tale che le transazioni
sono gestite dall'AS...
Ora per andare a isolare il problema di cui sopra in mezzao
a 229516 byte di codice scritti da altri, relativamente ad una
piattaforma (J2EE) che mi era abbastanza sconosciuta fino all'anno
scorso e in mezzo a non so quanti altri problemi non
e' stata proprio una cosina banale... e magari pensare un'attimo alla
sincronizzazione di task concorrenti senza pensare
che "tanto fa tutto l'Applicazion Server" (e magari fare qualche 
test di stress dell'applicazione) proprio male male non farebbe. 
E garantisco che lo si puo' fare anche senza essere certificati. 
Sicuramente lo si puo' fare anche senza essere ingegneri, 
ma per esperienza personale posso garantire che in queste 
cose l'universita' puo' aiutare.
Cosi' come puo' aiutare a capire che non ha alcun senso cambiare 
identificatore al messaggio se il "nuovo identificatore" lo si usa
solo per andare a recuperare il "vecchio identificatore" nel database...
Saluti,
Marco 
PS
che ora che ci penso mi sono dimenticato di chiudere il suddetto Bug
su Bugzilla... vado ad ottemperare...
 
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 una mente tanto contorta?
Guarda questo:
http://www.microsoft.com/technet/technetmag/issues/2006/10/WindowsConfidential/
"Contro la stupidità, gli stessi Dèi lottano invano..." (C)
Massimo


Non si apre, cos'era?


 Non si apre, cos'era?
Riprova, a me si apre benissimo...
Massimo

 una mente tanto contorta?
... mmmhh.. io prima di lanciare strali lascierei sempre il beneficio
del dubbio...
Ricordandosi che è javascritp e qundi non esistono i tipi e che
"value" è presumibilmente un valore scritto in una texbox, come
avresti scritto questa funzione ?

 più ovvio?
In javascritp forse no.. intanto value < 0 non funziona se uso la
virgola al posto del punto...  ed i tipi non esistono.

 avresti scritto questa funzione ?
js> val = "-3"
-3
js> typeof val
string
js> parseInt(val) < 0
true
js> 
Basta saperli usare i linguaggi enricoe, non c'è bisogno di giustificare
l'incapacità :-)
Poi magari il tizio è un newbie completo e l'avrà fatto nell'"ignoranza"


 
Certo, questi client locomotive piene di cavalli vapore bisogna tenerle 
in forma se no incrassano !!!
;-)))
-- 
--------------------------------------------------------------------
Non system disk or disk error, replace and strike any key when ready
--------------------------------------------------------------------

 
Lucchetto !!! Quando e' stato detto che gli spazi li inserisce la 
toString ???


 Poi magari il tizio è un newbie completo e l'avrà fatto nell'"ignoranza"
Ma io infatti faccio per provocare.. dato che qui sono tutti
scienziati.. e basta saperli usare...
Tanto per giocare e vedere se qualcuno tira fuori una bella soluzione
.. a proposito potresti postare l'intera funzione e non dei frammenti ?
Deve fare la stessa cosa, semplicissimo.


Qui tutti a sparare a zero prima di sapere il linguaggio e i
requisiti... si possono avere funzioni equivalenti corrette ??

 Deve fare la stessa cosa, semplicissimo.
1 - non era una funzione ma un blocco if
2 - te lo puoi fare da solo
3 - basta appendere un if davanti all'ultima riga che ho postato e due
parentesi graffe identiche a quelle dell'esempio originario
ce la puoi fare enricoe, dai. Non ci crede nessuno che era una
provocazione, soprattutto alla luce di questo post :-)


 provocazione, soprattutto alla luce di questo post :-)
Parole parole... ma intanto non l'hai scritta. Postala e la proviamo.

 Ciao, Alessandro
No, se value è il valore di un campo di testo.

 come esempio di incompetenza assoluta.
Ma un giro su 
http://thedailywtf.com/
 te lo sei mai fatto? Ma vuoi
vedere che quel codice che ho postato alla fin fine era il tuo? ;)
Enricoe, rassegnati: non so se tu sia uno di loro, ma nel nostro campo
gli idioti si sprecano.


 gli idioti si sprecano.
Ma è anche pieno di chi non capisce il contesto iniziale, o di chi
pensa di sapere tutto non sapendo niente, di ignoranza e boria, e non
so se tu sia uno di loro.
So però che quel modo di testare il negativo non è cosi "fuori di
testa" in javascript, e se lo pensi è perchè non conosci
l'ambiente/linguaggio o non tieni in considerazione tutti i fattori.
E non volgio dire che quel modo è il modo giusto, io forse lo farei
diversamente, ma prima di parlare cerco di capire perchè è stata
usata e gli riconosco alcuni meriti, in primo luogo di funzionare
praticamente sempre.
Sicuramente si può fare moooolto melgio, e come qualcuno ha detto
scrivendo codice più leggero e veloce.
Dato che io non sono sicuro.. vediamolo questo codice, sto aspettando,
che ci vorrà mai ?

 nuovo, ci mette la metà... tu che faresti?"

 che ci vorrà mai ?
Io non tocco js da una vita, e non mi e' mai interessato piu' di tanto,
quindi non so. Ho solo riportato un link, comunque, riprendendo quello
che qualcun altro ha scritto, perche' non fare cosi'?
if(parseInt(value) < 0) {
  // valie is negative


setTimeout("tuafunzione()",numeromillisecondi) :D
Hehe!
La domanda era puntuale e ho fornito una risposta puntuale (quella).
Solo dopo ho scoperto perchè aveva bisogno di "aspettare un pò"... brivido
blu! :-)
Ma ero "visiting developer", di passaggio insomma.
F.B.

 }
Perchè ovviamente non funziona, in javascript non è cosi facile,
sopratutto con valori imputati dall'utente.
Basta usare come value = "-0.9" e la tua funzione sbaglia, puoi usare
parseFloat, ma ad esempio con "-1,9" funziona e con "-0,9" no, perchè
non è Italiano e non ama la virgola come separatore dei decimali.
Non solo, ParseInt  o parseFloat è mooolto più pesante che lavorare
sulla stringa e non aggiunge assolutamente niente al controllo e non so
se era presente nelle prime versioni di javascript.
Anche io uso pochissimo javascript, ma ho paura che questo esempio sia
stata una cantonata pazzesca.

 sopratutto con valori imputati dall'utente.
Vedo il tuo punto (traduzione letterale di "I see your point"). Cio' non
toglie che se l'utente avesse scritto "-tasse" nel campo del form, la
funzione nell'OP avrebbe pensato che e' un negativo.
Probabilmente prima di quell'if, la persona che l'ha scritto aveva
controllato che fosse un numero vero e non una stringa che non si poteva
convertire. In questo case il parseFloat avrebbe funzionato.
Vabe' ma siamo in retorica, ti do ragione che senza vedere il resto del
codice tutto puo' essere, ma il daily wtf e' cosi'.


 [cut]


 codice tutto puo' essere, ma il daily wtf e' cosi'.
E' vero che è retorica, ma è anche vero che siamo passati dalla
dimostrazione della maggiore incompetenza del mondo, alla quasi quasi
ha ragione...
Comunque, per chi vuol provare :
http://www.arachnoid.com/javascript/interactiveJavaScript.html



1milione ed hai risolto" come risposta!
Ero stato eccezionalmente "affittato", a fronte di un'imprevista defezione
in un'azienda - evidentemente - "amica".
Certo, ho avuto l'impressione che parecchi fossero un pò spaesati: come se,
abituati a lavorare con altro, li avessero buttati a fare "la versione in
JavaScript" di qualcosa. Cosa tutt'altro che improbabile, per quel che mi è
stato dato di capire.
F.B.
p.s.: ebbi notizia che "la professionalità" la pagarono eccome. Tant'è che
la mia azienda intravvide la possibilità di vivere (e far vivere il proprio
personale: noialtri si sviluppa sw in modo etico) molto meglio affittando il
proprio personale in giro :-D