20 messaggi dal 06 settembre 2014
Beh si,l'utente quando avvia il programma,non ha accesso alla scrittura,avendola resa privata,e quindi non il programma non avrà bug di questo tipo,però in quell'esempio che mi avevi scritto prima te,non avendo inserito nessun codice per dare all'utente la possibilità di inserire input,ometterli non avrebbe cambiato niente,no? Anche se non rendevo privato il set,ma lo lasciavo pubblico,non cambiava niente in questo caso,giusto?
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

cricchi ha scritto:

ometterli non avrebbe cambiato niente,no?

No, meglio non ragionare in questi termini. Devi essere più pragmatico.
E' vero che PER ORA non esiste alcuna interfaccia che consenta l'inserimento di dati, ma non puoi sapere come evolverà la tua applicazione.
Fra 6 mesi, quando aggiungerai tale interfaccia, potresti aver dimenticato che quel campo andava trasformato in una proprietà.

Abituati fin da subito a rendere privati i campi, perché anche i semplici esempi che fai oggi contribuiranno a formare lo sviluppatore che diventerai domani.
Per far capire l'importanza di certe pratiche, qualcuno ha scritto: "Programma sempre come se la persona che manterrà il tuo codice fosse uno psicopatico violento che sa dove abiti"

L'"utente della tua classe" a cui accennavo non è tanto l'utilizzatore finale, quanto il programmatore che scriverà new Persona() nel suo programma. Potresti essere tu stesso, oppure un tuo collega oppure uno sviluppatore di un'altra azienda, a cui stai vendendo il tuo software.
In quest'ottica, vedi che la frase "tanto non avrebbe cambiato niente" non è un ragionamento corretto perché non puoi predire come altri sviluppatori (o tu stesso fra 6 mesi) useranno il tuo codice.
L'unico modo per assicurarsi che la tua classe funzioni come TU vuoi che funzioni - in questo caso - è rinunciare al campo pubblico e ricorrere invece ad una proprietà.

Se fai in modo che la tua classe sia l'unica responsabile a proteggere il suo stato interno, allora avrai scritto del codice più robusto e perciò resistente ai bug più comuni.
Ogni modulo all'interno dell'applicazione è responsabile del corretto funzionamento di sé stesso. Non può dipendere da come viene realizzata un'interfaccia grafica o dal buono o cattivo uso che un altro sviluppatore ne farà.

ciao,
Moreno
Modificato da BrightSoul il 08 settembre 2014 13.18 -

Enjoy learning and just keep making
20 messaggi dal 06 settembre 2014
Spero di non aver fatto confusione..
get e set sono rispettivamente leggi e scrivi.
Se la scrittura è privata significa che l'utente finale e anche gli sviluppatori non possono aggiungere persone? quindi neanche io stesso potrei fare un nuovo "new Persona"? Per scrittura privata si intende che io sviluppatore non posso creare nuove persone o l'utente finale una volta che il programma è in esecuzione? Perché non ho ben capito..l'avergli dato noi stessi "mario Rossi" è inteso come lettura,non scrittura,giusto? il programma legge,e visualizza,ma non è possibile crearne di nuovi perché la scrittura è privata, funziona così?
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

cricchi ha scritto:

Per scrittura privata si intende che io sviluppatore non posso creare nuove persone

Se definisci il costruttore come private, sì. Quando una classe ha un costruttore privato, l'utente non è libero di creare le istanze che vuole usando la parola chiave new.
L'utente dovrà ottenere un'istanza di quella classe in altri modi, come per esempio attraverso il metodo statico che avevi citato.

Se invece rendi privato il Set di una proprietà, allora sarà solo quella proprietà a non poter essere scritta dall'utente. Riprendiamo l'esempio.
https://dotnetfiddle.net/QnXG3a

Come vedi, ho impostato come privato il set di NomeCompleto ed Età. Il costruttore invece è pubblico, e per questo motivo sono stato in grado di ottenere delle istanze di Persona usando la parola chiave new.

Che utilità ha tutto questo?
Le classi, con i loro membri e loro modificatori (public, private, ecc..) ti mettono in condizione di modellare casi reali.

Considera per esempio il contachilometri di un'automobile. Se l'utente potesse modificare il valore dei chilometri riportandoli a zero, potrebbe rivendere la macchina spacciandola per nuova. Un'automobile non deve consentire che si possa resettare il contachilometri, ma solo leggerlo, in modo che l'utente sappia quando deve fare il tagliando o i controlli periodici.
La classe Automobile modellerà questo caso reale con una proprietà KmPercorsi che ha il Get pubblico e il Set privato.

La stessa cosa capita con l'età delle persone: solo il meccanismo biologico interno della persona ne decreta l'età. Non posso io decidere di avere 18 anni di nuovo.
Ancora una volta, la classe Persona modellerà questo caso reale con una proprietà Età che ha il Get pubblico e il Set privato.

Anche il NomeCompleto va reso privato? Dipende. Se stai scrivendo un'applicazione per l'anagrafe, probabilmente ne consentirai la modifica, ma solo se l'utente fornisce gli adeguati documenti necessari alla procedura. Quindi modificare il nome direttamente non sarà possibile, ma si dovrà usare un apposito metodo che richiede all'utente di fornire tutti i parametri richiesti.
persona.CambiaNome("Nuovo nome", vecchiaCartaIdentità, pagamento, scansioneFirma, dichiarazione)


