Stai usando un browser non aggiornato. Potresti non visualizzare correttamente questo o altri siti web. Dovreste aggiornare o usare un browser alternativo.
PROBLEMA[Ingegneria Informatica - UML] come rispettare il basso accopiamento tra classi
Se avete una struttura del genere:
- scheda
- liste
- gruppi
scheda che dentro ha liste e ciascuna lista ha dentro gruppi. Come si fa a far rispettare il basso accoppiamento(low coupling) in questa composizione tra classi? in particolare il livello da scheda a gruppi di una lista di una scheda.
vorrei in pratica che la distanza tra una classe e un'altra si sempre 1.
se implemento una classe Scheda che instanzia Liste che instanzia Gruppi la distanza tra classe Gruppi che vuole l'id della scheda e l'id della lista è di 2 cioè passa per Liste, e questo non va bene nella buona ing. del software.
Dovrei usare la pura invezione (pure fabrication) ma nella pratica non so come fare.
Il basso accoppiamento va evitato quando è possibile evitarlo, avere per esempio una distanza pari a due non vuole necessariamente dire che il progetto sia sbagliato. La cosa da evitare è che le classi istanziate abbiano conoscenza delle classi che le hanno create, quello è veramente una cattiva progettazione che causa problemi di referenza circolare e cattivo codice.
Il basso accoppiamento va evitato quando è possibile evitarlo, avere per esempio una distanza pari a due non vuole necessariamente dire che il progetto sia sbagliato. La cosa da evitare è che le classi istanziate abbiano conoscenza delle classi che le hanno create, quello è veramente una cattiva progettazione che causa problemi di referenza circolare e cattivo codice.
Non mi da punti nel compito se non rispetto il basso accoppiamento.
Pensavo di risolvere il problema con pattern Adapter.
In pratica creo un adattatore o wrapper per contenere la classe lista e gruppo cosi quando devo configurare il gruppo della lista di una scheda elettorale evito di fare lunghe chiamate del tipo card.getLists().at(5).getGroups().at(2)
Cioe vorrei disaccopiare il fatto che gruppo è dentro in gruppi che dentro in lista che è dentro in liste che fa parte di una scheda
Non mi da punti nel compito se non rispetto il basso accoppiamento.
Pensavo di risolvere il problema con pattern Adapter.
In pratica creo un adattatore o wrapper per contenere la classe lista e gruppo cosi quando devo configurare il gruppo della lista di una scheda elettorale evito di fare lunghe chiamate del tipo card.getLists().at(5).getGroups().at(2)
Cioe vorrei disaccopiare il fatto che gruppo è dentro in gruppi che dentro in lista che è dentro in liste che fa parte di una scheda
Puoi usare il principio di dipendenza inversa, o in base al contesto, puoi provare a vedere quale ti si addice: Facade,Chain of Responsibility etc. Provato a googlare un po'?
L'obiettivo è riuscire a non avere una classe Sistema che faccia tutto.
Dunque spiego brevemente i requisiti:
- ho un certo numero di schede
- in base al tipo di elezione (parlamentare, comunali) gli amministratori configurano le schede
- Stabilito il tipo di scheda, all'apertura del seggio, le schede vuote vanno consegnate all'elettore cosi ha la possibilità di votare il candidato uninominale e un gruppo oppure votare un gruppo esprimendo le preferenze sul gruppo
Cosi si puo capire viene logico pensare che la configurazione di una scheda sia fatta da
scheda elettorale: liste: candidato uninominale e gruppi
Come posso evitare una cosa del genere
candidato uninominale = cards().at(4).getLists().at(5).getCandidateUninomial()
candidato del gruppo = cards(2).getLists().at(5).getGroups().at(2).getCandidate()
L'obiettivo è riuscire a non avere una classe Sistema che faccia tutto.
Dunque spiego brevemente i requisiti:
- ho un certo numero di schede
- in base al tipo di elezione (parlamentare, comunali) gli amministratori configurano le schede
- Stabilito il tipo di scheda, all'apertura del seggio, le schede vuote vanno consegnate all'elettore cosi ha la possibilità di votare il candidato uninominale e un gruppo oppure votare un gruppo esprimendo le preferenze sul gruppo
Cosi si puo capire viene logico pensare che la configurazione di una scheda sia fatta da
scheda elettorale: liste: candidato uninominale e gruppi
Come posso evitare una cosa del genere
candidato uninominale = cards().at(4).getLists().at(5).getCandidateUninomial()
candidato del gruppo = cards(2).getLists().at(5).getGroups().at(2).getCandidate()
Se ho capito bene puoi usare il command pattern, in quel modo potresti riuscire ad eseguire più "comandi" attraverso un interfaccia da implementare nelle classi. Per quanto riguarda le schede usi un template con hook method
‘Engineer’: someone who makes precise guesswork based on unreliable data.
Dal post originale era impossibile capire che si trattasse di schede “elettorali” e anche adesso non si capisce cosa siano “liste” e “gruppi”.
Decidere quale sia il migliore “design pattern” da usare è impossibile se non si hanno le idee chiare sul problema.
Invece gli hook o pattern publisher subscriber lo devo ancora valutare.
Perchè dovrei notificare a qualcuno che io oggetto sto cambiando delle proprietà?
Se gruppo viene eliminato in effetti potrei notifiche a liste di gruppi che quel gruppo della specifica lista non appartiene piu. Ma perchè tenermi tutto negli oggetti quando le informazioni posso recuperarle da mysql ogni volta che mi servono? cosi per forza gli oggetti sarebbero tutti separati.
Ma se disegno il diagramma delle classi le relazioni esistono e quindi devo avere un riscontro nella programmazione java.
Io posto il testo del problema ma non vorrei che fosse "trovato" dalla profe.
Si progetti un sistema di voto e scrutinio elettronico. Il sistema deve essere generico e prevedere
diverse modalità di voto e di definizione del vincitore.
Per quanto riguarda le modalità di voto, quelle da supportare sono:
• voto ordinale: all’elettore è richiesto di ordinare i candidati (o gruppi/partiti) presenti nella
scheda in base alle proprie preferenze.
• voto categorico: l’elettore inserisce una preferenza per un candidato (o gruppo/partito).
• voto categorico con preferenze: l’elettore inserisce una preferenza per un gruppo/partito
e ha la possibilità di indicare una o più preferenze tra i candidati del gruppo/partito
selezionato (niente voto disgiunto).
• referendum: consiste in una domanda fatta all’elettorato con la quale si chiede se si sia
favorevoli o contrari a un determinato quesito.
Per quanto riguarda i possibili modi per definire il vincitore della procedura di voto, l’insieme
minimo da considerare comprende:
• maggioranza: il vincitore è il candidato che ha ottenuto il maggior numero di voti.
• maggioranza assoluta: il vincitore è il candidato che ha ottenuto la maggioranza assoluta
dei voti, cioè il 50% + 1 dei voti espressi.
• referendum senza quorum: si procede al conteggio dei voti indipendentemente se abbia
partecipato o meno alla consultazione la maggioranza degli aventi diritto al voto.
• referendum con quorum: si procede al conteggio dei voti espressi solo nel caso in cui abbia
partecipato alla consultazione la maggioranza degli aventi diritto al voto.
I voti devono poter venire espressi di persona in un seggio elettorale dopo che si è svolta la fase di
riconoscimento dell’identità del votante e della verifica del suo diritto al voto (che si assume
avvengano manualmente), oppure a distanza (in questo caso, la fase di identificazione e verifica
del diritto di voto vengono effettuati dal sistema da implementare).
Vanno considerate due tipologie di utente: l’elettore e l’impiegato/gestore del sistema che deve
poter configurare una sessione di voto, specificando le modalità di voto e di calcolo del vincitore,
inserire le liste dei candidati, far partire la fase di scrutinio e visualizzare l’esito del voto.
Alcuni dei requisiti essenziali che il sistema deve prevedere sono:
• il voto espresso deve rimanere segreto e non deve essere riconducibile all’elettore;
• ogni elettore può votare una volta sola;
• per ogni scheda è ammesso un solo voto valido o l’esercizio della facoltà di astenersi dalla
scelta (scheda bianca);
• il conteggio dei voti elettronici si può attivare solo dopo la chiusura di tutte le operazioni di
voto.
L' amministratore tra tutti i compiti ha anche quello di creare tramite il configuratore la scheda o piu schede elettorale (di tipo voto per parlamento e voto comunale o referendum). Metti che ho configurato il gruppo "partito democratico" della lista 1 della scheda 1, se l'utente rivede le informazioni di lista 1, io rileggo tutti i gruppi da database e mostro i gruppi.
Ma che architettura èèè? fare solo chiamate a mysql e aggiornare la finestra javafx. Ho l'obbligo di usare i design pattern e le buone regole della programmazione, altrimenti non mi da punti. (non posso usare solo mvc)
Pero' l'unico pattern che non abbiamo studiato è quello che si usa di piu specialmente in spring boot. Penso sia quello che serve a me. Si puo dire
Che cos'è l'iniezione di dipendenza in Core MVC?
L'iniezione di dipendenza è il modello di progettazione che ci aiuta a creare applicazioni che sono liberamente accoppiate. Ciò significa che l'oggetto dovrebbe avere solo le dipendenze richieste durante l'intera attività. Con questo tipo di inserimento delle dipendenze, la dipendenza diventa una proprietà pubblica anziché il costruttore.
Creare le dipendenze nel corpo dei metodi non è sbagliato di per sé. Può andare bene per piccoli progetti, in ambiente di Testing ed altre situazioni limitate.
Componenti fortemente accoppiati determinano infatti un forte impatto in termini di manutenzione/modifica del
codice, ed è quindi sempre preferibile limitare al minimo questo tipo di dipendenze.
L'Inversion Of Control o più in generale l'uso di interfacce, ha fornito una modalità di disaccoppiare le classi molto utilizzata, che garantise un loose-coupling piuttosto evidente.
Purtroppo però il disaccoppiamento non è totale!
PS
Ho solo questo esame poi la tesi da dare e finalmente divento dott ma...lasciamo perdere i salti che ho fatto, sono un pessimo informatico a dire il vero, credevo di essere un buon programmatore ma usare i pattern per fare una architettura non è uguale a saper programmare.
Esatto.
C'e' differenza tra 'programmatore' e 'ingegnere informatico', bella grossa. Sapere usare i design pattern e' solo un esempio. Senza ovviamente togliere nulla ai programmatori, i buoni programmatori sono difficili da trovare quanto i buoni ingegneri.
Ma non ti demoralizzare, la università ti insegna solo i concetti, quali siano questi "pattern" (che poi occorre trovare un buon insegnante, ma lasciamo perdere) in quali casi vanno usati (in generale) e qualche esempio, ma poi la bravura di un ingegnere e' di sapere applicare i concetti ai casi reali, che sono poi sempre diverse da quelli usati come esempio a scuola, e' qualcosa di cui si diventa bravi facendo esperienza.
E poi non esiste mai una unica soluzione. Per esempio io lavoro da più di trenta anni, attualmente sono in una azienda con un gruppo di una decina di colleghi molto bravi, abbiamo riunioni di ore e ore per discutere il problema, trovare la soluzione e poi quali sia la tecnica (o le tecniche) migliori per implementare tale soluzione, e non sempre siamo in accordo perche' ognuno vede il problema in base alla propria esperienza.
Conta di piu essere ingegneri a mio avviso.
Conoscere bene la realtà è un mio problema.
Come puoi pensare di fare un gestionale se non conosci i concetti di scorte, spedizioni, ordini? faccio fatica a trovare sui libri chi me li spiega. Ma con colma riuscirò a trovare gente disposta a insegnarmi le basi operative.
Altro paio di maniche è la soluzione implementativa non sempre specchia il dominio applicativo. Volere creare un piccolo cloud come AWS ad esempio è difficile ma perchè non hai conoscenza dei problemi per cui è nato AWS, e padroneggiare gli strumenti.
in poche parole sapere delle classi, ereditarietà, poliformismo in generale usare gli strumenti non basta
Ps venendo a noi
delegare tutto la resposabilità ad un container per iniettare le dipendenze
ok, continuo su questa strada ma non abbiamo fatto IOC e DI, comunque dovro vedere se è possibile implementarlo con pattern quali Adapter,Factory,Singleton
ma se queste sono a CASCATA? da candidato del gruppo a una scheda.
Devo capire come un Utente passa a Candidato tramite il metodo "nominate()"
Del candidato dovro' sapere
nome, cognome, codice fiscale etc (la generalizzazione è utente)
chi altri lo ha votato
di che gruppo appartiene
passando gruppo a Candidato, voglio sapere da candidato le informazioni di Scheda...
devo di nuovo ripercorre tutto da db
getList(groupId)
getCard(listId)
non è una architettura software sono chiamate annidate....
Mi serve evitare la composizione o aggregazione nel diagramma delle classi
Cosi affermo che la composizione o l'aggregazione è una cattiva programmazione per certi versi.
Conta di piu essere ingegneri a mio avviso.
Conoscere bene la realtà è un mio problema.
Come puoi pensare di fare un gestionale se non conosci i concetti di scorte, spedizioni, ordini? faccio fatica a trovare sui libri chi me li spiega. Ma con colma riuscirò a trovare gente disposta a insegnarmi le basi operative.
sono due professioni diverse, diciamo che un buon ingegnere sa anche programmare, ma e' possibile trovare buoni ingegneri che sono pessimi programmatori. Sarebbe come dire vale di più' un architetto o un muratore? Uno non fa nulla senza l'altro, ovvio si hanno responsabilità diverse.
Riguardo al gestionale, quello e' solo un esempio.
Un programmatore non deve saperne nulla, a differenza di un ingegnere che invece deve fare la progettazione del software. Per fare una buona progettazione bisogna capire a fondo il problema, per fare quello bisogna avere conoscenze che vanno al di fuori del nostro campo (ingegneria), e a volte per avere quelle conoscenze non basta studiare, occorre farle "sul campo".
Per questo in altre paesi (come in USA dove vivo io) la figura del "software engineer" e' solo un "ombrello" che copre una varietà di specializzazioni. Usciti freschi da scuola si e' assunti con il titolo di "junior", e si e' in genere in una posizione "full stack" (ossia generalista). Con il passare del tempo si impara e ci si specializza in certi settori. Nessuno pensa che una persona fresca da college possa scrivere da zero un software gestionale. Con il tempo si perde il titolo di Junior, poi se si e' bravi si fa carriera, si diventa "senior", "principal" e via dicendo, si assumono più responsabilità, si può diventare "project manager" (ossia responsabile di progetto) e poi "division manager" (se si vuole, ma richiede capacita' che vanno ben oltre quello che si studia a scuola di ingegneria). Alcuni (come il sottoscritto, che ha lavorato solo come project manager e ha un titolo lungo come una casa) preferiscono non diventare affatto manager e rimanere nel campo prettamente ingegneristico e assumere titoli altisonanti come per esempio "software architect". Ma questi sono mosche bianche, e sono altamente ricercati in grosse aziende.
partiamo dal presupposto che non ha senso creare un cloud come aws, quelli sono servizi gestiti da multinazionali che hanno soldi e soldi e tecnici sotto a lavorare per ottenere cio che vogliono vendere (e te lo dice uno che fa l'head of devs nell'azienda) e usiamo tutte le tecnologie aws(da sns, a s3, a rds, ad elasticbeanstalk e cosi via discorrendo).
Quello che abbiamo imparato ad usare dato che è stata anche una mia decisione è fare per i progetti grossi (abbiamo un cliente nell'edilizia e uno di trasporti navali etc) usare tecnologie come react per il front-end e per il back-end usiamo tecnologie lambda, tipo API in QUARCUS e Java.
Io ho 30 anni, 31 ad ottobre, ho fatto informatica, ho fatto la gavetta, l'esame di algoritmi l'ho ripetuto 10 volte prima di laurearmi (era il mio scoglio duro) ma il mondo lavorativo è diverso.
Ho lavorato con persone che mi hanno formato (quindi non demoralizzarti) serve esperienza.
L'università che sia Informatica o Ingegneria Informatica serve a formarti, a darti i concetti per programmare e sapere come e cosa studiare bene x imparare.
Programmare lo puo' fare chiunque anche i cani.
Noi abbiamo dovuto cestinare di progetti di persone poi licenziate per lavori fatti malissimo, milioni di righe di codice, pattern usati male etc etc.
Detto questo appena ho 5 minuti di tempo leggo la traccia, e vedo di darti qualche dritta, ma essendo Head of Dev purtroppo mi sto portando anche tanto lavoro a casa
partiamo dal presupposto che non ha senso creare un cloud come aws, quelli sono servizi gestiti da multinazionali che hanno soldi e soldi e tecnici sotto a lavorare per ottenere cio che vogliono vendere (e te lo dice uno che fa l'head of devs nell'azienda) e usiamo tutte le tecnologie aws(da sns, a s3, a rds, ad elasticbeanstalk e cosi via discorrendo).
Quello che abbiamo imparato ad usare dato che è stata anche una mia decisione è fare per i progetti grossi (abbiamo un cliente nell'edilizia e uno di trasporti navali etc) usare tecnologie come react per il front-end e per il back-end usiamo tecnologie lambda, tipo API in QUARCUS e Java.
Io ho 30 anni, 31 ad ottobre, ho fatto informatica, ho fatto la gavetta, l'esame di algoritmi l'ho ripetuto 10 volte prima di laurearmi (era il mio scoglio duro) ma il mondo lavorativo è diverso.
Ho lavorato con persone che mi hanno formato (quindi non demoralizzarti) serve esperienza.
L'università che sia Informatica o Ingegneria Informatica serve a formarti, a darti i concetti per programmare e sapere come e cosa studiare bene x imparare.
Programmare lo puo' fare chiunque anche i cani.
Noi abbiamo dovuto cestinare di progetti di persone poi licenziate per lavori fatti malissimo, milioni di righe di codice, pattern usati male etc etc.
Detto questo appena ho 5 minuti di tempo leggo la traccia, e vedo di darti qualche dritta, ma essendo Head of Dev purtroppo mi sto portando anche tanto lavoro a casa
Grazie sinceramente sono una persona ambiziosa ma tutte le domande che pongo poca gente sa rispondermi tecnicamente per darmi una soluzione. "Non v'è lo avrei chiesto se ci fosse riuscito da solo" le mie competenze valgono quanto un qualsiasi di voi altri, per dire che tanti distribuiscono solo buoni consigli ma poi sono alla pari di me, non sanno dare la soluzione in quel momento. Ma il rapporto comunicativo conta moltissimo e ci sta che uno voglia negare il fatto che non ha la soluzione subito da dirti. Infatti ringrazio moltissimo @ilfe98 perché suggerisce soluzioni non consigli. Daltro canto non ti circonderai mai di persone che sanno solo soluzioni perché appunto ciò che maggiormente conta è scambiare parole con la parte e non pretendere. Non vuole offendere nessuno questa critica.
Sinceramente ambisco a essere software architect ma mi rendo conto che non sono nato con queste capacitá.
Ho un po' di esperienza lavorativa in DBA quasi 5 anni, volevo sfruttare il Cloud in questo ramo dell' informatica per un ritorno di immagine e competenze. Sono d'accordo con @Skills07 il Cloud è delle grosse aziende, ha poco senso farsi un Cloud infrastrutturale in casa, conviene più comprarsi un Cloud privato già fatto sì sperimenta,si perché il mio obiettivo era acquisire le conoscenze ma senza dare 100 euri per AWS solo per il gusto di imparare ma la spesa è tale anche se provi da te a mettere su il Cloud con openstack.
Il software che devo fare non ha nullo di complesso si riesce a fare tranquillamente in MVC ma ho obbligo di creare un architettura basata su MVC che rispetti i design pattern studiati a lezione e non. Quindi se qualcuno sa dirmi come applicare un Anti pattern di composizione( Aggregazione ) Altrimenti io pensavo mi creo le associazioni tra scheda - candidato, scheda - gruppo, scheda - lista, lista - gruppo, lista - candidato, candidato - lista. Così in base all esigenza ho una associazione diretta di distanza pari a 1.