-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
esempio di interfacce #1
Comments
questo e' un punto interessante! Perche' e' utile: type Extender interface { Quindi definiamo il nostro SetPath() e** copiamo i metodi AddAttribute(), example/mediomedio/medio.go:71: cannot use a (type advancedObject) as type L'errore ci indica chiaramente qual'e' il problema: advancedObject deve type Extender interface { avremmo avuto una visione piu' precisa di cosa dobbiamo implementare. Ti ho convinto? :) 2012/11/8 Petru [email protected]
|
con il commit 3c623c4 riceviamo questi errory:
bene .... come risolviamo? il prossimo: cosi come abbiamo aggiunto al Extender "advancedObject" possiamo aggiungerne tanti altri ... possiamo aggiungere uno che invece di essere salvato in formato A (per esempio json) dovrà essere salvato in fomato B ( binario ) ... a questo punto l'Extender dovrà fare embedding con un altra interfaccia ... ma se questi convertitori dovranno essere di più? a questo punto fare embedding con una nuova interfaccia, significa o aggiungere delle funzioni vuoti per gli altri oggetti per soddisfare l'Extender o avere un software che di nuovo non funziona. combinando la prima con la seconda: le interfacce vengono definite è documentate al interno del pacchetto importato. Alle funzioni usati in quel pacchetto li si passano dei oggetti che si implementano cosi che soddisfa la funzione chiamata.
basta non fare embedding del Extender con interno.Storer per risolvere l'altro problema:
dobbiamo cercare la documentazione della funzione Store() al interno del pacchetto "interno" e implementare advancedObject nella maniera giusta. Cosi l'Extender rimane intatto anche nel futuro e potrà essere implementato da qualsiasi "advancedObject" senza rompere la compatibilità ... e ogni advancedObject potrà usare la sua interfaccia con personale cosi come sarà descritto al interno dei moduli usati. vedi il commit 1f0c00f PS: questi commenti si vedono meglio su github, tramite email diventa illeggibile :( |
questo e' il punto fondamentale della stratificazione:
il compito di decidere come salvare questi dati e' di interno, ed e' definito dall'interfaccia Storer. Ovviamente la definizione dell'interfaccia si evolve nella prima fase dello sviluppo a mano a mano che nuove esigenze vengono fuori, ma a un certo punto l'interfaccia verra' bloccata.
sbagliato! Qual'e' la differenza tra ottenere il primo errore o il secondo?
Che cosa e' meglio?
questo conferma il mio punto meglio di tutto quello che ho scritto! :) |
e fin qua sono d'accordo
e anche qui sono d'accordo la mia idea in questo momento è lasciare Extender a cura di medio e Storer a cura di Interno senza mischiarli ... cosi come ognuno risponde del suo. Ma come dici la definizione dell'interfaccia si evolve nella prima fase dello sviluppo a mano a mano che nuove esigenze vengono fuori ... e di questa ne sono certo, ne sono certo che la esigenza ci obbligherà a vere delle scelte ulteriore.
questi errori non sono al inizio uno e poi l'altro ... sono tutti due contemporaneamente.
gli errori sono: eliminando l'embedding, eliminiamo il primo errore o come dici tu, lo nascondiamo.... ma più che nascondiamo è facciamo in modo che al esterno ritorniamo un puro Extender.
questo è vero soltanto se qualcuno ha pensato a scrivere una documentazione completa per l'Extender ... da sola la riga interno.Storer non dice tanto è per capire che qui serve ToStoreFromat() si deve comunque trovare Storer nel pacchetto interno e leggerne la struttura per poi implementarla nel advancedObject. ma comunque sono d'accordo che è più diretto.
in questo caso (se capisco bene ... senza embedding ) si parte dalla premessa che devi usare interno.Store (per salvare i dati) ma per usarlo devi andare a leggere la documentazione nel interno, per capire che tipo di dato li devi passare. E da li capisci che li devi passare un oggetto che implementa un interfaccia Storer. Trovi Storer e in base alla sua definizione crei il dato necessario da passare a store.
a me sembra che se la documentazione sarà scritta per bene, allora il primo va più che bene, ma se la documentazione sarà scarsa meglio usare il secondo passaggio, è più lungo ma anche più dettagliato. |
scusami avevo chiuso per sbaglio :) |
in questa posizione la funzione interno.Store() non ha niente collegato con il embedding dell'interfaccia interno.Storer in interfaccia Extender perché viene direttamente chiamata dal pacchetto "interno".
lo stesso embedding (Storer in Extender) può essere ignorato totalmente.
l'utilizzo dell'interfaccia Storer avviene nel modulo "interno", l'interfaccia stessa viene definita qui e la funzione Store ha come input un dato di tipo Storer. A questo punto, go non accerterà che alla funzione Store li sia passato un dato che non implementa questa interfaccia.
Quando nel pacchetto "medio" viene chiamata la funzione interno.Store(o) go verificherà se l'oggetto "o" implementa l'interfaccia interno.Storer cioè, verificherà se "o" ha implementata la funzione "ToStoreFormat() string" e questa accade qui. Quindi, la funzione interno.Store(o) viene soddisfatta al interno del pacchetto "interno" con la condizione che l'oggetto passato può esse usato come Storer. Risulta che l'embedding al interno del pacchetto "medio" non è necessario questo si può verificare tramite il commit 6a71769
The text was updated successfully, but these errors were encountered: