Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [vb.net] Pareri sulla mia prima classe
Forum - C# / VB.NET - [vb.net] Pareri sulla mia prima classe

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Salve a tutti.... oggi come esercizio mi sono messo a creare un programma, dove è possibile aggiungere delle materie scolastiche coi relativi voti, e con essi determinarne moda, media, media globale delle materie e la possibilità di ricevere le medie di: una sola materie, delle materie prescelte e di tutte le materie, con le relative mode.

A tal proposito mi sono cimentato a scrivere la mia prima classe...al momento sono arrivato a studiare solo fino alle proprietà(niente polimorfismo, ereditarietà etc.)...quindi tutte le mie attuale conoscenze sulle classi sono quelle presenti nel programma.
Ma arriviamo al dunque...io vorrei sapere se la classe  che ho scritto è fatta bene, se ha bisogno di alcune aggiustatine o cosa....io alla buona l'ho testata e funziona, ma non so se si possa rendere più "performante" non sò se mi spiego

Codice sorgente - presumibilmente VB.NET

  1. Public Class Subjects
  2.     Private _SubjectNames As String 'campo contenente il nome delle materie
  3.     Private _Votes As New ArrayList 'lista coi voti della materia
  4.     'campo share con il numero delle materie create accessibili
  5.     Private Shared _SubjectNumber As Int32
  6.    
  7.     Private Shared _TotalMedia As Single
  8.  
  9.  
  10.     'ad ogni creazione di un oggetto(che rappresenta le materie) aumento
  11.     'di uno il numero delle materie create ed aggiungo voti e nome materia
  12.     Public Sub New()
  13.         Console.Clear()
  14.         Subjectnumber += 1
  15.  
  16.         Console.Write("Inserisci il nome della materia: ")
  17.         SubjectNames = Console.ReadLine
  18.         GetVotes()
  19.         _TotalMedia += Media
  20.     End Sub
  21.  
  22.     'imposto una proprietà che consenta di restituire il numero delle materie create
  23.     'al momento però viene utilizzato solamente per fare la media globale di conseguenza potrebbe
  24.     'essere tutto private, ma preferisco mantenerlo pubblico in caso lo voglia usare nel Sub Main()
  25.     'mentre la parte set è provata perchè voglio che venga modificata solo all'interno dei membri
  26.     'preposti a tale compito
  27.     Public Shared Property Subjectnumber() As Int32
  28.         Set(value As Int32)
  29.  
  30.             _SubjectNumber = value
  31.         End Set
  32.         Get
  33.             Return _SubjectNumber
  34.         End Get
  35.     End Property
  36.  
  37.     'proprietà che consente di ricavare il nome della materia e di ricavarne il nome
  38.     ' in caso le materie non ricevano una stringa, ma solamente una stringa vuota ""
  39.     'la proprietà le rinomina in automatico a seconda del numero delle materie create fino
  40.     'a questo momento
  41.     Public Property SubjectNames() As String
  42.         'set è privato in quanto solo il membro predisposto a tale compito
  43.         'può modificare il nome
  44.         Private Set(value As String)
  45.             If (value = "") Then
  46.                 _SubjectNames = Subjectnumber
  47.             Else
  48.                 _SubjectNames = value
  49.             End If
  50.  
  51.         End Set
  52.         Get
  53.             Return _SubjectNames
  54.         End Get
  55.     End Property
  56.  
  57.     'membro sub che consente di inserire nella lista _votes
  58.     'tutti i voti della materia rappresentata dall'oggetto
  59.     Public Sub GetVotes()
  60.  
  61.         Console.Clear()
  62.         Console.WriteLine("Inserisci i voti di " & _SubjectNames &  _
  63.                                    " in decimi(0 per terminare)")
  64.         Console.WriteLine()
  65.  
  66.         Do
  67.             Dim temp As Single = 0
  68.             Console.Write("Voto " & Votes.Count & ": ")
  69.             temp = Console.ReadLine()
  70.  
  71.             'se il valore è fuori scala lo reimposto al massimo/minimo consentito
  72.             If temp > 10 Then
  73.                 Console.WriteLine("Valore sopra al range massimo, reimpostato a 10")
  74.                 temp = 10
  75.             ElseIf temp < 0 Then
  76.                 Console.WriteLine("Valore sotto il range minimo, reimpostato a 1")
  77.                 temp = 1
  78.             End If
  79.             Votes.Add(temp)
  80.  
  81.         Loop Until (Votes(Votes.Count - 1)) = 0
  82.  
  83.         Votes.RemoveAt(Votes.Count - 1)
  84.         Console.Clear()
  85.     End Sub
  86.  
  87.     'proprietà reference che mi consente puntare alla lista _votes
  88.     Public ReadOnly Property Votes As ArrayList
  89.         Get
  90.             Return _Votes
  91.         End Get
  92.     End Property
  93.  
  94.     Public ReadOnly Property media As Single
  95.  
  96.         Get
  97.             Return GetMedia()
  98.         End Get
  99.     End Property
  100.     'membro che calcola la media della materia
  101.     Private Function GetMedia() As Single
  102.         Dim Media As Single
  103.         For index As Int32 = 0 To _Votes.Count - 1
  104.             Media += _Votes(index)
  105.         Next
  106.         Media = Media / _Votes.Count
  107.         Return Media
  108.     End Function
  109.  
  110.     'membro che restituisce il valore della moda della materia
  111.     Public Shared Function ModaSubject(ByRef list As ArrayList) As Single
  112.         Dim moda_number As Single = 0 'numero di frequenza con cui appare la moda
  113.         Dim moda As Single 'valore della moda
  114.         Dim temp As Single 'valore temporaneo
  115.         For i As Int32 = 0 To list.Count - 1
  116.             temp = list(i)
  117.             Dim count As Int32 = 0
  118.             For e As Int32 = 0 To list.Count - 1
  119.                 If temp = list(e) Then
  120.                     count += 1
  121.                 End If
  122.  
  123.             Next
  124.             If count >= moda_number Then
  125.                 moda_number = count
  126.                 moda = temp
  127.             End If
  128.         Next
  129.         Return moda
  130.     End Function
  131.  
  132.     'proprietà che serve a restituire alla funzione GetTotalMedia()
  133.     'il valore totale delle medie create
  134.     Private Shared ReadOnly Property TotalMedia As Single
  135.         Get
  136.             Return _TotalMedia
  137.         End Get
  138.     End Property
  139.  
  140.     'membro shared che restituisce la media globale dei voti
  141.     Public Shared Function GetTotalMedia() As Single
  142.         Return TotalMedia / Subjectnumber
  143.     End Function
  144. End Class