cricchi ha scritto:

l'avergli dato noi stessi "mario Rossi" è inteso come lettura,non scrittura,giusto?

Indirettamente stiamo scrivendo quelle proprietà. Dico "indirettamente" perché qui è il costruttore che si occupa di usare l'input che gli diamo come meglio crede.

Fai finta di essere all'anagrafe: l'impiegato ti chiede con che nome vuoi registrare tuo figlio. Quando gli comunichi il nome, non stai propriamente scrivendo sul registro dell'anagrafe, ma ti stai conformando alle richieste dell'impiegato, che a sua volta scrive sul registro.

In questo caso il costruttore è servito a moderare la scrittura sulla proprietà, un po' come il metodo CambiaNome che vedevamo prima. Se avessi scelto un nome assurdo per tuo figlio, probabilmente l'impiegato non avrebbe creato la nuova voce nel registro ma ti avrebbe chiesto di dare un altro nome (la classe Persona avrebbe modellato questo scenario sollevando un'eccezione, cioè un errore).


ciao,
Moreno
Modificato da BrightSoul il 08 settembre 2014 19.26 -

Enjoy learning and just keep making
20 messaggi dal 06 settembre 2014
Okok,piano piano sto imparando.
Noi quando in Console scriviamo ReadLine e WriteLine,dobbiamo sempre intenderlo al contrario,no?
Cioè,per Read (Leggere) è il programma che legge l'input dato dall'utente. L'utente scrive,il programma legge ciò che è stato scritto,quindi READ.
Quando il programma scrive,usiamo WRITE e l'utente finale legge a schermo.
Quindi anche il GET e SET vanno intesi ragionando come se fossimo dentro al programma. GET= Il programma legge (non noi) e SET= il programma scrive (non noi,l'utente finale in questo caso legge)..perché faccio confusione.

Ho provato comunque ad aggiungere la data di nascita,ai dati,per provare ad inserire del codice io, e tanto per cambiare mi da errore!
MA non capisco dove...

 class Program
    {
        public static void Main(string[] args)
        {
            var Persona1 = new Persona("Stefano A", 27, 1987);
            var Persona2 = new Persona("Lucia B", 58, 1956);
            Console.WriteLine(Persona1.Presentati);    //ERRORE!!
            Console.WriteLine(Persona2.Presentati);    //ERRORE!!
            Console.ReadLine();
           

        }
        public class Persona
        {
            public string NomeCompleto { get; private set; }
            public int Età { get; private set; }
            public int annoNascita { get; private set; }



            public Persona(string nomeCompleto, int età, int AnnoNascita)
            {
                NomeCompleto = nomeCompleto;
                Età = età;
                annoNascita = AnnoNascita;
            }

            public string Presentati()
            {
                return string.Format("Ciao, sono {0} e ho {1} anni,nato nel {2}", NomeCompleto, Età, annoNascita);


Piccola parentesi..i costruttori devono avere lo stesso nome della classe? Perché ho provato a costruirne uno a parte per la data di nascita all'inizio,invece di inserirlo insieme agli altri,ma per non farmi segnare errore,lo dovevo chiamare PERSONA e non in altro modo.


 public string Presentati()
            {
                return string.Format("Ciao, sono {0} e ho {1} anni,nato nel {2}", NomeCompleto, Età, annoNascita)


In questo pezzo di codice,è necessario nel metodo scrivere STRING,visto che lo scriviamo dentro al metodo stesso che deve tornarci una stringa?
Modificato da cricchi il 08 settembre 2014 21.21 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

cricchi ha scritto:

Console.WriteLine(Persona1.Presentati); //ERRORE!!
Console.WriteLine(Persona2.Presentati); //ERRORE!!

Presentati è un metodo, e va invocato usando le parentesi tonde.
Console.WriteLine(Persona1.Presentati());    //ERRORE!!
Console.WriteLine(Persona2.Presentati());    //ERRORE!!

Controlla bene la sintassi sul libro e sugli esempi che hai affrontato finora.

cricchi ha scritto:

Noi quando in Console scriviamo ReadLine e WriteLine,dobbiamo sempre intenderlo al contrario,no?

Intendilo sempre in relazione all'oggetto su cui stai chiamando il metodo.
In questo caso abbiamo Console.WriteLine: il bersaglio dell'azione WriteLine è l'oggetto Console. Quindi stai scrivendo sulla console.
E' solo una conseguenza che poi l'utente riesca a leggere quello che hai scritto. Ragiona sempre sull'azione che stai eseguendo (WriteLine) e sull'oggetto a cui è rivolta (Console).

cricchi ha scritto:
GET= Il programma legge (non noi) e SET= il programma scrive

No. Il Set di una Proprietà servirà a scrivere su quella proprietà. Quando vuoi controllare cosa hai scritto, riottieni il valore con il Get. Pensa sempre a delle analogie con il mondo reale per capire i concetti, perché tanto il software serve a modellare casi reali.
Immaginati una persona principiante che scrive al computer. Mentre scrive (Set) deve concentrarsi sulla tastiera. Quando ha finito e vuole ricontrollare cosa ha scritto, allora sposta lo sguardo sul monitor per leggere (Get).
Set è l'azione di scrivere su un registro, un po' come WriteLine scrive sulla console.

ciao,
Moreno
Modificato da BrightSoul il 09 settembre 2014 07.32 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.