Newsgroup: it.comp.lang.visual-basic
Titolo: Shared Factory Method - esercizio da libro

Ciao a tutti.
Sto leggendo il libro "Object-Oriented Programming with Visual
Basic.NET" di Michael McMillan
 
Nel capitolo dedicato al Design Patterns and Refactoring c'è un
esempio dedicato allo Shared Factory Method che non riesco a far
funzionare
il codice è questo:
 
Module mSharedFactoryMethod
    Sub main()
        Dim today As DateType
        today = DateType.valueOf(today)
        today.Display()
        Console.Read()
    End Sub
    Public Class DateType
        Private day As Integer
        Private month As Integer
        Private year As Integer
 
        Private Sub New()
            day = 0
            month = 0
            year = 0
        End Sub
 
        Public Shared Function valueOf(d As DateType) As DateType
            d.day = Now.Day
            d.month = Now.Month
            d.year = Now.Year
            Return d
        End Function
        Public Sub Display()
            Console.WriteLine(day & "/" & month & "/" & year)
        End Sub
    End Class
End Module
 
 
Quando lofaccio eseguire mi da' un errore sulla riga dove tenta di
instanziare d.day = Now.Day
l'errore è 
System.NullReferenceException was unhandled
  Message=Object reference not set to an instance of an object.
 
 
Se io modifico il codice cambiando Private Sub New in Public Sub New
e istanziando con Dim today As New DateType il codice funziona ma non
vorrei aver snaturato lo spirito del codice. 
Module mSharedFactoryMethod
    Sub main()
        Dim today As New DateType
        today = DateType.valueOf(today)
        today.Display()
        Console.Read()
    End Sub
    Public Class DateType
        Private day As Integer
        Private month As Integer
        Private year As Integer
 
        Public Sub New()
            day = 0
            month = 0
            year = 0
        End Sub
 
        Public Shared Function valueOf(d As DateType) As DateType
            d.day = Now.Day
            d.month = Now.Month
            d.year = Now.Year
            Return d
        End Function
        Public Sub Display()
            Console.WriteLine(day & "/" & month & "/" & year)
        End Sub
    End Class
End Module
 
Che ne dite?
grazie a tutti
ciao
 

Ciao Simona,
l'eccezione che ti viene alzata e' abbastanza eloquente, e ti dice che stai 
chiamando metodi o lavorando su proprieta' di un oggetto il cui valore e' 
Nothing.
Nel tuo caso specifico, nella sub Main, stai dichiarando una variabile di 
tipo DateType (la variabile today), poi passi questa variabile (che 
attualmente e' Nothing) alla funzione valueOf; questa funzione dovrebbe 
assegnare alla proprieta' day del tuo oggetto DateType (quello che avevi 
chiamato today e che viene invece passato come argomento d) cio' che viene 
restituito da Now.Day. Dato pero' che today (e quindi d) e' Nothing, cioe' 
non esiste un oggetto "reale", non e' possibile impostarne le proprieta'.
Probabilmente manca, dopo la definizione della variabile today, una 
assegnazione di un oggetto a questa variabile, presumibilmente istanziando 
un nuovo oggetto di tipo DateType.
Una cosa tipo:
Dim today As DateType
today = New DateType
 
 
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 8054 (20130226) __________
 
Il messaggio � stato controllato da ESET NOD32 Antivirus.
 
www.nod32.it
 
 
 
 


Ciao vbMizio
ho letto quanto scritto ma come già ho provato io assegnare un nuovo
oggettp a DateType significa dichiarare pubblica la sub New, cosa che
va in conflitto con quanto dice l'autore e più precisamente:
 
The key to the Shared Factory pattern is to make the constructor
method Private.
A Private constructor method makes it impossible for client code to
instantiate an object of the class".
 
L'unica modifica che mi pare valida lasciando inalterato il resto del
codice, e quindi anche la sub new private è aggiungere la riga
d = New DateType alla function valueOf che diventa
 Public Shared Function valueOf(d As DateType) As DateType
            d = New DateType


va in conflitto con quanto dice l'autore [...]
...
Beh,  il discorso cambia poco.
Io non avevo capito che non volessi dare la possibilita' di istanziare un 
oggetto "dall'esterno", pero' il discorso non cambia... qualcuno un nuovo 
oggetto lo devo istanziare, quindi se non vuoi farlo fare da fuori la 
classe, l'unico modo e' mettere a disposizione un metodo, shared, della 
classe che istanzi un oggetto e lo restituisca.
In questa ottica, mi sembra corretto cio' che hai aggiunto tu, e cioe'
d = New DateType
Certo che questo particolare esempio pero' non mi sembra strutturato in 
maniera particolarmente felice... che senso ha passare un oggetto di tipo 
DateType come argomento, ad una funzione che come prima cosa assegna alla 
variabile che rappresenta l'argomento, un nuovo oggetto?
Boh. 
 
 
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 8056 (20130227) __________
 
Il messaggio � stato controllato da ESET NOD32 Antivirus.
 
www.nod32.it
 
 
 
 

Boh. 
 confermo il boh.
 
ma come avevo già scritto era solo un esempio di un libro
 
ciao
 

ma come avevo già scritto era solo un esempio di un libro
...
Ed io non ce l'avevo mica con te :)
Quell'esempio mi sembra scritto in maniera discutibile, tutto qui :)
Me la sto prendendo con l'autore del libro :)
 
 
 
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 8060 (20130228) __________
 
Il messaggio è stato controllato da ESET NOD32 Antivirus.
 
www.nod32.it
 
 
 
 


ok ..... :)