Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker
Analizziamo nel dettaglio DJI RS 5, l'ultimo arrivato della famiglia Ronin progettato per videomaker solisti e piccoli studi. Tra tracciamento intelligente migliorato e ricarica ultra rapida, scopriamo come questo gimbal eleva la qualità delle produzioni.
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming
AMD Ryzen 7 9850X3D è la nuova CPU gaming di riferimento grazie alla 3D V-Cache di seconda generazione e frequenze fino a 5,6 GHz. Nei test offre prestazioni superiori a 9800X3D e 7800X3D, confermando la leadership AMD nel gaming su PC.
Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-06-2009, 10:30   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
[C#]Dubbi utilità polimorfismo

Buondì a tutti

Ieri sera mentre cercavo di andare avanti con una delle mie applicazioncine, mi sono accorto che due classi che avevo scritto sono praticamente identiche: Hanno lo stesso numero di campi, devono effettuare le stesse identiche cose. L'unica piccola differenza sta nel nome di alcuni campi di queste classi:

Codice:
//Classe ManutenzioneVeicolo

private int id_manutenzione;
private int id_veicolo;
private string tipoManutenzione;
private DateTime dataManutenzione;
private double importo;
private bool pagato;
private string descrizione;

//Classe ScadenzeVeicolo
private int id_scadenza;
private int id_veicolo;
private string tipoScadenza;
private DateTime dataScadenza;
private double importo;
private bool pagato;
private string descrizione;

//etc...
Come vedete, sono praticamente identiche.
Ho pensato quindi di creare una classe base, far ereditare le due classi da quest'ultima e fare l'override dei metodi vari.

Poi... mi son detto:
Ma forse in questo caso particolare, una 'complicazione' del genere non mi serve, dato che potrei utilizzare un'unica classe per questo scopo.

Ho allargato un pò il ragionamento e mi è venuto un dubbio:

Ovunque ci sia l'applicazione del polimorfismo, se per qualche ragione devo ridisegnare o eliminare la classe base, poi tutto il lavoro fatto sulle altre classi viene gettato al vento ?

Cioè, in questo mio modo rudimentale di creare una classe a se stante per ogni cosa, vedo un vantaggio: se elimino o cambio soltanto la classe che mi interessa, non vado ad impattare su nessun'altra parte del programma.

Qualcuno potrebbe chiarirmi questi dubbi?

Grazie mille

RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 11:09   #2
Kralizek
Senior Member
 
L'Avatar di Kralizek
 
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
Il trucco é sempre quello:
non forzare le relazioni di ereditarietá. Se esiste, é lampante. Se devi cercare una similitudine vuol dire che non lo é: se proprio hai bisogno di un comportamento comune, un'interfaccia potrebbe aiutarti.
Kralizek è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 11:12   #3
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Puoi anche ricorrere ai Component Object e creare un oggetto, che ne so, DatiVeicolo da assegnare poi alle varie classi...
in questo caso ha senso perchè le due classi in se non mi sembra abbiano relazioni ereditarie naturali, ma i dati che contengono si.
__________________
*ToMmO*

devlog | twitter
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 11:42   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Fra le possibili scadenze ci può essere anche una manutenzione ? E quali altri tipi di scadenze ?
Vedo quel private string tipoScadenza; che mi lascia qualche dubbio.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 11:57   #5
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Ho pensato quindi di creare una classe base, far ereditare le due classi da quest'ultima e fare l'override dei metodi vari.
E costa di più o di meno, anzichè avere due classi distinte anche se simili ?
Avessi 30 classi da derivare capirei...

Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Ovunque ci sia l'applicazione del polimorfismo, se per qualche ragione devo ridisegnare o eliminare la classe base, poi tutto il lavoro fatto sulle altre classi viene gettato al vento ?
Tempo fa feci ad un docente una domanda simile alla tua, e mi fu risposto : "Le classi non si modificano mai. Si specializzano." Affermazione un po' "integralista" ( nella vita reale ho sempre visto gente che le classi le modificano eccome ), ma sicuramente fatta da persona che sapeva il fatto suo, ed è anche il caso di questo discorso, credo.
Se elimini la classe base, che bisogno potresti avere delle sue derivate ?
Se già stai ipotizzando di poter eliminare una di quelle classi, mantenendone l'altra la risposta forse è già data : è il caso di tenerle separate.
La classe base dovrebbe sempre essere disegnata in modo tale da non aver bisogno di vere e proprie "modifiche".

Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Cioè, in questo mio modo rudimentale di creare una classe a se stante per ogni cosa, vedo un vantaggio: se elimino o cambio soltanto la classe che mi interessa, non vado ad impattare su nessun'altra parte del programma.
Secondo me non è affatto "rudimentale". Molti pensano che se non si usano le caratteristiche più "spinte" di un linguaggio, stanno scrivendo codice "rudimentale"...
Soprattutto se sei nella fase in cui, magari all'inizio della stesura di un progetto, non hai chiaro di quante/quali classi realizzare, stai sul semplice.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 12:13   #6
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Come vedete, sono praticamente identiche.
Ho pensato quindi di creare una classe base, far ereditare le due classi da quest'ultima e fare l'override dei metodi vari.
Il problema secondo me sta qui.
Se devi fare l'override di tutti i metodi perche' le due classi non hanno nulla in comune se non i nomi dei campi, e soprattutto se non hai l'esigenza di centralizzare i processi*, allora il polimorfismo non ti serve.

* Ad esempio il trovarsi a dover gestire una collezione di oggetti base, e di richiamare su ciascuno di essi un metodo che tutti gli oggetti di tale collezione hanno (grazie all'ereditarieta') indipendentemente dal tipo, come per esempio l'estrazione di descrittivi per la visualizzazione in una griglia, lo store in un database, l'aggregazione per qualche calcolo, etc.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 12:17   #7
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da cionci Guarda i messaggi
Fra le possibili scadenze ci può essere anche una manutenzione ?
Che ci dici?
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 12:18   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Che ci dici?
Smell like teen refactoring
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 12:20   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da cionci Guarda i messaggi
Smell like teen refactoring
Sì, io dicevo a Raoul quotando te, perchè ho lo stesso dubbio
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 12:21   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Tra l'altro ci sono anche altre cose che puzzano...esiste una classe veicolo ? La classe veicolo mi immagino che abbia il suo id all'interno ed abbia al suo interno anche una lista di scadenze. Allora che ci fa id veicolo nelle altre classi ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 12:22   #11
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da cionci Guarda i messaggi
Tra l'altro ci sono anche altre cose che puzzano...esiste una classe veicolo ? La classe veicolo mi immagino che abbia il suo id all'interno ed abbia al suo interno anche una lista di scadenze. Allora che ci fa id veicolo nelle altre classi ?
Ho il leggerissimo sospetto che quelle classi non siano altro che la rappresentazione di "Value Object" corrispondenti a tabelle di un database...
__________________

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)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 13:14   #12
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Ho il leggerissimo sospetto che quelle classi non siano altro che la rappresentazione di "Value Object" corrispondenti a tabelle di un database...
Eccomi