Ditemi cosa potrei cambiare per migliorarla...

Grazie

Edit: ho cambiato la classe che c'era un bug sulla media totale

Ultima modifica effettuata da il 12/09/2012 alle 22:50
PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 14:36
Giovedì, 13/09/2012
Ciao.
Non male. Se però vuoi alcuni consigli..
1) L'uso che fai delle variabili shared non mi convince tanto. Sarebbe meglio creare una classe, che al suo interno ha solo le proprietà "nome materia" e una list di single per i voti. Quelli sono i veri dati di pertinenza della classe.
2) Le proprietà le imposterei come readonly.
3) Per creare l0oggetto materia, userei giustamente un metodo New ma staccato "dall'interfaccia" per raccogliere i dati, perchè quel gruppo di istruzioni non "riguarda la materia".
4) Immagazzinerei i vari oggetti Materia che l'utente inserisce, in una list di "Materie", così da rendere agevole il passaggio e il recupero dei dati. Meglio ancora: usa un dictionary di "String" e "Materie", così ha la key.
5) Ciliegina sulla torta: Linq per calcolare la media e la moda:
http://msmvps.com/blogs/deborahk/archive/2010/05/07/linq-m ...
Queste cose, con un po di esperienza e studio verranno naturali.
8-|
PS: Ma se invece di usare i programmi a console, non provi a usare un interfaccia grafica?


In attesa della fine del mondo, fissata per l'anno prossimo, sono alla ricerca di un notaio con cui fare testamento...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:56
Giovedì, 13/09/2012
Testo quotato

Postato originariamente da Renny:

