|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Perche' per rendere qualcosa riutilizzabile devi renderlo piu' generico, e rendere qualcosa piu' generico vuol dire sempre introdurre piu' complessita', e piu' complessita' vuol dire costi maggiori di manutenzione. Ricorda che ogni singola riga di codice che scrivi e' una riga di codice che in futuro dovrai mantenere. Magari se scrivi qualche migliaia di righe di codice non cambia molto, ma se ne scrivi centinaia di migliaia in una code base di milioni di righe di codice, vedi che i costi di manutenzione diventano enormi. E inizi a togliere codice ovunque puoi.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#22 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Inoltre, uno degli scopi che stavo cercando di prefiggermi era anche perdere meno tempo in un altro senso:
Quello che trovo più noioso ogni volta è dover disegnare textbox e label sui form per l'interfacciamento con il database. Stavo cercando di realizzare qualcosa che mi permettesse di recuperare i nomi delle colonne dalla tabella del database e fare in modo di disegnare automaticamente tante caselle di testo per quante colonne ci sono nella tabella. Questo, credo, mi farebbe davvero risparmiare una cifra di tempo. Tutto ciò in linea teorica...
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#23 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
@isAlreadyInUse:
Ho appena scaricato il tuo esempio. Lo guardo e ti dico. Nel frattempo grazie mille anche a te Situation....: Ho capito l'esempio fornitomi da ReaToMe, almeno per quanto riguarda gli eventi relativi al Form in cui viene caricato il menu. Ora ho un altro problema: Prendiamo il bottone "Nuovo" e immaginiamo questa situazione: Sul form c'è un groupbox che contiene diversi oggetti come textbox, combobox etc... che per default all'avvio (load) del form sono disabilitati. Il tasto "Nuovo" dovrebbe limitarsi a predisporre l'inserimento dei dati, quindi, abilitarmi tutti gli oggetti presenti nel groupbox. Fino a ieri, io usavo qualcosa del genere: Codice:
public void EnableUserInput(Control c)
{
foreach(Control cc in c.Controls)
{
if(cc is GroupBox)
{
GroupBox gp = cc as GroupBox;
gp.Enabled = true;
}
}
}
Codice:
//procedura presente nell'evento click del bottone "Nuovo"
private void ButtonNew_Click(object sender, EventArgs e)
{
EnableUserInput(myGroupBox);
}
Codice:
void NewMenuItem_Click(object sender, EventArgs e)
{
//qui dovrei prima identificare se c'è un groupbox in "MyContainer"
//ho provato così:
foreach(Control c in MyContainer.Controls)
{
if(c is GroupBox)
{
GroupBox gp = c as GroupBox;
gp.Enabled = true;
}
}
}
Grazie ancora per l'aiuto RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#24 | |
|
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Quote:
Il riuso del codice fatto bene nasce da una buona aggregazione delle responsabilità e dalla creazione di classi coese. Che fino a prova contraria sono tra le basi della buona OOP. Se per la gestione degli eventi usi il Command Pattern adeguatamente, ti ritrovi ad avere un menu di base che copre buona parte dei casi standard. Eventuali comportamenti 'fuori standard' verranno gestiti con un numero eguale di Command. Niente di complicato, e in un progetto con <n> form che usano un menu così fatto, ti sei tolto di torno (<n>-1)+<righe di codice del menu>. In una parola? Modularità. |
|
|
|
|
|
|
#25 | |
|
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Quote:
Hai aggiunto l'handler? Codice:
this.AddNewButton("NewMenuItem", "&Nuovo", NewMenuItem_Click);
|
|
|
|
|
|
|
#26 | |||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
E' provato che scrivere software riutilizzabile costa il 30% in piu' e quel costo raramente, in pratica, viene amortizzato. Quote:
La teoria che insegnano all'Universita' va molto bene per qualche progettino di piccole dimensioni, ma quando ti ritrovi a lavorare con code base di milioni di righe di codice, come ho detto, ti accorgi che forse e' molto meglio smettere di overingegnerizzare ed e' molto meglio iniziare a scrivere codice semplice e facile da mantenere. Perche' nove volte su dieci You Ain't Gonna Need It. C'e' sempre tempo per rifattorizzare e estrarre dalla code base codice piu' generico che puo' essere riutilizzato. Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 15-01-2008 alle 17:37. |
|||
|
|
|
|
|
#27 | ||||
|
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Quote:
Quote:
Per questi casi c'è una stupidata dell'OOP chiamata ereditarietà... Quote:
C'è un limite ben delineato tra ingegnerizzazione e overingegnerizzare. Sicuramente overingegnerizzare non è sinonimo di riusabilità. Quote:
Troppe. 4 volte la mia. Il codice riusabile (se scritto bene) tra i tanti pregi ne ha tre enormi: 1) Riduce il numero di Code-Line. 2) Localizza le responsabilità e rende le classi coese. 3) Evita la rindondanza. Se poi questo per te può essere causa di overhead nella manutenzione... PS Non mi ricordo manco come è fatta un'università |
||||
|
|
|
|
|
#28 | ||||||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quote:
Ma chi ha parlato di ridondanza e duplicazione? La duplicazione va eliminata al volo, appena si presenta, "Don't Repeate Yourself". Quote:
Quote:
Quote:
Quote:
Hai mai avuto a che fare con code base di qualche milione di righe di codice? La mia lotta contro la sovraingegnerizzazione del codice non avra' mai fine... Keep It Simple, Silly
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 15-01-2008 alle 18:41. |
||||||
|
|
|
|
|
#29 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Mai letti così tanti ossimori in una volta.
|
|
|
|
|
|
#30 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Mostrameli. E spiega il perche' sarebbero ossimori. Ti assicuro che e' molto piu' probabile che ti stia sfuggendo qualche passaggio del mio discorso.
Anzi, apri un bel topic sulla riusabilita' del codice e ti spiego li' per filo e per segno perche' scrivere per riutilzzare il codice (e non il riutilizzo di codice di per se') non e' una buona idea.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 15-01-2008 alle 19:01. |
|
|
|
|
|
#31 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2782
|
@Raoul: mi sembra che per fare quello che vorresti fare (piazzare i controlli in base alle colonne che hai nelle tabelle del db) c'è un modo semplice di farlo con l'IDE, io almeno l'avevo fatto con VB (sempre il .NET) quindi immagino si possa fare anche in C#, ora però non saprei dirti di più ma sicuramente su internet trovi qualcosa al riguardo...
|
|
|
|
|
|
#32 | |
|
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Quote:
Ho espresso la mia opinione, nuda e cruda. Per quanto mi riguarda quel che dici fa' a pugni con la mia esperienza lavorativa. Avere una archittettura semplice e allo stesso tempo riusabile per me non è assolutamente difficile. Semplicemente è la mia realtà quotidiana. E non ho bisogno di fare un lavoro di affinamento successivo (che ha un costo) per ottenere classi, sottosistemi o sistemi riusabili. Ho avuto a che fare con progetti di svariate dimensioni. Ed ho sempre applicato queste regole. Non credo che l'ereditarietà sia superiore alla composizione o viceversa, vanno a braccetto. La complessità di certe soluzioni riusabili nasce non tanto dalle linee di codice, ma tanto dal maggior livello di collaborazione che si instaura tra gli oggetti, che viene ripagata da una maggiore area di copertura del dominio. Rindondanza e complessità non sono collegabili. Sviluppare senza un occhio alla riusabilità porta ad avere parti di codice ripetute. E questa è rindondanza. Che comporta per una singola modifica, n interventi pressochè identici. Rendere una classe riusabile non significa renderla meno coesa. Ammesso che uno non ci infili tutto quello che gli passa per la testa. Ti sembra che la classe postata prima sia poco coesa? Eppure è riusabile. C'è chi la complessità la spalma nella classe, e chi la gestisce facendo collaborare le classi tra loro. O se preferisci OOP. |
|
|
|
|
|
|
#33 | ||||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Se e' davvero cosi', ti prego, spiegami come fai, scriviamo un libro e ci facciamo i milioni. Perche' non c'e' riuscito ancora nessuno al mondo Avere un'architettura semplice e riusabile e' impossibile, sono due obiettivi che remano uno contro l'altro per definizione di "riusabilita'", ovvero qualcosa che puo' essere riusato in progetti diversi con finalita' diverse, ovvero generico. La genericita' ha sempre un costo in termini di complessita'. Quote:
Quote:
Quote:
PS. Citi spesso l'OOP, ma ti assicuro che "Prefer Composition Over Inheritance" e' uno dei concetti base della programmazione orientata ad oggetti (cfr Design Patterns, Gang Of Four). Apri un topic, continuiamo li'.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||||
|
|
|
|
|
#34 | |
|
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Quote:
|
|
|
|
|
|
|
#35 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#36 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Non sei il solo.
Per dovere di cronaca il titolo completo è "Design Patterns: Elements of Reusable Object-Oriented Software" |
|
|
|
|
|
#37 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Se tu avessi compreso il libro, non avresti fatto questa sterile puntualizzazione, perche' sapresti che da nessuna parte la Gang Of Four afferma che il codice deve essere scritto riutilizzabile, ma presenta design che possono essere riutilizzati nella progettazione del software. Sono due concetti estremamente differenti. Infatti e' profondamente sbagliato pensare di "programmare a design pattern". Tanto e' vero che i design pattern oggi sono usati come uno strumento di documentazione e descrizione del codice, e non piu' come uno strumento di design. Ora, puoi mostrarmi dove sarebbero i miei ossimori e puoi rispondere alle numerose puntalizzazioni che ho fatto? O pensi ancora che Ereditarieta' e Composizione siano sullo stesso piano? Mi porteresti anche questi numerosi esempi contrari al mio che mostra come scrivere codice riutilizzabile sia piu' costoso? Ti ringrazio.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 16-01-2008 alle 00:49. |
|
|
|
|
|
|
#38 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Ti basterebbe leggere con attenzione il paragrafo seguente all'enunciazione del principio che hai citato sopra.
Vuoi dire che tu sviluppi senza handler, listener, command, decorator, factory o singleton? E che non scrivi sempre con una struttura similare? E che non hai mai consolidato una soluzione per un problema che ti si ripresenta sistematicamente? Hai le tue convinzioni, ed evidentemente portano frutto al tuo lavoro. Io ho le mie e come tu con le tue, me le tengo strette. |
|
|
|
|
|
#39 | |||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quote:
Io non sono contro il riutilizzo del codice (l'esatto contrario). Io non sono contro i Design Pattern (al contrario, un programmatore che non li recita a memoria per me non andrebbe neppure assunto). Io sono contro la sovraingegnerizzazione e la scrittura del codice con lo scopo di riutilizzarlo, perche' sono pratiche di sviluppo inadeguate e inefficienti. Quote:
Io seguivo cio' che tu stai predicando qui dieci anni fa. Poi mi sono trovato di fronte a code base di milioni di righe di codice, lavorando con cinquanta ingegneri, per fortuna non ho avuto la presunzione di tenermi strette le mie convinzioni di allora, ed ho imparato a programmare finalmente e la mia produttivita' e' aumentata. PS. Si', sviluppo sempre senza Singleton
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 16-01-2008 alle 01:20. |
|||
|
|
|
|
|
#40 | |
|
Member
Iscritto dal: Nov 2007
Messaggi: 274
|
Quote:
Quali costi sono stati presi in considerazione? Con quali processi di sviluppo? Prova a scrivere su google "oo reusability cost study" Se mi scrivi questo io penso che tu non gli usi... Ultima modifica di ReaToMe : 16-01-2008 alle 01:41. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:20.




