Inizio da banryu79:

Esatto, il database è già esistente, oddio.. database, diciamo 5/6 tabelline

Le classi non servono ad altro che a rappresentare i dati di queste tabelle quindi è come dici tu.

@cionci:
Si, esiste una classe veicolo con il suo id, ma non ha nulla come scadenze o altro. Si limita a esporre i campi contenuti nella relativa tabella del database.

@gugoXX
In questo caso specifico, centralizzare i processi effettivamente non mi occorre.

Di fondo mi pare di capire dalle vostre risposte che se ho un database progettato a cane, di conseguenza qualsiasi cosa ci possa fare io non potrà mai essere veramente decente.

Capisco anche che scrivendo codice sotto una mal progettazione, è evidente che possano venire dubbi anche sui principi cardine della programmazione a oggetti.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 13:17   #13
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da cionci Guarda i messaggi
Fra le possibili scadenze ci può essere anche una manutenzione ? E quali altri tipi di scadenze ?
Vedo quel private string tipoScadenza; che mi lascia qualche dubbio.
per entrare più nel dettaglio:

come scadenze sono intese soltanto: bolli, assicurazioni, multe, gps.

per le manutenzioni sono intese invece solo: ordinarie/straordinarie
e nel campo descrizione viene inserito soltanto il testo relativo al numero di fattura di chi ha riparato l'autoveicolo.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 13:42   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Se le classi incapsulano i dati del DB allora non devi fare alcuna gerarchia, se fai una gerarchia nelle classi la devi fare anche nel DB e viceversa, altrimenti non ha senso.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-06-2009, 14:46   #15
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Ovunque ci sia l'applicazione del polimorfismo, se per qualche ragione devo ridisegnare o eliminare la classe base, poi tutto il lavoro fatto sulle altre classi viene gettato al vento ?

