Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584

    [vb.net OT] utilizzare property o variabili public nelle classi?

    salve a tutti

    vorrei porre una semplice domanda su come i programmatori generalmente tendono a realizzare le proprie classi
    questa domanda mi viene da porla in quanto negli ultimi progetti :
    1)non avevo bisogno di utilizzare componenti che richiedessero le property nelle classi a cui passo
    2) non avevo bisogno di sapere quando viene valorizzata una variabilie o quando viene prelevata
    3) non avevo bisogno di impostare una variabile in sola lettura o sola scrittura
    quindi ho deciso di mettere delle semplici variabili public nelle classi

    come ragionamento ovviamente vorrei confrontarmi con persone + esperte di me per, infatti sopra ho posto i motivi che ho avuto per lasciare le property e mettere le variabili public

    qualcun'altro lo fa come me? si no xke?
    grazie
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Una domanda ... prendi una di queste variabili ... per quello che serve nella tua classe, puo' avere dei valori che non dovrebbero essere consentiti o che possono portare a dei problemi nella futura elaborazione da parte delle funzioni della stessa classe?

  3. #3
    Mah, io di solito preferisco incapsulare sempre i dati in proprietà pubbliche che si riferiscono a campi privati... anche perché quasi sempre ci sono controlli da effettuare sui dati assegnati.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    Originariamente inviato da oregon
    Una domanda ... prendi una di queste variabili ... per quello che serve nella tua classe, puo' avere dei valori che non dovrebbero essere consentiti o che possono portare a dei problemi nella futura elaborazione da parte delle funzioni della stessa classe?
    valori non consentiti?
    prima di valorizzare queste variabili nella classe c'è sempre una funzione di controllo che gestisece probabili errori di inserimento nelle caselle di testo di una form

    futura elaborazione?
    sinceramente in tutti i progetti non ho mai avuto l'occasione di impostare variabili a sola lettura o via dicendo
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  5. #5
    Originariamente inviato da Kahm
    valori non consentiti?
    prima di valorizzare queste variabili nella classe c'è sempre una funzione di controllo che gestisece probabili errori di inserimento nelle caselle di testo di una form
    futura elaborazione?
    sinceramente in tutti i progetti non ho mai avuto l'occasione di impostare variabili a sola lettura o via dicendo
    Non è faccenda di verificare le caselle di testo, il concetto è che la logica della classe deve restare il più possibile slegata da quella dell'interfaccia grafica, prevenendo così anche gli errori del programmatore. Ti faccio qualche esempio, da una mia classe per la gestione delle finestre:
    codice:
        Public ReadOnly Property Handle() As IntPtr Implements IWin32Window.Handle
            Get
                Return mHandle
            End Get
        End Property
    Ovviamente l'handle non deve essere modificato dall'esterno della classe (pena casini inenarrabili), per cui impedisco non all'utente, ma allo stesso programmatore di modificarlo.
    codice:
        'Restituisce o imposta gli stili
        Public Property Styles() As WindowStyles
            Get
                Return GetWindowInfo.WindowStyles
            End Get
            Set(ByVal Value As WindowStyles)
                CheckHandle()
                If SetWindowLong(Handle, Declares.SetWindowLongIndex.RedefStyles, Value) = 0 Then
                    Throw New System.ComponentModel.Win32Exception()
                End If
            End Set
        End Property
    Qui ovviamente si rende necessaria una property, perché si incapsula l'accesso ad una risorsa unmanaged.
    codice:
    		/// <summary>
    		/// Size of the drive.
    		/// </summary>
    		[Description("Size of the drive."),Category("Behavior")]
    		public long TotalSpace
    		{
    			get
    			{
    				return totalSpace;
    			}
    			set
    			{
    				if (value<=0)
    					throw new ArgumentException("TotalSpace must be greater than 0.","TotalSpace");
    				if (newFilesSpace+usedSpace>value*2)
    					throw new ArgumentException("NewFileSpace + UsedSpace mustn't exceed TotalSpace * 2.");
    				totalSpace = value;
    				this.Refresh();
    			}
    		}
    Questo esempio invece è in C# e viene da un controllo che mostra lo spazio usato su un disco; come si può vedere il campo locale totalSpace viene incapsulato dalla proprietà TotalSpace che, oltre ad aggiornare la visualizzazione, a scanso di equivoci ne verifica il valore.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da Kahm
    valori non consentiti?
    prima di valorizzare queste variabili nella classe c'è sempre una funzione di controllo che gestisece probabili errori di inserimento nelle caselle di testo di una form
    Ma la funzione di controllo non appartiene alla classe ... giusto?

    La variabile pubblica potrebbe essere variata anche senza essere controllata ...

  7. #7
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    mi pare strane da mettere il controllo delle variabili dentro la classe!
    le classi che ho costruito sono molto generiche ed in piu' occasioni le ho riutilizzate proprio per la loro caratteristica di essere totalmente generiche

    se successivamente devo implementare varifiche sulle variabili con restituzione di errori non si parlerebbe piu' di polimorfismo, ma sarebbero classi statiche e non piu' dinamiche

    secondo me l'errore bisogna gestirlo prima di attivare la funzione o metodo della classe (prima o dopo la valorizzazione delle variabili non importa).
    infatti non ho mai visto una dll di casa microsoft che mi restituisce un errore che il formato data non è valido!, casomai la dll tenta l'inserimento/operazione e il database restituisce il tipo di errore, ma non la classe
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Originariamente inviato da Kahm
    mi pare strane da mettere il controllo delle variabili dentro la classe!
    Gran parte della programmazione ad oggetti gira attorno a questo concetto che a te pare strano.

    Originariamente inviato da Kahm
    le classi che ho costruito sono molto generiche ed in piu' occasioni le ho riutilizzate proprio per la loro caratteristica di essere totalmente generiche
    Cosa si intende per "generica"? Una classe può essere general purpose indipendentemente dai controlli, che vanno fatti, sui campi privati a cui si accede.

    Originariamente inviato da Kahm
    se successivamente devo implementare varifiche sulle variabili con restituzione di errori non si parlerebbe piu' di polimorfismo, ma sarebbero classi statiche e non piu' dinamiche
    "Classi dinamiche" non appartiene al mio vocabolario OOP... non capisco proprio a cosa ti riferisci.

    Originariamente inviato da Kahm
    secondo me l'errore bisogna gestirlo prima di attivare la funzione o metodo della classe (prima o dopo la valorizzazione delle variabili non importa).
    E' falso. L'incapsulazione serve proprio a questo scopo: racchiudere nella classe la logica di funzionamento e di controllo dei campi interni, effettuando controlli sulla validità dei valori che si vanno ad impostare, con metodi di accesso in lettura e scrittura.

    Ammettendo per assurdo che così non fosse, se hai notato nelle proprietà la presenza di un Get e di un Set, che significato hai attribuito loro??

    Originariamente inviato da Kahm
    infatti non ho mai visto una dll di casa microsoft che mi restituisce un errore che il formato data non è valido!, casomai la dll tenta l'inserimento/operazione e il database restituisce il tipo di errore, ma non la classe
    E' falso. Qualsiasi "campo" (inteso come membro privato di una classe) è accessibile tramite una proprietà, e laddove è necessario la verifica dei dati viene effettuata dai metodi di accesso.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,584
    come ho accennato inizialmente, ho analizzato bene a cosa dovesse servire la classe, ed ho appurato che non mi servono controlli, in quanto il controllo di validita' lo faccio direttamente nel form dove valorizzo le variabili

    cmq ho capito cosa mi state dicendo,
    in effetti :master: se io passo la mia classe ad un programmatore nuovo e gli dico :"tiè usala" lui non sa se deve preoccuparsi lui di fare i controlli o se li fa la classe,pero' non facendola la classe puo' essere benissimo riutilizzata in altri progetti
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Originariamente inviato da Kahm
    come ho accennato inizialmente, ho analizzato bene a cosa dovesse servire la classe, ed ho appurato che non mi servono controlli, in quanto il controllo di validita' lo faccio direttamente nel form dove valorizzo le variabili
    Sì, questo - almeno personalmente - l'ho capito. Il problema è che è errato.

    Originariamente inviato da Kahm
    cmq ho capito cosa mi state dicendo,
    in effetti :master: se io passo la mia classe ad un programmatore nuovo e gli dico :"tiè usala" lui non sa se deve preoccuparsi lui di fare i controlli o se li fa la classe,pero' non facendola la classe puo' essere benissimo riutilizzata in altri progetti
    No. I controlli vanno fatti nella classe, o comunque la classe deve contenere tutto il codice affinché, essendo dotata di campi intermediati da proprietà, qualsiasi valore non corretto non debba essere accettato da qualsiasi proprietà.

    Se tu fornisci la classe ad una terza persona, così come sei tu stesso fruitore di classi Microsoft, sai che chi ha sviluppato la classe è colui che conosce la logica interna ed è il solo ed unico responsabile finale del corretto funzionamento della stessa, e se io riesco ad impostare un valore inaccettabile per una determinata proprietà, la classe ha un bug, una vulnerabilità.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.