|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
[Object Orientation] Metodi getter/setter. Che ne pensate?
Ciao a tutti. All'università sto seguendo il corso di Progettazione del software e ultimamente stavamo parlando di object orientation. Volevo sentire la vostra opinione sui metodi getter/setter. Li usate, preferite un altro metodo o trovate un compromesso? Se usate un altro metodo, quale? Grazie
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Personalmente mi sono sempre sembrati una stronzata.
Io tendo a rendere tutto immutabile (ad esempio in java le mie variabili di istanza sono tutte "public final"... dove possibile ovviamente).
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Preferisco le property, già dai tempi di Delphi.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Quote:
Cosa sono le property? Per esempio, in Java? |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Eh? Tipo? Scusa fammi un esempio di come non avresti lo stesso problema con getter/setter...
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Concettualmente sono una stronzata (sono le properties, ne più ne meno), ma in un linguaggio che non offre le properties tipo C++ o Java vanno usati, anche se a malincuore.
Ho provato a "farla semplice" e creare semplicemente membri pubblici, ma questo impedisce qualsiasi controllo su cosa viene settato dall'esterno e quando... e questo manco a dirlo è una fabbrica di bug. Stesso dicasi per le letture, ad esempio qualcuno potrebbe decidere di prendersi un puntatore al membro, che poi viene invalidato senza che lui lo sappia. Quindi, in C++/Java, getter e setter vanno usati a forza. In altri linguaggi, fate vobis PS: mentre in C++ sono spesso inline e quindi non impattano sulle performance, in Java sono vere chiamate a funzione... e quindi oltre al danno, la lentezza! |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
No perchè a sentir voi, pare sempre che negli altri linguaggi il compilatore sia furbo mentra javac deve essere per forza una ciabatta che non è capace a ottimizzare roba del genere...
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Risposta in privato
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
Codice:
// H4xx0r.java
class H4xx0r {
private int leet;
public int getLeet() { return leet; }
public void setLeet(int leet) { this.leet = leet; }
public static void main(String... args) {
H4xx0r h = new H4xx0r();
h.setLeet(1337);
System.out.println(h.getLeet());
}
}
// H4xx0r2.java
class H4xx0r2 {
public int leet;
public static void main(String... args) {
H4xx0r2 h = new H4xx0r2();
h.leet = 1337;
System.out.println(h.leet);
}
}
// javap -c H4xx0r
Compiled from "H4xx0r.java"
class H4xx0r extends java.lang.Object{
H4xx0r();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public int getLeet();
Code:
0: aload_0
1: getfield #2; //Field leet:I
4: ireturn
public void setLeet(int);
Code:
0: aload_0
1: iload_1
2: putfield #2; //Field leet:I
5: return
public static void main(java.lang.String[]);
Code:
0: new #3; //class H4xx0r
3: dup
4: invokespecial #4; //Method "<init>":()V
7: astore_1
8: aload_1
9: sipush 1337
12: invokevirtual #5; //Method setLeet:(I)V
15: getstatic #6; //Field java/lang/System.out:Ljava/io/PrintStream;
18: aload_1
19: invokevirtual #7; //Method getLeet:()I
22: invokevirtual #8; //Method java/io/PrintStream.println:(I)V
25: return
}
// javap -c H4xx0r2.java
Compiled from "H4xx0r2.java"
class H4xx0r2 extends java.lang.Object{
public int leet;
H4xx0r2();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2; //class H4xx0r2
3: dup
4: invokespecial #3; //Method "<init>":()V
7: astore_1
8: aload_1
9: sipush 1337
12: putfield #4; //Field leet:I
15: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
18: aload_1
19: getfield #4; //Field leet:I
22: invokevirtual #6; //Method java/io/PrintStream.println:(I)V
25: return
}
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Ok, è una ciabatta
![]() Scherzi (e svarione mio) a parte, il costo a runtime dei getter/setter è trascurabile, se vengono effettuate poche chiamate. Se vengono effettuate molte chiamate, la JVM compila il metodo in maniera nativa (normalmente con HotSpot ricordo che se un metodo viene invocato 1000 volte a runtime viene compilato). Non saprei se al posto della compilazione nativa di un getter/setter liscio sia prevista la possibilità di effettuare un accesso diretto al campo... Chiaro che se la classe è final e i suoi campi sono immutabili, questi utlimi possono semplicemente essere esposti come pubblici. In ogni caso, a livello prestazionale, quanto può mai essere rilevante il peso dei getter/setter nella tipica applicazione media per cui viene usato Java?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 07-11-2011 alle 17:06. |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
Codice:
// Setters.java
class Setters {
private double x;
public void setX(double x) { this.x = x; }
public static void main(String... args) {
for (int i = 1; i <= 5; ++i) {
System.out.print("Try " + i + ": ");
final Setters victim = new Setters();
final long start = System.nanoTime();
for (int j = 0; j < 100000; ++j) {
victim.setX(Math.random());
}
System.out.println((System.nanoTime() - start) / 1000000000.0);
}
}
}
// NoSetters.java
class NoSetters {
public double x;
public static void main(String... args) {
for (int i = 1; i <= 5; ++i) {
System.out.print("Try " + i + ": ");
final NoSetters victim = new NoSetters();
final long start = System.nanoTime();
for (int j = 0; j < 100000; ++j) {
victim.x = Math.random();
}
System.out.println((System.nanoTime() - start) / 1000000000.0);
}
}
}
Codice:
c:\> java Setters Try 1: 0.009697214 Try 2: 0.00675697 Try 3: 0.007349395 Try 4: 0.006881777 Try 5: 0.007874961 c:\> java NoSetters Try 1: 0.014335313 Try 2: 0.006779257 Try 3: 0.006854627 Try 4: 0.007369251 Try 5: 0.006836393
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
|
|
|
|
|
#16 | |||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Java non le ha ovviamente, per cui nisba esempi.
Ti evito Delphi e fornisco un esempio semplice in C# direttamente dalla mamma. Quote:
Poi sappiamo pure chi è il papà di C#, no? Ovviamente son d'accordo con l'evoluzione che hanno preso in C# (ci sono pure le property virtuali Quote:
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|||
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
@banryu79: lol! A difendere la VM Java si rischia sempre un sacco
@shinya: quel test fa acqua, random è troppo più pesante di una singola chiamata a funzione Prova a fare l'unroll e usare una roba del genere Codice:
for (int i = 1; i <= 5; ++i) {
System.out.print("Try " + i + ": ");
final Setters victim = new Setters();
final long start = System.nanoTime();
int lol = 2389472;
for (int j = 0; j < 100000; ++j) {
victim.setX(lol);
victim.setX(lol);
victim.setX(lol);
victim.setX(lol);
victim.setX(lol);
victim.setX(lol);
victim.setX(lol);
victim.setX(lol);
}
System.out.println((System.nanoTime() - start) / 1000000000.0);
}
Comunque, il peso del getter e setter è sicuramente poco, ma in codici compute-intensive è sicuramente meglio non averlo @cdimauro il NON poter dichiarare qualcosa "non virtuale" invece, prova che Java è un pò una fetecchia... ma d'altra parte grazie alla mancanza di operator overloading pure le somme tra vettori devono essere una chiamata a funzione virtuale, quindi sta messo male
Ultima modifica di Tommo : 07-11-2011 alle 18:58. |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quello sì, l'overloading è una manna dal cielo (per anni ne ho sentito la mancanza in Delphi).
Però le funzioni non virtuali le puoi dichiarare come static: sono la stessa cosa alla fine.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
@Tommo non mi pare che banryu abbia detto castronate
cmq ho provato il tuo codice alzando a 1 miliardo il numero di iterazioni del for: con i setter ho avuto 0.03526231 secondi di media dei 5 try, mentre senza setter ho avuto 0.03517135. Quindi, su 1 miliardo di iterazioni, il codice coi setter è più lento dello 0,0026% rispetto al codice senza setter, ovvero 91microsecondi (sempre su 1 miliardo di iterazioni). E' palese che non posso spalmare 91microsecondi su 8 miliardi di set, ciò mi fa dedurre che probabilmente la jvm ottimizzi "strada facendo" e che comunque non ci sia un calo di prestazioni degno di nota. Se mi importasse quel margine di performance, allora farei meglio a passare al C o direttamente all'assembly... Conclusione: non mi pare si possa dire qualcosa su quanto schifo faccia il java sulla base di questi discorsi. Poi si sa, è solo una questione di simpatia o antipatia personale verso i linguaggi.
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
Quote:
Codice:
public class MyClass
{
public int Id { get; set; }
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
}
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:01.





