Cioè, in questo mio modo rudimentale di creare una classe a se stante per ogni cosa, vedo un vantaggio: se elimino o cambio soltanto la classe che mi interessa, non vado ad impattare su nessun'altra parte del programma.
Quanto dici è esatto. Il perchè deriva da uno dei cardini della prospettiva orientata agli oggetti che è il principio di autonomia.

La premessa è che un sistema orientato agli oggetti è fatto di oggetti e contrariamente a quanto si legge in alcuni mirabolanti testi oggetto NON E' ogni cosa.

In un sistema orientato agli oggetti con il termine oggetto si individua una qualsiasi parte autonomamente definibile di un fenomeno. Detto altrimenti una qualsiasi definizione intesa come insieme denominato di predicati è anche la definizione di un oggetto solo se tale definizione non dipende da altre definizioni esistenti nel sistema.

Sebbene la classe in sè non sia un elemento fondamentale dell'orientamento agli oggetti è facile notare come essa rientri pienamente nel concetto di definizione di oggetto in base all'osservazione che essa definisce un modello di comportamento uniforme per un insieme di oggetti: in pratica è una fabbrica di cloni. C'è una definizione di oggetto con la particolarità "meccanica" che da questa definizione può essere usata per produrre un numero infinito di oggetti identici.

Posto che le classi sono definizioni quando una classe deriva da un'altra ciò che succede è che tra la definizione derivata e quella derivante si instaura un rapporto di dipendenza: la definizione derivante richiede che esista la definizione derivata. En passant deve notarsi come la relazione di dipendenza tra definizioni non sia transitiva (questione centrale, se fosse transitiva ogni sistema orientato agli oggetti non potrebbe che essere un sistema composto di un solo oggetto).

Ora se oggetto è tutto ciò che in fenomeno è definibile autonomamente e io mi trovo di fronte a due definizioni A (superclasse) e B (sottoclasse) una delle quali richiede l'altra risulta evidente che A e B sono parti di un solo oggetto.

La superclasse è sempre parte della definizione di un oggetto, qualsiasi intervento sulla parte ha per definizione effetto sul tutto ergo quando cambi qualcosa nella superclasse hai un effetto collaterale.

L'idea della classe a sè stante per ogni cosa corrisponde in linea di principio all'individuazione statica dei diversi oggetti che esistono nel fenomeno.

Da un punto di vista dinamico è necessario tuttavia che gli oggetti "comunichino" tra loro. La comunicazione richiede condivisione di parti della proprio definizione e il punto di equilibrio dell'orientamento agli oggetti sta nella selezione di quelle definizioni che possono essere condivise senza pregiudicare l'esatta rappresentazione di un fenomeno in termini di oggetti, ciò che è reso possibile dalla considerazione che se le definizioni A e B richiedono l'esistenza di una definizione C, A e B risultano comunque reciprocamente indipendenti.

Cioè posso anche dire "ok elimino la classe base e dichiaro due classi separate, magari ripetendo le stesse cose due volte" ma prima o poi qualcuno dovrà "collegarsi" a quelle classi. A un certo punto qualcuno vorrà sapere se la manutezione sia stata pagata. Se per dirlo fa riferimento alla definizione "ManutenzioneVeicolo" allora ManutenzioneVeicolo perderà la propria identità di oggetto in favore della costituizione di un diverso oggetto XYZ + ManutenzioneVeicolo. E' lì che entrano in gioco ereditarietà e composizione: separi la definizione di ManutenzioneVeicolo in due parti (diciamo ManutenzioneVeicolo che estende Manutenzione, giusto per fare un esempio) e così facendo permetti all'oggetto ManutenzioneVeicolo (che è la composizione di due definizioni) di comunicare con un altro oggetto senza perdere la propria autonomia di definizione cioè senza perdere la propria identità nel sistema.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
SpaceX vuole portare nello Spazio 1 mili...
Realme 16: il nuovo mid-range che si isp...
DAZN lancia il piano Full Mobile a 19,99...
Samsung Galaxy S26, ormai è tutto...
Smartphone sempre più cari: super...
L'ultima puntata di Falsissimo rimossa d...
NASA Perseverance ha utilizzato percorsi...
Blue Origin sospende per almeno due anni...
Stampanti, Los Angeles verso il divieto ...
Roscosmos Amur: il razzo spaziale riutil...
Robot aspirapolvere per tutte le tasche:...
Accedere alle mail di un lavoratore lice...
Amazon Haul scatenato: migliaia di prodo...
Amazon Seconda Mano rilancia: sconto ext...
Super prezzo Amazon per ECOVACS DEEBOT T...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:44.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v