I singleton

Salve.
Forse ho l’occasione di provare ad usare i singleton ma vorrei sapere se
la
procedura e’ corretta.
Come detto in un’altra mail ho una classe per gestire le connessioni con
ldap.
Tale classe ha, tra gli altri, i seguenti metodi:

def initialize(server, protocol_version)
@base = “ou=prove,dc=miodominio,dc=it”
@admin = “cn=admin,dc=miodominio,dc=it”
@passwd = “xxx”
@conn = LDAP::Conn.new(server)
@conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION, protocol_version)
end

def connetti
@conn.bind(@admin, @passwd)
end

def inserisci(account)
crypt_passwd = “#{account[“password”]}”.crypt(‘aa’)
newentry = {
“objectClass” =>
[“top”,“person”,“organizationalPerson”,“inetOrgPerson”,“posixAccount”],
“sn” => ["#{account[“cognome”]}"],
“cn” => ["#{account[“nome”]} #{account[“cognome”]}"],
“mail” => ["#{account[“uid”]}#@dominio"],
“uid” => ["#{account[“uid”]}"],
“userPassword” => ["{crypt}#{crypt_passwd}"],
}
@conn.add(“uid=#{account[‘uid’]},#@base”, newentry)
sendMailOnInsert(newentry[“mail”], newentry[“cn”],
newentry[“employeeNumber”])
end

il metodo sendMailOnInsert deve partire solo se e’ stato accertato
l’inserimento dell’account percio’ ho pensato:

def self.inserito?
count = 0
@conn.search(@base, LDAP::LDAP_SCOPE_SUBTREE, “uid=#{uid}”,[‘uid’]) do
|x|

count += 1

end
if count == 1
return true
else
return false
end
end

Sto procedendo correttamente?

On Tue, 11 Sep 2007 12:23:04 +0200, Mauro wrote:

Salve.
Forse ho l’occasione di provare ad usare i singleton ma vorrei sapere se la
procedura e’ corretta.

@conn.add(“uid=#{account[‘uid’]},#@base”, newentry)
sendMailOnInsert(newentry[“mail”], newentry[“cn”],

ma non è che add() ti ritorna qualcosa, tipo true/false?

Comunque, non ho capito la domanda sui singleton… cosa c’entrano?

— Mauro [email protected] wrote:

Come detto in un’altra mail ho una classe per
gestire le connessioni con
ldap.
Tale classe ha, tra gli altri, i seguenti metodi:

consiglio di scrivere tutto in inglese, il mix italiano/inglese è terribile. Solo un consiglio :)
count += 1

end
if count == 1
return true
else
return false
end
end

Sto procedendo correttamente?

dovresti usare un oggetto singleton quando esso è
effettivamente differente da tutti gli altri.
Nel tuo caso non mi sembra così, ogni utente può
essere o meno inserito.
Tra l’altro il codice forse è più leggibile come

def inserito?
@conn.search(@base, LDAP::LDAP_SCOPE_SUBTREE,
“uid=#{uid}”,[‘uid’]) do |x|

count += 1

end
if count == 1
return true
else
return false
end
end

  ___________________________________________________________

Want ideas for reducing your carbon footprint? Visit Yahoo! For Good
http://uk.promotions.yahoo.com/forgood/environment.html

end
end

Sto procedendo correttamente?

Questo sembra un po’ contorto. search() ti ritorna ben qualcosa, no? Un
LDAP entry? Un array di LDAP entries?
A occhio qualcosa così potrebbe forse magari chissà anche funzionare:
def exist?(uid)
result = @conn.search(@base, LDAP::LDAP_SCOPE_SUBTREE,
“uid=#{uid}”,[‘uid’])
if result && result.is_a?(OGGETTO_CHE_TI_ASPETTI)
true # o magari result stesso, già che ci siamo
else
false
end
end

Perché volevi usare un block?

Perché volevi usare un block?

ho preso l’esempio dalla rete.

ma non è che add() ti ritorna qualcosa, tipo true/false?

Puo’ essere, come faccio a saperlo?

— Mauro [email protected] wrote:

Come detto in un’altra mail ho una classe per
gestire le connessioni con
ldap.
Tale classe ha, tra gli altri, i seguenti metodi:

consiglio di scrivere tutto in inglese, il mix italiano/inglese è terribile. Solo un consiglio :)
count += 1

end
if count == 1
return true
else
return false
end
end

Sto procedendo correttamente?

dovresti usare un oggetto singleton quando esso è
effettivamente differente da tutti gli altri.
Nel tuo caso non mi sembra così, ogni utente può
essere o meno inserito.

Una cosa che potresti fareè usare due classi diverse,
Utente e UtenteVerificato con metodi sendMailOnInsert
differenti, e usare istanze dell’una o dell’altra a
seconda della situazione, ma imo ti complichi la vita
e basta.

Tra l’altro il codice forse è più leggibile come

def inserito?
@conn.search(@base, LDAP::LDAP_SCOPE_SUBTREE,
“uid=#{uid}”,[‘uid’]) do |x|
return true
end
return false
end

teendoi a mente che “return” agisce sempre a livello
di metodo.

Tutto, se ho capito bene :slight_smile:

  ___________________________________________________________

Want ideas for reducing your carbon footprint? Visit Yahoo! For Good
http://uk.promotions.yahoo.com/forgood/environment.html

Leggi la documentazione della classe!

(o, se preferisci, lo provi da IRB e vedi che valore ti torna con un
result.inspect)

On 9/11/07, David [email protected] wrote:

Leggi la documentazione della classe!

(o, se preferisci, lo provi da IRB e vedi che valore ti torna con un
result.inspect)

irb mi ritorna
#LDAP::Conn:0x2b9029700898

On Thu, 13 Sep 2007 13:36:50 +0200, Mauro wrote:

#Object:0x2b8709e393e0
Scusami, non sono stato chiaro. “result” era solo un’esempio di un nome
per una variabile che contenesse il risultato restituito da add().
Così:
result = conn.add(…)
result.inspect chiama il metodo “inspect()” sul oggetto riferito dalla
variabile “result”. Invece di chiamarlo “result” potevi dire:
mutande_del_mio_nonno = conn.add(…)

mutande_del_mo_nonno.inspect

(inspect è un metodo che tutti gli oggetti ruby hanno)

On 9/11/07, Mauro [email protected] wrote:

irb mi ritorna
#LDAP::Conn:0x2b9029700898

scusa ma come dovrei usare result.inspect?
usando irb dopo la conn.add mi ritorna => #LDAP::Conn:0x2b870a863d98
se poi do result.inspect mi dice
NameError: undefined local variable or method `result’ for
#Object:0x2b8709e393e0

(inspect è un metodo che tutti gli oggetti ruby hanno)
ok ma anche in questo modo il risultato e’
“#LDAP::Conn:0x2b25b44bde80
non mi da ne true ne false.