Ciao.
Non male. Se però vuoi alcuni consigli..
1) L'uso che fai delle variabili shared non mi convince tanto. Sarebbe meglio creare una classe, che al suo interno ha solo le proprietà "nome materia" e una list di single per i voti. Quelli sono i veri dati di pertinenza della classe.
2) Le proprietà le imposterei come readonly.
3) Per creare l0oggetto materia, userei giustamente un metodo New ma staccato "dall'interfaccia" per raccogliere i dati, perchè quel gruppo di istruzioni non "riguarda la materia".
4) Immagazzinerei i vari oggetti Materia che l'utente inserisce, in una list di "Materie", così da rendere agevole il passaggio e il recupero dei dati. Meglio ancora: usa un dictionary di "String" e "Materie", così ha la key.
5) Ciliegina sulla torta: Linq per calcolare la media e la moda:
http://msmvps.com/blogs/deborahk/archive/2010/05/07/linq-m ...
Queste cose, con un po di esperienza e studio verranno naturali.
8-|
PS: Ma se invece di usare i programmi a console, non provi a usare un interfaccia grafica?



1) si, lo sò, ma l'esercizio che stò seguendo, sviluppato per seguire la guida di totem, mi costringe a calcolare moda e media tramite delle funzioni della classe, quindi per calcolare la media-globale, ho bisogno di una variabile shared che mi consenta di aumentarla con ogni nuova media di ogni oggetto, mentre per il numero di materie....volevo far stampare a vieo il numero massimo di materie immesse....anche se volendo mi basta fargli contare gli oggetti contenuti nella lista in cui li memorizzo
2)A parte getnames, che mi serve per impedire che inseriscano una stringa vuota e per poter prendere il nome della materia al difuori dell'oggetto, sono tutte readonly
3)Non ho capito O.O il nome della materia e i sui voti a mio parere riguardano eccome la materia...comunque non ho capito cosa intendi per staccato dall'interfaccia...dici di prenderli usando i membri fuori dalla procedura New?
4)Infatti io ho inserito in una lista (nel  SUbmain()) ogni oggetto creato  
5) Sinceramente Linq aspetti ad usarlo in quanto io seguo passo passo il mio manuale(dato che verranno spiegati piuù avanti) se no finisce che faccio solo confusione
6) Uso applicazioni console in quanto (anche se sarei già capace) aspetto che il mio manuale le spieghi in modo "giusto", così da poterle sfruttare al meglio

PM Quote
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Segnala al moderatore
Postato alle 9:24
Venerdì, 14/09/2012
Ciao.
Ho capito che stai seguendo il manuale di Totem, e fai bene perché anch'io ho imparato tanto da li. Però puoi anche sganciarti per quanto riguarda "i dettagli". Il bello della programmazione è che nella maggior parte dei casi esistono più soluzioni agli stessi problemi.
Il mio consiglio è di "staccare" le istruzioni per la raccolta dei voti dal metodo di istanziamento dell'oggetto. Le istruzioni della console andrebbero fuori, nella main. Quando l'utente ha inserito tutti i voti e il nome della materia, crei l'oggetto passando i dati come parametro. Perché una classe ben fatta è riutilizzabile: se tu vuoi usare quel codice ma invece di creare una app a console vuoi farne una GUI, quella classe non va più bene, la devi in parte rifare. Tu dici "tanto ci sto un attimo", è vero, ma se la classe fosse molto più lunga e complessa e invece di contenere 2 dati ne contenesse 20, e per ognuno hai inserito le istruzioni della console?
E' buona norma tenere separati i 2 piani. Figurati che nelle applicazioni più complesse i piani sono 3! 8-|
Buono studio.:k:


In attesa della fine del mondo, fissata per l'anno prossimo, sono alla ricerca di un notaio con cui fare testamento...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:55
Venerdì, 14/09/2012
ma infatti io le passo con delle property (Votes e SubjectNames)....quello che dici di fare è di togliere tutte le routine ad esempio dentro il costruttore New e di fare tutto scrivendo il codice nel main?

comunque guarda per un mio parere personale preferisco seguirla e dopo averla finita aggiungere i dettaggli in quanto conoscendomi, finire col fregandomene dei capitoli successivi, in quanto, facendoti un esempio banale, se io vedevo che riuscivo a risolvere vari problemi usando solamente il pardadigma procedurale...io conoscendomi me ne sarei fregato delle classi e mi sarei detto perchè studiarle quando sò già fare tutto....e purtroppo non va bene

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:00
Sabato, 15/09/2012
l'ho corretta così....può andare?
Codice sorgente - presumibilmente VB.NET

  1. Public Class Subjects
  2.     Private _SubjectNames As String 'campo contenente il nome delle materie
  3.     Private _Votes As New ArrayList 'lista coi voti della materia
  4.     Private Shared _SubjectNumber As Int32 'campo share con il numero delle materie create accessibili
  5.     Private Shared _TotalMedia As Single
  6.  
  7.  
  8.     'ad ogni creazione di un oggetto(che rappresenta le materie) aumento
  9.     'di uno il numero delle materie create
  10.     Public Sub New()
  11.  
  12.         Subjectnumber += 1
  13.         _TotalMedia += media
  14.     End Sub
  15.  
  16.     'imposto una proprietà che consenta di restituire il numero delle materie create
  17.     'al momento però viene utilizzato solamente per fare la media globale di conseguenza potrebbe
  18.     'essere tutto private, ma preferisco mantenerlo pubblico in caso lo voglia usare nel Sub Main()
  19.     'mentre la parte set è provata perchè voglio che venga modificata solo all'interno dei membri
  20.     'preposti a tale compito
  21.     Public Shared Property Subjectnumber() As Int32
  22.         Set(value As Int32)
  23.  
  24.             _SubjectNumber = value
  25.         End Set
  26.         Get
  27.             Return _SubjectNumber
  28.         End Get
  29.     End Property
  30.  
  31.     'proprietà che consente di ricavare il nome della materia e di ricavarne il nome
  32.     ' in caso le materie non ricevano una stringa, ma solamente una stringa vuota ""
  33.     'la proprietà le rinomina in automatico a seconda del numero delle materie create fino
  34.     'a questo momento
  35.     Public Property SubjectNames() As String
  36.         'set è privato in quanto solo il membro predisposto a tale compito
  37.         'può modificare il nome
  38.         Set(value As String)
  39.             If (value = "") Then
  40.                 _SubjectNames = Subjectnumber
  41.             Else
  42.                 _SubjectNames = value
  43.             End If
  44.  
  45.         End Set
  46.         Get
  47.             Return _SubjectNames
  48.         End Get
  49.     End Property
  50.    
  51.     'proprietà reference che mi consente puntare alla lista _votes
  52.     Public ReadOnly Property Votes As ArrayList
  53.         Get
  54.             Return _Votes
  55.         End Get
  56.     End Property
  57.  
  58.     Public ReadOnly Property media As Single
  59.  
  60.         Get
  61.             Return GetMedia()
  62.         End Get
  63.     End Property
  64.     'membro che calcola la media della materia
  65.     Private Function GetMedia() As Single
  66.         Dim Media As Single
  67.         For index As Int32 = 0 To _Votes.Count - 1
  68.             Media += _Votes(index)
  69.         Next
  70.         Media = Media / _Votes.Count
  71.         Return Media
  72.     End Function
  73.  
  74.     'membro che restituisce il valore della moda della materia
  75.     Public Shared Function ModaSubject(ByRef list As ArrayList) As Single
  76.         Dim moda_number As Single = 0 'numero di frequenza con cui appare la moda
  77.         Dim moda As Single 'valore della moda
  78.         Dim temp As Single 'valore temporaneo
  79.         For i As Int32 = 0 To list.Count - 1
  80.             temp = list(i)
  81.             Dim count As Int32 = 0
  82.             For e As Int32 = 0 To list.Count - 1
  83.                 If temp = list(e) Then
  84.                     count += 1
  85.                 End If
  86.  
  87.             Next
  88.             If count >= moda_number Then
  89.                 moda_number = count
  90.                 moda = temp
  91.             End If
  92.         Next
  93.         Return moda
  94.     End Function
  95.  
  96.     'proprietà che serve a restituire alla funzione GetTotalMedia()
  97.     'il valore totale delle medie create
  98.     Private Shared ReadOnly Property TotalMedia As Single
  99.         Get
  100.             Return _TotalMedia
  101.         End Get
  102.     End Property
  103.  
  104.     'membro shared che restituisce la media globale dei voti
  105.     Public Shared Function GetTotalMedia() As Single
  106.         Return TotalMedia / Subjectnumber
  107.     End Function
  108. End Class


PM Quote